function main(){
Java.perform(function() {
//这个API可以枚举被加载到内存的modules。
console.log(JSON.stringify(Process.enumerateModules()));
//来查找要hook的函数所在的so的基地址,如果找不到就返回null。
const lib_arr=Module.findBaseAddress("libnative-lib.so")
console.log("libnative-lib.so基地址是",lib_arr)
if(lib_arr){
//来查找导出函数的绝对地址
const myfirstJNI = Module.findExportByName("libnative-lib.so","Java_com_example_demoso1_MainActivity_myfirsyjniJNI")
console.log("myfirstJNI函数地址",myfirstJNI);
const offset = myfirstJNI-lib_arr
//偏移量=函数的地址-so文件的基址,这个偏移量就是ida需要搜的
console.log(offset,"0x"+offset.toString(16));
//如果没有循环调用它,就需要主动去触发了
//找到地址之后,就可以拦截function/instruction的执行。
Interceptor.attach(myfirstJNI, {
onEnter: function (args) {
console.log("myfirstJNI args: " + args[0], args[1], args[2])
//另外为了将jstring的值打印出来,可以使用jenv的函数getStringUtfChars
console.log(Java.vm.getEnv().getStringUtfChars(args[2], null).readCString())
},
onLeave: function (retval) {
console.log("retval:", retval)
console.log(Java.vm.getEnv().getStringUtfChars(retval, null).readCString())
var newRetval = Java.vm.getEnv().newStringUtf("new retval from hook_native");
retval.replace(ptr(newRetval));
}
})
}
var symbols = Process.findModuleByName("libssl.so").enumerateSymbols();
for(var i = 0;i<symbols.length;i++){
var symbol = symbols[i].name;
console.log("symbol",symbol,"address",symbol.address)
}
})
}
setImmediate(main)