一、 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); } @Override public 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, //ClassLoader mStrMethodName, //目标函数名 "[[Ljava.lang.String;", //参数 1 Map, //参数 2 Map, //参数 3 Map, //参数 4 ArrayList, //参数 5 ArrayList, //参数 6 ArgClass, //参数 7 new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); //这个函数会在被 hook 的函数执行前执行 LOGI("beforeHook"); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param);//这个函数会在被 hook 的函数执行后执行 LOGI("afterHooke param: "); } }); } } }
这样就可以找到该参数的类了