hook一般函数

xiaoeryu Lv5

对一般函数的hook流程和对构造函数的hook流程大致一样,Xposed不仅能对java函数进行hook也能对JNI函数进行hook

本章主要是对java中以下这几类一般函数进行hook

  1. 一般java函数的hook
  2. 内部类中的函数hook
  3. 匿名内部类函数的hook
  4. 类中JNI函数的hook

hook一般java函数

先创建一些一般函数等下用来测试hook

  • 例如这些,我们在Student这个Class中添加一些普通函数:公有的、私有的、静态的、非静态的

  • 然后再调用它们,打印显示一下

一般java函数的hook

测试这几种类型的函数:

publicStaticFunc

privateStaticFunc

publicFunc

privateFunc

运行hook代码,将其安装在手机上,可能会提示需要重启框架。测试的时候发现不重启其实也能正常运行

  • 跟之前hook构造函数的流程差不多,我们同样hook成功获得了目标函数的参数信息和返回值

  • 不同之处在于之前使用的是findAndHookConstructor,这里使用的是findAndHookMethod

  • 同样的,findAndHookMethod也有两种传参方式,一种是传入Class,另一种是直接传入类名字符串

    第一种传参:传入class

    第二中传参:直接传入类名字符串

跟之前同样的我们也可以在beforeHookedMethodafterHookedMethod里面修改函数的参数和返回值

内部类中的函数hook

在Student中添加一个内部类

  • 调用一下这个内部类并打印返回值

        public String publicFunc(String arg1, int arg2){
            String result = privateFunc("privateFunc", 300);
            person tmp = new person();
            String tmpName = tmp.getPersonName("lisi");
            return arg1 + "---" + arg2 + "---" + result + "---" + tmpName;
        }
    

内部类的类名编译后,会有所改变。可以使用GDA打开就可以看到内部类完整的类名

  • 拿到内部类的完整类名之后我们就可以跟前面的一样编写hook脚本

重新执行查看hook结果

  • 成功的拿到了参数和返回值

匿名内部类函数的hook

匿名内部类跟内部类是一样的,只是区别在于匿名内部类在编译的时候编译器会给它生成一个标号作为类名,同样的这种情况我们可以把apk或者dex拖到GDA中去查看它的完整类名

类中JNI函数的hook

对上图这种JNI函数的hook也是跟java函数同样的操作

public class HookJNI implements IXposedHookLoadPackage {
    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable{
        Log.i("Xposed01", loadPackageParam.packageName);
        XposedBridge.log("Xposed01->app packagename" + loadPackageParam.packageName);
        if (loadPackageParam.packageName.equals("com.kanxue.loaddex")){
            Class MainActivityClass = XposedHelpers.findClass("com.kanxue.loaddex.MainActivity", loadPackageParam.classLoader);

            XposedHelpers.findAndHookMethod(MainActivityClass, "onCreate", Bundle.class, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    super.beforeHookedMethod(param);
                    XposedBridge.log("beforeHookedMethod->onCreate: " + param.args[0]);
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    XposedBridge.log("afterHookedMethod->onCreate: " + param.thisObject);
                }
            });
        }
    }
}

总结:因为这些函数都是有ART产生的ArtMethod对象的,所以都可以用相同的方法hook。但是so文件中的函数没有ArtMethod,所以无法使用这种方法hook。

附件:

Hook Java

  • 标题: hook一般函数
  • 作者: xiaoeryu
  • 创建于 : 2023-12-13 15:08:22
  • 更新于 : 2023-12-15 22:38:00
  • 链接: https://github.com/xiaoeryu/2023/12/13/hook一般函数/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论