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的时候可以发现,改参数在返回的时候地址发生了变化。

posted @ 2021-10-27 15:06  公众号python学习开发  阅读(316)  评论(0编辑  收藏  举报