一、 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: ");}});}}}这样就可以找到该参数的类了
新闻热点
疑难解答