env和env.handle

这两个在一定程度上可以通用,或者可以说会完成自动转换,使用Frida封装的JNI相关API,必须使用env,当参数需要JNIEnv*时,可以使用envenv.handle

1
2
3
var env = Java.vm.tryGetEnv();
// handle可以理解为env的内存地址
env.handle;

打印so层函数栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var soAddr = Module.findBaseAddress("libxiaojianbang.so");
var updateAddr = soAddr.add(0x21B0);
Interceptor.attach(updateAddr, {
onEnter: function (args) {
// .map是js里的方法,相当于把Thread.backtrace(this.context, Backtracer.ACCURATE的结果丢给.map去操作
// .map的参数是一个函数,和下面不写注释的写法是一样的
//console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');
console.log("==================================================");
console.log(soAddr);
console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(function (value) {
// 对map的参数函数加以改造,可以打印出目标so文件的函数栈以及相对偏移
var symbol = DebugSymbol.fromAddress(value);
console.log(symbol.moduleName);
if(symbol.moduleName === "libxiaojianbang.so") {
return symbol + " offset: " + value.sub(soAddr);
}
return symbol;
}).join('\n'));
}, onLeave: function (retval) {

}
});

注意打印出的函数地址是实际执行的汇编代码的下一行指令的地址