美文网首页
frida hook so文件

frida hook so文件

作者: 王镇_ee87 | 来源:发表于2021-08-30 10:21 被阅读0次

    参考

    so源码

    #include <string.h>
    #include <jni.h>
    #include"test.h"
    
    jstring JNICALL Java_com_example_mi_demoso_JNITest_getStringFromJNI(JNIEnv* env, jobject jo)
    {
        char str[] = "x HelloWorld from JNI12345!";
        int c = test_add(97,1);
        str[0] = (char)c;
        return (*env)->NewStringUTF(env, str);
    }
    
    int test_add(int a,int b){
        return a+b;
    }
    

    文件名对应的文件偏移地址

    image.png

    上图可以看到:在导出函数窗口可以直接看到函数"test_add"的偏移地址和函数名(这里可以通过函数名或者地址进行hook),非导出函数只能通过地址hook;这里我们用地址hook的方法(图中表明hook的函数偏移为0x00000680,函数地址 = so基地址 + 函数偏移, so基地址在/proc/<pid>/maps中可查看)

    image.png
    import frida
    import sys
    
    jscode = """
    Java.perform(function(){
        var str_name_so = "libjnitest.so";    //需要hook的so名
        var n_addr_func_offset = 0x00000680;         //需要hook的函数的偏移
        var n_addr_so = Module.findBaseAddress(str_name_so); //加载到内存后 函数地址 = so地址 + 函数偏移
        var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset;
        var ptr_func = new NativePointer(n_addr_func);
        //var ptr_func = Module.findExportByName("libjnitest.so","test_add") //对函数名hook
    
        Interceptor.attach(ptr_func,{ 
            //onEnter: 进入该函数前要执行的代码,其中args是传入的参数,一般so层函数第一个参数都是JniEnv,第二个参数是jclass,从第三个参数开始是我们java层传入的参数
            onEnter: function(args) {
                send("Hook start");
                send("args[2]=" + args[2]); //第一个传入的参数
                send("args[3]=" + args[3]); //第二个参数
            },
            onLeave: function(retval){ //onLeave: 该函数执行结束要执行的代码,其中retval参数即是返回值
                send("return:"+retval); //返回值
                retval.replace(100); //替换返回值为100
            }
        });
    });
    """
    def printMessage(message,data):
        if message['type'] == 'send':
            print('[*] {0}'.format(message['payload']))
        else:
            print(message)
    
    process = frida.get_remote_device().attach('com.example.testso') #进程名
    script = process.create_script(jscode)
    script.on('message',printMessage)
    script.load()
    sys.stdin.read()
    
    

    相关文章

      网友评论

          本文标题:frida hook so文件

          本文链接:https://www.haomeiwen.com/subject/ilbniltx.html