• frida hook native -- frida hook so层 实例代码讲解


    frida hook native

    大家好,我是王铁头 一个乙方安全公司搬砖的菜鸡
    持续更新移动安全,iot安全,编译原理相关原创视频文章

    今天分享的是 frida hook native 也就是 frida hook so层函数

    视频演示:https://space.bilibili.com/430241559

    frida是一个轻便好用的工具,不仅支持java层的hook,同样支持so层的hook. 那么,frida hook so 是如何实现的哪?

    这里,根据场景的不同 分为有导出和无导出

    原理 通过地址进行hook

    有导出:函数名可以在导出表找到 通过导出表的数据结构 用函数名称进行函数的定位
    无导出:函数名在导出表找不到。 这里需要根据函数特征 比如字符串等 手动搜索关键字符串定位函数地址

    1 有导出so层hook

    原理:通过导出表的结构找到函数名对应的汇编代码的地址。

    frida hook native frida hook so层

    1.1 有导出适用场景

    一般情况下,要hook的函数名可以在导出表找到
    找不到只有下面两种情况

    1. 写代码时使用__attribute__((visibility("hidden")))关键字隐藏导出
    2. 编译后 被开发者, 加固壳或者第三方框架修改elf格式 被加密抹去相关信息,

    下面先讨论正常可以在导出表看到的情况
    这里我写了两个函数

    extern "C" void func_exp()
    {
        LOGD("exp");
    }
    
    //这里没有extern "C"关键字 默认是c++风格导出的
    //hook时要注意名称粉碎 
    void func_exp_cpp()
    {
        LOGD("exp_cpp");
    }
    

    这里只要不做啥骚操作 导出表绝对是可以看到的 如下图
    frida hook native

    1.2 frida hook so层有导出代码

    这里 func_exp 函数是c风格导出 所以函数名直接填写就可以了
    但是 func_exp_cpp 函数这里要进入ida里面看具体函数名 如图
    frida hook so层

    var str_name_so = "libnative-lib.so";    //要hook的so名
    var str_name_func = "func_exp";          //要hook的函数名
    //var str_name_func = "_Z12func_exp_cppv";    //这里注意名称粉碎
    
    var n_addr_func = Module.findExportByName(str_name_so , str_name_func);
    console.log("func addr is ---" + n_addr_func);
    
    Interceptor.attach(n_addr_func, {
        //在hook函数之前执行的语句
        onEnter: function(args) 
        {
            console.log("hook on enter")
        },
        //在hook函数之后执行的语句
        onLeave:function(retval)
        {
            console.log("hook on leave")
        }
    });
    

    1.3 hook效果图

    frida hook so frida hook native

    2 无导出

    无导出这里要使用一个关键字才能达到无导出的效果

    __attribute__((visibility("hidden")))
    

    这里写一个例子:

    //extern "C" c语言格式导出
    __attribute__((visibility("hidden"))) void func_no_exp()
    {
        LOGD("hidden");
    }
    

    生成so文件后,导出表是看不到这个函数的:
    如下图。
    frida hook so层

    因为无导出的函数无法通过函数名去定位地址:
    所以这里只能通过手动定位去找到函数对应的偏移 这里可以根据情况用字符串或者看上下级调用定位到偏移 这里的函数偏移是0x7078 还有一点 确定偏移的时候要注意使用的so是v7 arm32 还是 v8 arm64
    函数偏移如下 如图 这里 函数 func_no_exp的偏移是 0x7078

    这种函数在ida里面一般是 sub_xxx xxx是16进制的地址

    2.2 frida hook so层无导出代码

    var str_name_so = "libnative-lib.so";    //要hook的so名
    var n_addr_func_offset = 0x7078;         //要hook的函数在函数里面的偏移
    
    //加载到内存后 函数地址 = so地址 + 函数偏移
    var n_addr_so = Module.findBaseAddress(str_name_so);
    var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset;
    
    var ptr_func = new NativePointer(n_addr_func);
    Interceptor.attach(ptr_func, 
    {
        onEnter: function(args) 
        {
            console.log("hook on enter no exp");
        },
        onLeave:function(retval)
        {
            console.log("hook on Leave no exp");
        }
    });
    

    2.3 frida hook so 无导出效果图

    视频演示:https://space.bilibili.com/430241559

    资料代码下载 请关注公众号 [移动安全王铁头] 回复关键字 frida

    持续更新移动安全,iot安全,编译原理相关原创视频文章

  • 相关阅读:
    切换RequiredFieldValidator和RegularExpressionValidator提示信息的控件
    添加删除查询字符串中的参数
    动易订单数据表关系
    页面中文乱码问题收集(原创)
    URLRewrite 在 iis6+iis7中的配置
    ASP.NET面试题(英文)
    execve
    pipe管道通信阻塞
    pipe
    linux管道通信
  • 原文地址:https://www.cnblogs.com/shlyd/p/14219188.html
Copyright © 2020-2023  润新知