1. 程式人生 > >Xposed hook技術學習筆記

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動態除錯的一種重要方法,剛剛入了個門,以後有更多的見解還會繼續分享。