下面内容均已Android为主,环境搭建参考
框架
普通
import frida
import sys
def on_message(message, data):
print(message)
dev = frida.get_remote_device()
# 需要hook的应用包名
session = dev.attach('com.gotokeep.keep')
# hook代码的核心部分
jscode = """
Java.perform(function () {
// hook的类
var b0 = Java.use('l.q.a.y.p.b0');
// hook的方法
b0.a.overload("java.lang.String").implementation = function(){
// 获取方法入参
var args = arguments[0];
// 打印log
send("字符串转MD5 b0.a args:"+args);
// 根据需要返回结果,这里使用this调用原方法
return this.a(args);
}
});
"""
script = session.create_script(jscode)
script.on('message', on_message)
script.load()
sys.stdin.read()
在python文件中写入上面文件,执行该文件即可。
运行时如果报错,建议检查下手机端frida-server是否运行,是否进行了端口映射,详见Frida环境搭建
人性化
对于上面的方法,hook代码部分需要是字符串的形式,对于我这种习惯了用ide提示的人,简直太不友好了,大大降低了ide的作用。不过不要慌,frida-agent-example了解一下?
这是一个能让你使用TypeScript语法编写hook代码的脚手架,工程结构并不复杂,clone到本地之后,先使用npm命令安装下依赖
npm install
会有一个如下的工程目录结构
其中index.ts文件便是编写hook代码的地方
如果想自定义文件名称或者路径,可以在package.json中修改目录指向
然后执行如下命令就可以进行hook了
# 将ts代码转换为js
npm run build
# 将代码注入
frida -U -f android应用包名 --no-pause -l _agent.js
为了方便起见可以在终端执行如下命令,检查代码有变更后自动build并注入
npm run watch
常用方法
方法hook
Java.perform(function () {
// hook的类
var b0 = Java.use('l.q.a.y.p.b0');
// hook的方法,如果有重载方法也通过overload中的参数区分
b0.a.overload("java.lang.String").implementation = function(){
// 获取方法入参
var args = arguments[0];
// 打印log
send("b0.a args:"+args);
// 根据需要返回结果,这里使用this调用原方法
return this.a(args);
}
});
构造方法hook
变量hook
静态变量hook
Java.perform(function () {
var CrypLib = Java.use('com.gotokeep.keep.common.utils.CrypLib');
CrypLib.a.overload("java.lang.String").implementation = function(){
var arg = arguments[0];
send("静态变量a:"+CrypLib.a.value);
return this.a(arg);
}
});
native方法hook
持续更新中