zoukankan      html  css  js  c++  java
  • 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]),"
    =======
    ",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]),"
    =======
    ",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]),"
    ",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]),"
    =======
    ",arg[1],hexdump(this.arg2));
                },
                onLeave:function(retval){
                    //retval这里没有打印出东西,上面的arg2可能是返回值。
                    console.log("sub_1AB4C onLeave",hexdump(retval),"
    =======
    ",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]),"
    =======
    ",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的时候可以发现,改参数在返回的时候地址发生了变化。

  • 相关阅读:
    Pandas系列
    Pandas快速入门
    Pandas数据结构
    机器学习三剑客之Matplotlib
    机器学习三剑客之Pandas
    机器学习三剑客之Numpy
    NumPy IO文件操作
    NumPy使用 Matplotlib 绘制直方图
    nyoj 37 回文字符串
    判断一个字符串是不是回文串
  • 原文地址:https://www.cnblogs.com/c-x-a/p/15470815.html
Copyright © 2011-2022 走看看