zoukankan      html  css  js  c++  java
  • frida hook so文件

    参考

    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//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()
    
    ```**------------恢复内容开始------------**
    [参考](https://blog.csdn.net/hao5335156/article/details/113475875)
    ###so源码
    ```c
    #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//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()
    
    

    ------------恢复内容结束------------

  • 相关阅读:
    【codeforces 604D】Moodular Arithmetic
    【hdu 1846】Brave Game
    【hdu 2147】kiki's game
    【hdu 2188】选拔志愿者
    【hdu 2149】Public Sale
    【hdu 1847】Good Luck in CET-4 Everybody!
    【hdu 1849】Rabbit and Grass
    FreeBSD 内核中的SYSINIT分析【转】
    解决tomcat运行报错java.lang.UnsatisfiedLinkError: apache-tomcat-7.0.37in cnative-1.dll:Can load AMD 64
    菜单的事件推送
  • 原文地址:https://www.cnblogs.com/wzbk/p/15204763.html
Copyright © 2011-2022 走看看