AS 3.0.1 編寫 Xposed 插件入門記錄

最近一直在捯飭 IOT 物聯網中智能門鎖的研究,因為要逆向安卓方面的APP,而安卓的 APP 很多都是經過加殼處理過,因此脫殼成為了必經之路。xposed 框架是非常流行的安卓下進行 HOOK APP 分析的主流框架。如何基於 Xposed 進行插件開發?參考網路上的資料發現,很多內容包括2017年的資料也存在老舊的情況,經過一系列的參考資料和動手實踐之後,可以在最新版的 Android studio 下進行 Xposed demo版本的開發。以下就是大致過程的記錄。

各種環境信息和相關配置

操作系統

  • windows7 & windows 10
  • Android studio 3.0.1

手機

小米 MAX2 未root

Xposed

使用軟體是 VirtualXposed,方便未root的手機進行HOOK。

下載並配置NDK

下載

xposed 插件的開發中,經常會使用到NDK進行 .so 模塊的編寫,所以 NDK 有必要進行下載和配置

下載鏈接為:

dl.google.com/android/r

win7和win10都是64位系統,32位系統需要使用:

dl.google.com/android/r

引用頁面:

developer.android.google.cn

同時也又 Linux 和 MacOS 版本,各下所需即可。

下載完成的ndk解壓到D盤並重名為 d:
dk-bundle,

配置

添加系統環境變數,path中添加 d:
dk-bundle,路徑中不要出現空格和中文。

顯示如圖顯示NDK已經安裝成功:

Android studio 中"文件"-"項目結構",SDK Location 中配置 NDK的目錄:

配置完成之後在項目工程中 "local.properties",可以看到ndk的目錄:

#Tue Mar 27 10:35:45 CST 2018ndk.dir=d:\ndk-bundlesdk.dir=C:\Users\admin\AppData\Local\Android\Sdk

新建 Android 工程

新版本的 NDK 不再支持舊版本下的某些使用方式,如果使用舊版本的一些配置,會出現各種各樣的報錯,google和百度上也很難搜索到正確的答案,非常的浪費精力,大家看下過程也可以節省時間。

採取的思路是先創建一個包含有 .so 模塊的 Android 工程,再行配置為 Xposed 模塊,一舉兩得。

新建一個 android 工程,命名為 HookDemo,需要勾選 include C++ support,這樣就可以編寫C++代碼。

後面的配置中需要支持C++11 標準,原因是某些特定的庫需要支持,比如<stdint.h>

與默認配置之間的區別是:

cmake {cppFlags "-std=c++11"}

完成之後直接進行編譯,成功後可以觀察到在工程目錄下有 native-lib.so 文件,安裝生成好的APP到手機上,就可以觀察到效果:

驗證下:

#include <jni.h>#include <string>extern "C"JNIEXPORT jstringJNICALLJava_com_xposed_hookdemo_MainActivity_stringFromJNI(JNIEnv #env,jobject /# this #/) { std::string hello = "Hello from C++"; //與app頁面一致 return env->NewStringUTF(hello.c_str());}

觀察工程可以發現工程結構:

MainActivity 中載入並調用so模塊中的函數

