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 哈哈哈