zoukankan      html  css  js  c++  java
  • frida免root hook 1) frida gadget so 免 root注入app

    frida免root hook 1) frida gadget嵌入app

    可能有的大佬并不知道 frida gadget是个啥。

    这里先看看官方对于gadget的解释

    官方链接 https://frida.re/docs/gadget/

    frida gadget官网 frida gadget替换so

    这句英语意思大概意思是:

    frida Gadget是一个动态库,如果注入不适用于当前场景 (一般是被检测 或者没 root),就用程序加载这个库来达到hook的效果。

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

    frida gadget使用场景

    1. 免root 使用 frida
    2. 反调试 反root 反frida 很强,绕不过去的时候
    3. frida 持久化 hook

    frida gadget 支持的连接方式

    官网文档支持的交互方式有4种

    frida gadget 4种连接方式

    1. Listen: 默认的连接方式, 类似frida-server那种,可以指定端口,frida -U gadget 连接,电脑端操作

    2. Connect: 我愣是没看懂 看懂了再过来改

    3. Script: 直接执行注入脚本,js注入脚本要放到手机目录

    4. ScriptDirectory:脚本目录,类似全局hook, 可以用libart之类的so 加载 gadget,可以指定哪个脚本注入哪个app (没测试)

    这里演示第3种 Script 直接执行注入脚本这种连接方式

    后续有空会把上面的各种方式都写一下

    app一般分为有so库和无so库

    这篇文章演示有so库的情况

    frida Gadget script脚本连接(有so库) 步骤

    1. 下载 frida gadget.so
    2. app so添加依赖 加入 frida gadget.so
    3. 配置 frida gadget 的config文件
    4. 编写注入js
    5. 打包新apk执行

    1.下载 frida gadget.so

    去哪里下载呢?

    当当当当

    当然是全球最大同性交友网站 github

    frida gadget github下载

    直接去frida的github仓,点击 release 找想要的版本去下载就可

    链接 https://github.com/frida/frida/releases

    frida gadget so

    2.app so添加依赖 加入 frida gadget.so

    这一步的原理就是,让app在执行so的文件的时候,加载frida-gadget.so

    大部分so文件,在运行的时候,都有一些依赖库。

    这一步就是把 frida gadget.so加入到apk 本身so的依赖库中。

    这一步很多大佬是用 lief实现的。

    实际上实现这一步的办法挺多的。

    喜欢用ubuntu的可以安装 patchelf 然后一行命令就搞定了

    patchelf地址:https://github.com/NixOS/patchelf

    patchelf --add-needed frida-gadget.so apk.so 
    

    so easy ,再也不用担心你不会添加依赖了。

    实例演示:

    看看这里的示例apk

    image-20210903201324395

    wtt这个示例apk里面有一个 so libnative-lib.so

    这里,直接给 libnative-lib.so添加frida-gadget.so 依赖库

    frida gadget避免检测改名

    为了防止检测,frida这特征也太大了,很容易被检测 被针对

    最好把这个so改个名字,比如 libcaiji.so 改名后如下图

    frida gadget so 改名后

    运行 patchelf 添加依赖库

    patcheld so注入

    没有添加依赖库之前,依赖库如下

    so注入之前 so相关依赖项

    搞完之后 拖进ida看一下 依赖库,这里可以看到多了一个依赖so

    libcaiji.so 就是 frida-gadget.so改名后的so

    elf注入之后 相关依赖


    当然这一步也可以用lief

    先安装

     pip install lief
    

    so注入工具 lief安装

    这里 很多大佬直接给出了代码 但是每次都得改代码就好麻烦

    我直接写了个脚本 直接读取命令行参数执行

    import sys
    import lief
    
    str_so_apk = sys.argv[1]
    str_so_gadget = sys.argv[2]
    
    libnative = lief.parse(str_so_apk)
    libnative.add_library(str_so_gadget) # Injection!
    libnative.write(str_so_apk)
    

    保存成 inject.py

    命令格式如下

    python inject.py apk的so  注入的so名
    

    执行

    注入 gadget so

    执行完之后看一下依赖

    gadget so 注入之后 依赖项

    成功添加

    3.配置 frida gadget 的config

    这里这篇文章主要是 执行脚本

    关于用gadget.so执行脚本

    看看官方文档的介绍,机器翻译还是有点问题的,凑合看吧

    frida免root hook script配置

    这里我按照官方的示例,写了一个配置文件

    配置文件名 libcaiji.config.so

    这里, 注意配置文件命名的格式,一定是你改名后的名字 + .config.so

    libxxx.so
    libxxx.config.so
    

    官方文档是这么描述的

    frida gadget so config命名

    这里,按照上面的格式

    修改后的so名为 libcaiji.so

    配置文件的名字为: libcaiji.config.so

    脚本代码如下

    {
      "interaction": {
        "type": "script",
        "path": "/data/local/tmp/hook.js"
      }
    }
    

    frida 免root 注入 js

    这里虽然后缀名是 .so 内容其实是json配置文件,这点要注意

    4.编写注入js

    原apk的代码如下

    frida gadget要注入的app

    apk正常运行是这样的

    app正常运行

    这里 编写一个注入的js

    把 弹窗显示的 aaa 改成 bbb

    这里 直接 hook com.wangtietou.no_root.MainActivity 的 aaa 方法

    改下返回值就可以了

    hook代码如下

    var str_name_class = "com.wangtietou.no_root.MainActivity";
    
    Java.perform(function()
    {
        var obj = Java.use(str_name_class);
    
        obj.aaa.implementation = function ()
        {
            return "bbb";
        }
    });
    
    

    写完js 把注入脚本放到之前配置的路径下

    要注入的js

    这里 /data/local/tmp/hook.js 是之前配置文件配置过的路径

    一定要写对,不然,找不到执行的js, 怎么hook ,凉凉

    5.打包签名新apk执行

    这里把 改名后的 frida-gadget.so 和 配置文件放到lib目录

    再压缩

    然后签名

    就可以了

    这里没有修改 dex文件 也没有修改 AndroidManifest.xml 所以并不用使用apktool重新打包

    这个例子只有一个 依赖库架构 是 armv7a 那么只修改这一个架构就可以了

    frida gadget嵌入app

    如果是多个架构,那就要都改 下面这个例子有2个架构 armv7 armv8

    不确定运行平台的前提下 最好两个都改了 这里看一下前后的对比

    frida gadget嵌入app多个架构

    把修改后的apk目录 压缩一下就可以了

    frida gadget重打包app

    搞完后 用 apktoolbox重新签个名就ojbk了

    apk重新签名

    frida 免root hook app

    安装app执行 看一下效果

    frida gadget执行


    上面搞了这么多,实际上还有更简单的办法

    有大佬早就写好了一键脚本

    文章地址:https://bbs.pediy.com/thread-268175.htm

    脚本地址:https://github.com/nszdhd1/UtilScript/

    只不过,脚本用起来不太灵活。

    我准备把脚本改改,让脚本用起来更方便。

    搞完会分享给大佬们的。.

    这个文章用到的所有文件,周末会录个视频,然后一起发上去。

    方案要注意的点

    1.签名校验

    修改apk后,签名会发生变化,apk如果有签名校验的话,要绕过签名校验

    2.hook时机

    这里导入的so 一定要在 要hook的函数执行之前导入

    要不然,要hook的函数都执行完了,你的so才导入,hook个锤子

    3.so架构

    如果app so支持多个架构,不确定具体执行平台的话,建议每个架构都操作一波

    方案优点

    1.有效绕过大部分反调试 反root 反frida

    在没有root的手机上运行,反root对你而言就是不存在的

    用 gadget去注入,frida的大部分特征也没了 能绕过大部分 反调试 反frida

    2.持久化hook

    直接嵌入app 相当于源码级修改 体验很好

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

    相关资料关注公众号回复 关键字 frida 进行下载

    移动安全王铁头

  • 相关阅读:
    Python,文件修改
    Python,文件
    driver.find_element_by_xpath.clear()无法清空输入框默认值
    对于隐藏性质的非标准的动态 id 的下拉框,如何定位和选中
    driver.find_element_by_xpath() 带参数时的写法
    不能聚焦元素问题 WebDriverException: Message: unknown error: cannot focus element
    firefox56 版本中的 Selenium IDE 无法导出脚本问题
    元素无法定位问题 NoSuchElementException: Message: no such element: Unable to locate element 解决方法
    selenium python 脚本不支持中文问题
    关于 chromedriver、IEDriverServer、geckodriver 驱动器的几项注意点
  • 原文地址:https://www.cnblogs.com/shlyd/p/15259180.html
Copyright © 2011-2022 走看看