首页 > 系统 > Android > 正文

Android xposed hook使用总结

2019-11-09 15:02:40
字体:
来源:转载
供稿:网友

一、 HOOK java层函数的三要素获取:   目标类路径、 函数名、参数 。

二、插件开发步骤 1. 以 导入 lib文件 XposedBridgeApi-54.jar(不参与编译到最终文件中) 且用AS 开发的你千万不要将其放在libs

目录中,否则你会发现你的插件安装上却一直没有运行起来的尴尬情况 

AS中可以在配置文件配置 :

PRovided 'de.robv.android.xposed:api:53'provided 'de.robv.android.xposed:api:53:sources'
2. 在 AndroidManifest.xml 中添加框架信息:<application><meta-data android:name="xposedmodule" android:value="true"/><meta-data android:name="xposeddescription" android:value="这里填写模块说明信息"/><meta-data android:name="xposedminversion" android:value="42"/></application> 
3.编写响应类并实现类 IXposedHookLoadPackage 接口 handleLoadPackage 函数方法: 在 handleLoadPackage 函数的 findAndHookMethod 方法我们要提供 HOOK 目标的信息,参数为(类全路径,当前的 CLASSLOADER,HOOK 的函数名,参数 1 类类型...参数 N 类类型, XC_MethodHook 的回调) 
XposedHelpers.findAndHookMethod(类全路径, loader, 方法, 参数, new XC_MethodHook(){
......}
callMethod(类对象, 执行的方法,参数); // 主动执行想要hook的方法
Object activityThread = callStaticMethod(findClass("android.app.ActivityThread", null), "currentActivityThread");
4. 将响应类添加到框架启动文件 新建 assests 文件夹, 并在其中新建 xposed_init 文件,写入插件入口类的信息 
5. 安装我们的插件设置启用,并在机器重启后插件生效 
=================================================================================================================
以上步骤就可以完成简单的对app的hook了,但是对于某些参数例如 String[][] strAry, Map mp1, Map<Integer, String> mp3,ArrayList<String> al1, ArgClass ac 这些该怎么办呢?
用反射调用的方式 可以看出
String[][] ==> [[Ljava/lang/String;Map 数组不论何种形式 ==> Ljava/util/Map;ArrayList 无论何种形式 ==> Ljava/util/ArrayList;ArgClass ac 自定义类给个全路径的事==> Laqcxbom/xposedhooktarget/ArgClass; 
public class XposedMain implements IXposedHookLoadPackage{public String TAG = "AqCxBoM" ;private final String mStrPackageName = "aqcxbom.xposedhooktarget"; //HOOK APP 目标的包名private final String mStrClassPath = "aqcxbom.xposedhooktarget.MyClass";//HOOK 目标类全路径private final String mStrMethodName = "fun1"; //HOOK 目标函数名private void LOGI(String ct){ Log.d(TAG, ct); }@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {//判断包名是否一致if (loadPackageParam.packageName.equals(mStrPackageName)) {LOGI("found target: " + loadPackageParam.packageName);final Class<?> ArgClass= XposedHelpers.findClass("aqcxbom.xposedhooktarget.ArgClass", loadPackageParam.classLoader);final Class<?> ArrayList= XposedHelpers.findClass("java.util.ArrayList", loadPackageParam.classLoader);final Class<?> Map= XposedHelpers.findClass("java.util.Map", loadPackageParam.classLoader);//包名一致时查找是否有匹配参数的类及函数XposedHelpers.findAndHookMethod(mStrClassPath, //类路径loadPackageParam.classLoader, //ClassLoadermStrMethodName, //目标函数名"[[Ljava.lang.String;", //参数 1Map, //参数 2Map, //参数 3Map, //参数 4ArrayList, //参数 5ArrayList, //参数 6ArgClass, //参数 7new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param); //这个函数会在被 hook 的函数执行前执行LOGI("beforeHook");}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);//这个函数会在被 hook 的函数执行后执行LOGI("afterHooke param: ");}});}}} 
这样就可以找到该参数的类了  

 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表