frida hook ollvm指令替换
function hook_java(){
Java.perform(function(){
});
}
function call_sign2(){
Java.perform(function(){
Java.choose("com.example.hellojni.HelloJni",{
onMatch:function(ins){
var result=ins.sign2("0123456789","abcdefg");
console.log("call sign2",result);
},onComplete:function(){
}
})
})
}
function main(){
// hook_java();
hook_native();
}
function hook_native(){
var sign2= Module.findExportByName("libhello-jni.so","Java_com_example_hellojni_HelloJni_sign2");
//jstring
console.log(sign2);
Interceptor.attach(sign2,{
onEnter:function(arg){
//GetStringUTFChars 和frida里的不太一样getStringUtfChars
console.log("sign2 str1",ptr(Java.vm.tryGetEnv().getStringUtfChars(arg[2])).readCString())
console.log("sign2 str2",ptr(Java.vm.tryGetEnv().getStringUtfChars(arg[3])).readCString())
},onLeave:function(retval){
console.log("sign2 retval",ptr(Java.vm.tryGetEnv().getStringUtfChars(retval)).readCString())
}
});
var base_hello_jni=Module.findBaseAddress("libhello-jni.so");
if(base_hello_jni){
// var sub_1DFB4 = base_hello_jni.add(0x1DFB4);
// Interceptor.attach(sub_1DFB4,{
// onEnter:function(arg){
// console.log("sub_1DFB4 onEnter",hexdump(arg[0]),"\n=======\n",hexdump(arg[1]));
// },
// onLeave:function(retval){
// console.log("sub_1DFB4 onLeave",hexdump(retval));
// }
// });
var sub_1E298 = base_hello_jni.add(0x1E298);
Interceptor.attach(sub_1E298,{
onEnter:function(arg){
console.log("sub_1E298 onEnter",hexdump(arg[0]),"\n=======\n",hexdump(arg[1]));
},
onLeave:function(retval){
console.log("sub_1E298 onLeave",hexdump(retval));
}
});
// var sub_1AB50 = base_hello_jni.add(0x1AB50);
// Interceptor.attach(sub_1AB50,{
// onEnter:function(arg){
// console.log("sub_1AB50 onEnter",hexdump(arg[0]),"\r\n",hexdump(arg[1]),arg[2]);
// },
// onLeave:function(retval){
// console.log("sub_1AB50 onLeave",hexdump(retval));
// }
// });
//找不到返回值的时候,看汇编代码,BL指令后面的函数可以尝试hook看下
var sub_1AB4C = base_hello_jni.add(0x1AB4C);
Interceptor.attach(sub_1AB4C,{
onEnter:function(arg){
//arg[1] 像是长度所以不用hexdump,arg[2] 在代码里使用的是指针类型,所以可以当返回值打印下。
this.arg2=arg[2]
console.log("sub_1AB4C onEnter",hexdump(arg[0]),"\n=======\n",arg[1],hexdump(this.arg2));
},
onLeave:function(retval){
//retval这里没有打印出东西,上面的arg2可能是返回值。
console.log("sub_1AB4C onLeave",hexdump(retval),"\n=======\n",hexdump(this.arg2));
}
});
var sub_171C4 = base_hello_jni.add(0x171C4);
Interceptor.attach(sub_171C4,{
onEnter:function(arg){
console.log("sub_171C4 onEnter",hexdump(arg[0]),"\n=======\n",hexdump(arg[1]));
},
onLeave:function(retval){
//retval和arg1的地址一样,所以这里不用打印arg1的了
console.log("sub_171C4 onLeave",hexdump(retval));
}
});
//sub_18490
}
}
setImmediate(main)
1.首先在ida中找到导出函数。将第一个参数修改为env,之后x看有哪些引用,找到对应的jni函数,然后frida调用
这里是ptr(Java.vm.tryGetEnv().getStringUtfChars(arg[2])).readCString()
。
2.hook native函数之前首先要知道函数的基地址, var base_hello_jni=Module.findBaseAddress("libhello-jni.so");
,然后使用 Interceptor.attach
进行对目标函数hook。
当ida里看不到函数的参数有其他地方的引用的时候,可以看看汇编代码附近的BL命令是什么函数,可能参数传到这里使用了。
如果ida看不到函数的返回值,看参数哪个是指针类型,这个参数可能就是返回值。 frida hook的时候可以发现,改参数在返回的时候地址发生了变化。