菜鸡葫芦娃 发表于 2020-2-26 22:25

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

本帖最后由 菜鸡葫芦娃 于 2020-2-27 11:25 编辑


## 需求

APP 加固发展到现在已经好几代了,从整体加固到代码抽取到虚拟机保护,加固和脱壳的方案也逐渐趋于稳定。随着保护越来越强,脱壳机们也变得越来越费劲,繁琐。

不过对于我来说,很多时候其实并不需要那些被强保护起来的代码,我只是想单纯的看看这个地方的业务逻辑。所以,我追求的是更加快速、简便的脱壳方法。

## 实现

得益于FRIDA, 在 PC 上面进行内存搜索、转储都变得十分方便,再也不需要考虑什么Xposed、什么Android开发、什么代码注入,只需要关注如何去搜索想要的东西,于是依赖一个几十行代码的小脚本,就可以将大部分内存中的 dex 脱下来。在过去的一年,我几乎所有脱壳的工作都是由此脚本来完成,目前已经随手开源:(https://github.com/hluwa/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 的,请先自行百度学会..)

1. 默念一声"我想脱个壳"。
2. 启动 APP。
3. 启动 frida-server。
4. python main.py。
5. 默数三秒,脱好了。

或者可以将脚本封装成命令,就像这样:



## \*\*\*\*\*\*

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

初见悲风 发表于 2022-11-28 11:18

楼主 能不能帮忙看一下这个出错
Spawning `com.xxx.xxx`...
INFO:Agent:DexDumpAgent<Connection(pid=Session(pid=7496), connected:True), attached=True>: 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 发表于 2020-5-18 18:24

爱加密的脱不了啊,一启动就闪退了。
Traceback (most recent call last):
File "main.py", line 82, in <module>
    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 发表于 2020-2-26 22:33

强到没朋友系列

_小白 发表于 2020-2-26 22:36

楼主,图片挂了

bp946 发表于 2020-2-26 23:05

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

芽衣 发表于 2020-2-26 23:06

有空试一下这个玩意儿{:17_1068:}

zHiHz 发表于 2020-2-26 23:13

感谢分享

zhoupan88 发表于 2020-2-26 23:14

真的有意思

律政先锋Snake 发表于 2020-2-26 23:21

真的什么壳都能脱吗,这么简单

雨落惊鸿, 发表于 2020-2-26 23:33

楼主怎么下载求教!{:1_937:}

bp946 发表于 2020-2-26 23:55

确实不错,解析出dex之后,怎么重新签名打包回apk?只用过AK直接编译
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: FRIDA-DEXDump: 一吻便杀一个人,三秒便脱一个壳