主动调用函数

本章主要内容:
主动调用类函数
- 使用java反射完成对类函数的调用
- 使用Xposed的API完成对类函数的调用
通过java反射的方式主动调用
主动调用静态函数
目标app的两个静态函数

在Xposed01项目中新建一个Class来进行主动调用:使用java反射的方式来主动调用

- 调用成功,需要注意的是在调用private函数的时候注意要取消权限检查
主动调用非静态函数
目标app的两个非静态函数

同样使用java反射的方式来调用
对于类的非静态函数,需要先创建类的实例然后通过实例来调用非静态方法
Method publicFunc_method = StuClass.getDeclaredMethod("publicFunc", String.class, int.class);
- 获取静态方法
// public Student(String name, String id){
// this.name = name;
// this.id = id;
// }
Constructor StuCon = StuClass.getDeclaredConstructor(String.class, String.class);
Object StuObj = StuCon.newInstance("InstanceByXposed", "3000");
- 使用反射获取构造函数,然后通过
newInstance
方法创建一个类的实例,传入构造函数所需要的参数
publicFunc_method.invoke(StuObj, "publicFuncinvokeedByLSPosed", 1111);
- 然后通过这个实例来调用非静态方法

- 分别调用了公有的和私有的非静态方法
- 调用私有的非静态方法还是需要注意要取消权限检查
- 另外函数的返回值也是可以在这里打印出来的
通过Xposed自带的方法进行主动调用

Xposed提供了两组方法来进行主动调用:第一种用于非静态函数调用第二种用于静态函数调用
这两种调用方式的参数略有不同:其中一种调用方式传参方式需要传入参数类型数组,另一种调用方式不需要传入,调用结果没有什么区别
查看源码的实现
callStaticMethod

callMethod

- 可以看到这两个函数都有两种传参方式
- 在函数内部最终都调用了
findMethodBestMatch
findMethodBestMatch

- 三个参数的会根据我们传入的参数类型,在内部调用
getParameterTypes
帮我们生成类型数组

- 这段方法的作用也在源码的注释中写的很清楚Look up a method in a class and set it to accessible,在函数的内部调用了
setAccessible
来取消权限检查,所以我们就不需要再写取消的代码了 - 这里可以看到不论是三个参数还是四个参数的
findMethodBestMatch
最终都是调用了三个参数的findMethodBestMatch
Xposed主动调用静态/非静态函数

- 所以在这里我们只需要传入三个参数就可以了
- 都成功调用了,对静态和非静态函数的调用方式基本是相同的
调用已经有实例的类函数

比如这些已经有实例的函数
对构造函数进行hook,得到类的实例然后完成调用
// Student cStudent = new Student("xiaohua", "2023"); XposedHelpers.findAndHookConstructor(StuClass, String.class, String.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); XposedBridge.log("beforeHookedMethod->" + "name: " + param.args[0] + "---" + "id: " + param.args[1]); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Object cStudent = param.thisObject; XposedHelpers.callMethod(cStudent, "publicFunc", "publicFuncInvokeByLSPosed", 5050); XposedHelpers.callMethod(cStudent, "privateFunc", "privateFuncInvokeByLSPosed", 6060); } });
通过对类中非静态函数的hook,在这个非静态函数被调用的时候,拿到这个类的实例去完成调用
// public String getNickname() { // return nickname; // } XposedHelpers.findAndHookMethod(StuClass, "getNickname", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); Object obj=param.thisObject; XposedHelpers.callMethod(obj,"publicFunc","beforeHookedMethod publicfunc is called XposedHelpers.callMethod",444); XposedHelpers.callMethod(obj,"privateFunc","beforeHookedMethod privatefunc is called XposedHelpers.callMethod",333); XposedBridge.log("getNickname is called beforeHookedMethod->"+obj); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Object obj=param.thisObject; XposedHelpers.callMethod(obj,"publicFunc","afterHookedMethod publicfunc is called XposedHelpers.callMethod",222); XposedHelpers.callMethod(obj,"privateFunc","afterHookedMethod privatefunc is called XposedHelpers.callMethod",111); XposedBridge.log("getNickname is called afterHookedMethod->"+param.thisObject); } });
执行结果

总结:
对于类中的静态函数,直接调用即可
对于非静态函数,需要先得到类的实例,然后才能完成调用
附件:
- 标题: 主动调用函数
- 作者: xiaoeryu
- 创建于 : 2023-12-15 22:02:09
- 更新于 : 2023-12-15 22:38:02
- 链接: https://github.com/xiaoeryu/2023/12/15/主动调用函数/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论