当前位置: 首页 > 工具软件 > YAHFA > 使用案例 >

YAHFA hook的简单实例 ,hook自己的android应用

墨承泽
2023-12-01

android有很多hook框架,原理都是大同小异。本文是使用YAHFA。
YAHFA 的github地址:https://github.com/PAGalaxyLab/YAHFA

一 、准备工作

  项目的build.gradle中添加mavenCentral()

buildscript {
    repositories {
        mavenCentral()
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}

  model的build.gradle添加引用

dependencies {
    implementation 'io.github.pagalaxylab:yahfa:0.10.0'
}

做好上面两步就可以接着开发了。

二、HookMain.hook方法
本文的例子中,只需要用到HookMain.hook这一个方法。

HookMain.hook(Method target, Method hook)

需要传入两个method参数,“Method target”是想要hook的方法,“Method hook”是想要真正运行的方法。
举例:
Log.i(String, String)的作用是打印一行日志

Log.i("hook", "aaaaaaa");

输出: I/hook: aaaaaaa

但是如果我创建一个"i"方法,将系统提供的Log.i(…)替换掉,那么在应用任何地方调用log.i都会执行我创建的方法,而不是系统方法。
首先,我照着Log.i也创建一个“i”方法,同样是static修饰,但是里面不用log输出日志了,而是用System.out.println输出日志:

    public static int i(String s1,String s2){
        System.out.println("hook 哈哈哈");
        return 0;
    }

然后hook掉原方法,使用反射取出method传入HookMain.hook中:

	try {
            //取出系统方法
            Class logClass = Log.class;
            Method target = logClass.getDeclaredMethod("i", String.class, String.class);
            //取出创建的i方法
            Class mclass = MainActivity.this.getClass();//新创的“i”方法的类。这里我是放到MainActivity中的
            Method hook = mclass.getDeclaredMethod("i", String.class, String.class);

            HookMain.hook(target,hook );

        } catch (Exception e) {
            e.printStackTrace();
        }

执行完这一步后,就已近hook成功了。再次调用Log.i("hook", "aaaaaaa")看控制台结果:

执行:Log.i(“hook”, “aaaaaaa”)`
输出: I/System.out: hook 哈哈哈

 类似资料: