
1.frida命令以启动app的方式注入frida脚本到app,并重定向输出日志到文件中
frida -U -f com.example.application -l script.js > script.log2.frida hook native jstring转成java.lang.String再打印
var str = Java.use("java.lang.String");
var s = Java.cast(retval, str);
console.log("onLeave NewString result is: " + s);3.frida hook native 未导出函数,打印寄存器的值 上下文:具有键pc和sp的对象,它们是分别为ia32/x64/arm指定EIP/RIP/PC和ESP/RSP/SP的NativePointer对象。其他处理器特定的键也可用,例如eax、rax、r0、x0等。也可以通过分配给这些键来更新寄存器值
var libxxxAddr = Module.findBaseAddress("libxxx.so");
var resultAddr = libxxxAddr.add(0x23AA);
console.log(resultAddr);
if(resultAddr != null){
Interceptor.attach(resultAddr ,{
onEnter:function (args){
console.log("hook result on enter");
console.log(this.context.x0);
},
onLeave:function (retval){
console.log("hook result on leave");
}
})
}4.frida hook native 函数参数包含(JNIEnv *, jobject)时打印参数要找后面的参数,比如下面函数
(JNIEnv_ *env, __int64 a2, __int64 a3, __int64 a4)
实际参数是a3、a4
打印时则
hexdump(args[2])
hexdump(args[3])
前面的env、jobject可不打印5.frida hook native 输出函数参数内存数据(16进制)
console.log("test str is: " + hexdump(args[1],{offset: 0,length: 40000,prefix: '[+] ',indent: 4,width: 32,uppercase: false,ansi: false}));6.frida hook native遍历导出函数
const hooks = Module.load('libxxx.so');
var Exports = hooks.enumerateExports();
for(var i = 0; i < Exports.length;i++){
//函数类型
console.log("type:",Exports[i].type);
//函数名称
console.log("name:",Exports[i].name);
//属于的模块
console.log("module:",Exports[i].module);
//函数地址
console.log("address:",Exports[i].address);
}7.frida hook native 打印指定变量内存数据
var dword_1A450Addr = libxxxAddr.add(0x1A0A0);
console.log("dword_1A010Addr is: " + hexdump(dword_1A450Addr));8.frida hook native函数堆栈调用
console.log('RegisterNatives called from:\\n' + Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\\n') + '\\n');