Xposed框架Hook相关api的使用
首先创建测试类继承IXposedHookLoadPackage, 以下所有的hook方法都在handleLoadPackage方法内部进行调用
1 | public class HookTest implements IXposedHookLoadPackage { |
准备需要被hook的代码用于测试
1 | public class HookDemo { |
- 修改类中的私有静态变量
1 | Class<?> clazz = XposedHelpers.findClass("com.example.xposedhooktarget.HookDemo", lpparam.classLoader); |
- Hook无参构造函数
1 | Class<?> clazz = XposedHelpers.findClass("com.example.xposedhooktarget.HookDemo", loadPackageParam.classLoader); |
- Hook有参构造函数,并修改参数
1 | XposedHelpers.findAndHookConstructor(clazz, String.class, new XC_MethodHook() { |
- Hook公有方法publicFunc,并修改参数以及修改下publicInt和privateInt的值,再顺便调用一下隐藏函数hideFunc
1 | XposedHelpers.findAndHookMethod(clazz, "publicFunc", String.class, new XC_MethodHook() { |
- Hook私有方法privateFunc,并修改参数
1 | XposedHelpers.findAndHookMethod(clazz, "privateFunc", String.class, new XC_MethodHook() { |
- Hook私有静态方法staticPrivateFunc, 并修改参数
1 | XposedHelpers.findAndHookMethod(clazz, "staticPrivateFunc", String.class, new XC_MethodHook() { |
- Hook复杂参数函数complexParameterFunc
1 | Class fclass1 = XposedHelpers.findClass("java.util.Map", loadPackageParam.classLoader); |
- Hook私有方法repleaceFunc, 并替换打印内容
1 | XposedHelpers.findAndHookMethod(clazz, "repleaceFunc", new XC_MethodReplacement() { |
- Hook方法, anonymousInner, 参数是抽象类,先加载所需要的类即可
1 | Class animalClazz = loadPackageParam.classLoader.loadClass("com.example.xposedhooktarget.Animal"); |
- Hook匿名类的eatFunc方法,修改参数,顺便修改类中的anonymoutInt变量
1 | XposedHelpers.findAndHookMethod("com.example.xposedhooktarget.HookDemo$1", clazz.getClassLoader(), |
- Hook内部类InnerClass的InnerFunc方法,修改参数,顺便修改类中的innerPublicInt和innerPrivateInt变量
1 | final Class<?> clazz1 = XposedHelpers.findClass("com.example.xposedhooktarget.HookDemo$InnerClass", loadPackageParam.classLoader); |
- 对于一些延迟动态加载的代码,hook方式
1 | XposedHelpers.findAndHookMethod("dalvik.system.DexFile", lpparam.classLoader, "loadClass", |
- Hook有可变参数的方法
1 | XposedHelpers.findAndHookMethod(clazz, "argFunc", Object[].class,new XC_MethodHook() { |
总结
无论hook公有私有方法还是静态方法 ,抑或可变参方法,甚至是带返回值的方法,统一使用
findAndHookMethod
这个Apixposed无法hook接口和抽象类方法
Hook逻辑类可实现的接口有 :
安卓系统启动的时候(使用 IXposedHookZygoteInit 接口)、
一个新的app被加载的时候(使用 IXposedHookLoadPackage 接口)、
一个资源被初始化的时候( 使用 IXposedHookInitPackageResources 接口 )
实现IXposedHookLoadPackage 并使用 XposedBridge.log 打印的日志,当启动第三方应用后,Android Studio控制台无法查看到日志信息,需要在xposed应用内进行查看
参数为基本数据类型时需要传对应包装类的type属性,比如int传Integer.TYPE, 否则提示找不到方法,如果参数为引用数据类型,那直接传xxx.class即可
beforeHookedMethod 会在调用原方法前执行,如果使用setResult则跳过原方法,并返回setResult参数中的值。
afterHookedMethod 会在调用原方法后执行,setResult可改变返回值
replaceHookedMethod 会完全替换原方法,即原方法不执行,且返回值可以直接return,setResult不生效。
注:每次修改完毕后需要重启才生效
附
Hook 修改方法返回值
1 | XposedHelpers.findAndHookMethod(clazz, method, new Object[]{new XC_MethodHook() { |
Hook 获取方法返回值
1 | XposedHelpers.findAndHookMethod(clazz, method, new Object[]{new XC_MethodHook() { |
Hook 获取方法传入的参数值
1 | XposedHelpers.findAndHookMethod(claName, cl, "i", String.class, String.class, Object[].class, new XC_MethodHook() { |
Hook 给方法传值
1 | Class cla = XposedHelpers.findClass(className, loadPackageParam.classLoader); |
Hook 获取Intent的值
1 | private void hookGetIntent(XC_LoadPackage.LoadPackageParam loadPackageParam) { |
Hook 广播发送的Intent信息
1 | private void hookSendBroadcast(XC_LoadPackage.LoadPackageParam loadPackageParam) { |
Xposed一般Hook的是默认的dex文件,但是现在很多的APP都有多个Dex文件,所以使用Xposed时,经常遇到类名路径正确却出现ClassNotFoundError找不到类的错误。要解决这个问题,需要获取对应Dex文件的上下文环境。
Android在加载dex文件后会创建一个Application类,然后会调用attach方法,attach方法的参数就是上下文context,而且attach方法是final方法,不会因为被覆盖而hook不到,拿到这个context就可以获取对应的classload,然后就可以顺利hook到multidex的类了。
1 | XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { |
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站