public class MainActivity extends AppCompatActivity {// Used to load the native-lib library on application startup.static {System.loadLibrary("native-lib"); //載入so模塊}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Example of a call to a native methodTextView tv = (TextView) findViewById(R.id.sample_text);tv.setText(stringFromJNI()); //調用so函數}/### A native method that is implemented by the native-lib native library,# which is packaged with this application.#/public native String stringFromJNI(); //聲明 native 函數}

配置支持 Xposed 模塊

通過上述的方法之後,可以很快的創建針對so模塊的初始化工程,節省很多時間。

相關的代碼在cpp目錄下,剩下的工作就是配置工程為 Xposed 模塊。

下載&配置 Xposed api

bintray.com/rovo89/de.r 中下載兩個 xposed API,

api-82-sources.jar,api-82.jar,拷貝兩個文件到

..HookDemoapplibs 目錄下,在jar文件上右鍵選擇"As a Library",之後選擇確定。

..HookDemoappuild.gradle 文件可以看到包含進去了兩個jar文件。

修改 dependencies

修改依賴方式 compile files 修改為 provided files, 修改 ..HookDemoappuild.gradle 中的 dependencies 選項:

把 implementation 修改為 provided,最終如下:

dependencies {provided fileTree(include: [#.jar], dir: libs)implementation com.android.support:appcompat-v7:26.1.0implementation com.android.support.constraint:constraint-layout:1.0.2testImplementation junit:junit:4.12androidTestImplementation com.android.support.test:runner:1.0.1androidTestImplementation com.android.support.test.espresso:espresso-core:3.0.1provided files(libs/api-82-sources.jar)provided files(libs/api-82.jar)}

修改 AndroidManifest.xml 文件

需要 AndroidManifest.xml 添加三個 meta-data 屬性:

<!-- 是否是xposed模塊,xposed根據這個來判斷是否是模塊 --><meta-dataandroid:name="xposedmodule"android:value="true" /><!-- 模塊描述,顯示在xposed模塊列表那裡第二行 --><meta-dataandroid:name="xposeddescription"android:value="HookDemo" /><!-- 最低xposed版本號(lib文件名可知) --><meta-dataandroid:name="xposedminversion"android:value="53" />

引用自:blog.csdn.net/niubitian

編寫 HOOK 類代碼

..CodeHookDemoappsrcmainjavacomxposedhookdemo 目錄下新建一個類:HookMain ,代碼如下:

新建一個類,然後在 .assetsxposed_init 中的代碼指向了HookMain,就不用直接修改MainActivity 的代碼,代碼結構會相對應清晰。

package com.xposed.hookdemo;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XposedBridge;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.callbacks.XC_LoadPackage;/### Created by Weiya on 2018/3/27.相關的 xposed hook代碼都在這裡編寫#/public class HookMain implements IXposedHookLoadPackage { @Override //重寫了 handleLoadPackage 方法 public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {XposedBridge.log("load app: " + loadPackageParam.packageName);//顯示載入的 app 名稱 }}

創建 xposed_init

xposed_init 文件是 Xposed 模塊的入口文件,Xposed 就是通過該文件找到對應的函數入口。

AS工程 app目錄下右鍵,新建-folder-assets:

新建 xposed_init,以文本格式打開,輸入指定的 Hook 入口:

com.xposed.hookdemo.HookMain

生成apk並測試

完成以上的操作後,生成APK測試一下。把..HookDemoappuildoutputsapkdebugapp-debug.apk上傳到手機中

# adb push 本地目錄 手機目錄

通過virtualXposed 中的 xposed 安裝程序,找到HookDemo.apk 並進行安裝,成功之後,就會在VirtualXposed 模塊頁面中顯示我們創建的HookDemo模塊,

打開一個 xposed中安裝的APP後,觀察其中的日誌,可以看到相關的日誌記錄。

到此說明 模塊創建和配置完成。剩下的就是調用 so模塊中代碼,先來簡單一點的:直接使用AS默認生成的代碼。

添加針對 .so模塊的調用

整個Xposed 模塊工程其實是不需要 MainActivity 代碼的,所以其中只有參考成分。剩下的工作是在編寫相應的C++ 代碼。

..HookDemoappsrcmaincpp
ative-lib.cpp 中添加針對 HookMain 類的導出函數。

extern "C"JNIEXPORT jstringJNICALLJava_com_xposed_hookdemo_HookMain_stringFromJNI2( //HookMain 指對應HookMain 這個java類JNIEnv #env,jobject /# this #/) { std::string hello = "Hello from stringFromJNI2"; return env->NewStringUTF(hello.c_str());}

編譯為APK後進行測試,結果如圖:

參考資料

  • Android NDK開發之從環境搭建到Demo級十步流
  • cnblogs.com/guanmanman/
  • 基於dalvik模式下的Xposed Hook開發的某加固脫殼工具
  • blog.csdn.net/QQ1084283

本文由看雪論壇 仙果 原創 轉載請註明來自看雪社區

往期熱門閱讀:

  • 看雪學院招募看雪講師
  • 談談vmp的還原
  • 碼圖並茂紅黑樹
  • 談談vmp的還原
  • 教你如何反編譯微信小程序
  • 換一個帥一點姿勢實現DexHunter

關注看雪學院公眾號ikanxue.com,收貨更多乾貨哦!

推薦閱讀:

在不熟悉C/C++情況下,hook windows事件
用戶模式下基於異常和內核控制的線程級鉤子技術分析
淺談android hook技術

TAG:XposedFramework | 插件 | Hook |