最近在搞Android app逆向,需要对函数进行Hook以便了解到函数的输入与输出,由于自己刚刚接触xposed所以记录一下学习经验,有错误或者不妥之处请告诉我,大家共同进步。
- 使用Android Studio创建一个Android项目。项目目录
在AndroidManifest.xml中写入<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 告诉xposed这是一个xposed模块--> <meta-data android:name="xposedmodule" android:value="true" /> <!-- 关于这个模块的描述--> <meta-data android:name="xposeddescription" android:value="hook测试"/> <!-- 该模块支持的最低版本--> <meta-data android:name="xposedminversion" android:value="53" />
- 在app/src/main下创建assets目录并且右键选择Assets Folder
在改目录下新建文件xposed_init文件,作为整个xposed的入口
- 关于app/build.gradle的修改,抱歉时间太长我也给忘记改的哪个地方了,我把图贴出来自行对比一下.
- 编写hook代码
代码如下
此外还有一个beforeHookedMethod由于我没有用到所以先不列出以后用到再补充。package com.example.xposed_hook_test_11; import android.app.DownloadManager; import android.util.Log; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class HookTest implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { if (!lpparam.packageName.equals("app进程名")) { return; } XposedBridge.log("Loaded app: " + lpparam.packageName); XposedHelpers.findAndHookMethod("需要hook的包+类名", lpparam.classLoader, "函数名", String.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); } });
- 传参问题:在编写的时候我出现了一种情况包名+类名+方法名我都写对了但是就是hook不到,插了好久是因为我所hook的方法里面有传参,但是我在hook代码里面编写的时候并没有写参数,所以参数一定要跟源码中对应。
- 利用反射hook,native层面的方法。
final Class <?> testndk = XposedHelpers.findClass("包名1+类名1", lpparam.classLoader); //目前对于包名1与包名2两者需不需要一样或者有什么关系没有深入考虑,我的是不一样,也能用。 XposedHelpers.findAndHookMethod("包名2+类名2" ,lpparam.classLoader, "方法名",String.class,new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { Object testndkobject = testndk.newInstance(); Method mytest = XposedHelpers.findMethodBestMatch(testndkobject.getClass(), "native方法名",参数1,参数2); // 执行方法 byte [] str6 = (byte[]) mytest.invoke(testndkobject,参数1,参数2); } }); }
- 获取返回结果,获取传入参数
XposedHelpers.findAndHookMethod("包+类", lpparam.classLoader, "方法", String.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); // 获取返回结果 Object result = param.getResult(); XposedBridge.log("获取第一个参数"+(String) param.args[0]); } });
- 链接逍遥模拟器 cmd输入
adb connect 127.0.0.1:21503
- 运行项目即可进行hook,通过日志xposed日志可看打印结果
注意修改Xposed代码后需要重新启动Android才可以继续hook,也可以更改代码设置不用重启。
初次接触xposed,hook,Android逆向,如有任何问题欢迎加本人QQ:1005229608进行讨论。