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