hook Java函数例子
setImmediate(function () {
Java.perform(function () {
var MainActivity = Java.use('com.example.MainActivity');
// Hook Java 方法
MainActivity.foo.implementation = function (str) {
// 调用方法
var ret = this.foo(str);
console.log('Return value:', ret);
// 返回
return ret;
};
})
})
setImmediate(function () {
Java.perform(function () {
const nativeFuncAddr = Module.findExportByName(null, 'nativeFunc');
// Frida Gadget
Interceptor.attach(nativeFuncAddr, {
onEnter: function(args) {
// 输出函数的参数
console.log('nativeFunc(' + args[0] + ', ' + args[1] + ')');
// 修改参数
args[0] = ptr('0x1234');
args[1] = ptr('0x5678');
},
onLeave: function(retval) {
// 输出函数的返回值
console.log('returned: ' + retval);
}
});
})
})
区别:
Spawn 模式启动方式:frida -U {package} -l xxx.js
Attach 模式启动方式:$ frida -U -l xxx.js -f {package}
其中,frida gadget会在目标进程中生成一个so文件;
在生成frida gadget的同时,同样也会在目标应用中生成一个json文件,名字一般为:frida-gadget.json
;
这个JSON文件中包含了一些关于Gadget的元数据信息,比如应用的包名、Gadget的版本号、Gadget启动时需要加载的库文件、被Gadget hook的函数列表等等;
这些信息可以被Frida客户端读取并解析,以便于正确地加载和运行Gadget。在一些情况下,我们也可以修改这个JSON文件,以实现一些更高级的功能,例如修改Gadget版本号或者修改Gadget hook的函数列表。
{
"entrypoint": "module_initialize", // gadget的入口函数名
"auxiliary": [ // 辅助模块列表
"auxiliary_module1.js", // 第一个辅助模块
"auxiliary_module2.js" // 第二个辅助模块
],
"android": { // Android平台的配置
"package_name": "com.example.app", // 目标应用的包名
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"spawn": true, // 是否在目标应用启动时自动启动gadget
"debug": true // 是否输出gadget的日志信息
},
"ios": { // iOS平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"spawn": true, // 是否在目标应用启动时自动启动gadget
"debug": true // 是否输出gadget的日志信息
},
"linux": { // Linux平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"debug": true // 是否输出gadget的日志信息
},
"macos": { // macOS平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"spawn": true, // 是否在目标应用启动时自动启动gadget
"debug": true // 是否输出gadget的日志信息
},
"windows": { // Windows平台的配置
"use_frida_gadget": true, // 是否使用Frida Gadget模式
"debug": true // 是否输出gadget的日志信息
}
}