主动调用函数

xiaoeryu Lv5

本章主要内容:

主动调用类函数

  1. 使用java反射完成对类函数的调用
  2. 使用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主动调用静态/非静态函数

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

调用已经有实例的类函数

  • 比如这些已经有实例的函数

    1. 对构造函数进行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);
                      }
                  });
      
    2. 通过对类中非静态函数的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);
                      }
                  });
      

执行结果

总结:

对于类中的静态函数,直接调用即可

对于非静态函数,需要先得到类的实例,然后才能完成调用

附件:

HookActiveInvoke

  • 标题: 主动调用函数
  • 作者: 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 进行许可。
评论