FRIDA-DEXDump: 一吻便杀一个人,三秒便脱一个壳

查看 179|回复 11
作者:菜鸡葫芦娃   
需求
APP 加固发展到现在已经好几代了,从整体加固到代码抽取到虚拟机保护,加固和脱壳的方案也逐渐趋于稳定。随着保护越来越强,脱壳机们也变得越来越费劲,繁琐。
不过对于我来说,很多时候其实并不需要那些被强保护起来的代码,我只是想单纯的看看这个地方的业务逻辑。所以,我追求的是更加快速、简便的脱壳方法。
实现
得益于FRIDA, 在 PC 上面进行内存搜索、转储都变得十分方便,再也不需要考虑什么Xposed、什么Android开发、什么代码注入,只需要关注如何去搜索想要的东西,于是依赖一个几十行代码的小脚本,就可以将大部分内存中的 dex 脱下来。在过去的一年,我几乎所有脱壳的工作都是由此脚本来完成,目前已经随手开源:FRIDA-DEXDump, 欢迎star。
对于完整的 dex,采用暴力搜索 dex035 即可找到。而对于抹头的 dex,通过匹配一些特征来找到。
补充
有人问我无头dex的匹配原理是什么,这里补充一下: 因为许多加固抹头的时候只会抹掉dex035这个magic bytes, 但是其实 DexHeader 里很多其他的字段也是可以当作特征来匹配: 比如 header 的长度、string\type\field\proto 表的索引,索引指向的位置顺序等等。
虽然单一一个字段拿出来无法作为准确的特征,但如果有多条规则进行匹配,那么就完成了一个相对精确的模糊搜索,这样就能搜到 dex035 的dex了。代码里我仅仅只加了一条string_id_off的规则,所以加了个 improve 的 TODO, 不过我觉得基本上够用,有兴趣的补全可以过来提 pr 鸭。
目前基本上我遇到的大部分 tx、bb、ijm、360、baidu 很多都是可以 dump 的,毕竟现代壳的核心功能并不是为了保护整体 DEX
使用
(不会安装使用 FRIDA 的,请先自行百度学会..)
[ol]
  • 默念一声"我想脱个壳"。
  • 启动 APP。
  • 启动 frida-server。
  • python main.py。
  • 默数三秒,脱好了。
    [/ol]
    或者可以将脚本封装成命令,就像这样:


    screenshot.png (556.92 KB, 下载次数: 7)
    下载附件
    2020-2-27 11:25 上传

    ******
    迫于不能带公众号,放个Github链接:https://github.com/hluwa/FRIDA-DEXDump

    脱壳, 代码

  • 初见悲风   

    楼主 能不能帮忙看一下这个出错
    [Asm] 纯文本查看 复制代码Spawning `com.xxx.xxx`...
    INFO:Agent:DexDumpAgent: Attach.
    INFO:frida-dexdump:Waiting 10s...
    INFO:frida-dexdump:[+] Searching...
    Exception in thread Thread-1 (_run):
    Traceback (most recent call last):
      File "D:\Python311\Install\Lib\threading.py", line 1038, in _bootstrap_inner
        self.run()
      File "D:\Python311\Install\Lib\threading.py", line 975, in run
        self._target(*self._args, **self._kwargs)
      File "D:\Python311\Install\Lib\site-packages\frida_tools\reactor.py", line 70, in _run
        work()
      File "D:\Python311\Install\Lib\site-packages\frida_tools\application.py", line 587, in _try_start
        self._start()
      File "D:\Python311\Install\Lib\site-packages\frida_dexdump\__main__.py", line 68, in _start
        self.dump()
      File "D:\Python311\Install\Lib\site-packages\frida_dexdump\__main__.py", line 74, in dump
        ranges = self.agent.search_dex(enable_deep_search=self.enable_deep)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Python311\Install\Lib\site-packages\frida_dexdump\agent\__init__.py", line 21, in search_dex
        return self._rpc.searchdex(enable_deep_search)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Python311\Install\Lib\site-packages\frida\core.py", line 169, in method
        return script._rpc_request("call", js_name, args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Python311\Install\Lib\site-packages\frida\core.py", line 76, in wrapper
        return f(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^
      File "D:\Python311\Install\Lib\site-packages\frida\core.py", line 368, in _rpc_request
        raise result.error
    frida.InvalidOperationError: script has been destroyed
    GannicusLiu   

    爱加密的脱不了啊,一启动就闪退了。
    Traceback (most recent call last):
      File "main.py", line 82, in
        script = session.create_script(open(path + "/agent.js").read())
      File "/usr/local/lib/python3.7/site-packages/frida/core.py", line 26, in wrapper
        return f(*args, **kwargs)
      File "/usr/local/lib/python3.7/site-packages/frida/core.py", line 204, in create_script
        return Script(self._impl.create_script(*args, **kwargs))
    frida.TransportError: the connection is closed
    835560163   

    强到没朋友系列
    _小白   

    楼主,图片挂了
    bp946   

    有点6,下载试试,谢谢分享
    芽衣   

    有空试一下这个玩意儿
    zHiHz   

    感谢分享
    zhoupan88   

    真的有意思
    律政先锋Snake   

    真的什么壳都能脱吗,这么简单
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部