阅读 278

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")))

这里写一个例子:

//加了隐藏关键字 导出表看不到__attribute__((visibility("hidden"))) void func_no_exp(){
    LOGD("hidden");}

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


frida hook so层

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


image

这种函数在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 无导出效果图

image

持续更新移动安全,iot安全,编译原理相关原创视频文章
视频演示:https://space.bilibili.com/430241559



作者:移动安全王铁头
链接:https://www.jianshu.com/p/b052e0fe3af5
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