Xposed hook技術學習筆記
最近做一個安卓apk的逆向,需要用到xposed 中的hook技術,所以便學習了一下,在此紀錄一下。
demo:apk用的是非蟲大神的一個demo例子:crackme02
首先需要在manifest中填寫三段
<!--新增標識-->
<meta-data
android:name="xposedmodule"
android:value="true"/>
<!--載入Hook模組之後顯示的資訊-->
<meta-data
android:name="xposeddescription"
android:value="Xposed Demo For Hook !" />
<!--規定jar包的版本資訊-->
<meta-data
android:name="xposedminversion"
android:value="30" /> //網上的例子中此處一般為54,這是支援的最低的xposedbridge.jar的版本,由於新版的xposed框架不是用好用,很多人還在用2.5.1版本,該版本框架用的是較低版本xposedbridge.jar.所以還是改一下吧。
接下來就是指定入口,在assets下建立一個名為xposed_init檔案 輸入apk包名及實現的類名。這裡我們新建一個類名為:Module
下面開始實現這個類
首先指定需要hook的函式所在的activity,其次獲取需要hook的函式名。廢話不多說,如下所示。
if (lpparam.packageName.equals("com.droider.crackme0201")){
XposedBridge.log("Loaded App:" + lpparam.packageName);
//查詢要Hook的函式
XposedHelpers.findAndHookMethod(
"com.droider.crackme0201.MainActivity", //被Hook函式所在的類com.droider.crackme0201.MainActivity
lpparam.classLoader,
"checkSN", //被Hook函式的名稱checkSN
String.class, //被Hook函式的第一個引數String
String.class, //被Hook函式的第二個引數String
new XC_MethodHook(){
@Override
protected void beforeHookedMethod(MethodHookParam param)
throws Throwable {
// Hook函式之前執行的程式碼
//傳入引數1
XposedBridge.log("beforeHookedMethod userName:" + param.args[0]);
//傳入引數2
XposedBridge.log("beforeHookedMethod sn:" + param.args[1]);
//函式返回值
XposedBridge.log("beforeHookedMethod result:" + param.getResult());
}
@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
// Hook函式之後執行的程式碼
//通過對checkSN函式的分析發現,只要修改函式的返回值即可實現註冊的破解
param.setResult(true);//改變返回值
//傳入引數1
XposedBridge.log("afterHookedMethod userName:" + param.args[0]);
//傳入引數2
XposedBridge.log("afterHookedMethod sn:" + param.args[1]);
//函式返回值
XposedBridge.log("afterHookedMethod result:" + param.getResult());
}
});
}
主要是afterhookedmothod函式,這個函式實現了對函式返回值的更改,即將返回值改為了true。因為我們通過分析非蟲大神的demo可知,checksn這個函式是對輸入進行校驗,如果正確則返回true。所以只要修改了返回值,則可以成功註冊。
這是一種不改變apk原始碼的情況下而影響apk執行結果的方法,應該算是apk動態除錯的一種重要方法,剛剛入了個門,以後有更多的見解還會繼續分享。