functionhookTest2(){ Java.perform(function(){ //根据导出函数名打印地址 var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"); if(helloAddr != null){ Interceptor.attach(helloAddr,{ //onEnter里可以打印和修改参数 onEnter: function(args){ //args传入参数 varJNIEnv = Java.vm.getEnv(); var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString(); console.log("参数:", originalStrPtr); var modifiedContent = "至尊"; var newJString = JNIEnv.newStringUtf(modifiedContent); args[2] = newJString; }, //onLeave里可以打印和修改返回值 onLeave: function(retval){ //retval返回值 var returnedJString = Java.cast(retval, Java.use('java.lang.String')); console.log("返回值:", returnedJString.toString()); varJNIEnv = Java.vm.getEnv(); var modifiedContent = "无敌"; var newJString = JNIEnv.newStringUtf(modifiedContent); retval.replace(newJString); } }) } }) }
3. 获得so基址
1 2 3
var moduleAddr1 = Process.findModuleByName("lib52pojie.so").base; var moduleAddr2 = Process.getModuleByName("lib52pojie.so").base; var moduleAddr3 = Module.findBaseAddress("lib52pojie.so");
4. Hook未导出的函数
地址计算
安卓里一般32 位的 so 中都是thumb指令,64 位的 so 中都是arm指令
通过IDA里的opcode bytes来判断,arm 指令为 4 个字节(options -> general -> Number of opcode bytes (non-graph) 输入4)
thumb 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移 + 1 arm 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移