FrenchYeti/dexcalibur
GitHub: FrenchYeti/dexcalibur
基于Frida的Android逆向工程平台,将动态插桩自动化与静态分析引擎结合,实现运行时Hook生成、字节码反编译、Smali虚拟机符号执行等功能的All-in-One解决方案。
Stars: 1121 | Forks: 131




[](https://travis-ci.org/FrenchYeti/dexcalibur)

[](http://makeapullrequest.com)
[](https://codeclimate.com/github/FrenchYeti/dexcalibur/maintainability)

# Dexcalibur
Dexcalibur 是一个专注于 instrumentation 自动化的 Android 逆向工程平台。其独特之处在于利用动态分析来改进静态分析启发式算法。它旨在自动化与动态 instrumentation 相关的枯燥任务,例如:
* 在运行时反编译/反汇编被拦截的字节码
* 编写 hook 代码并管理大量的 hook 消息
* 搜索有趣的模式/需要 hook 的对象
* 处理通过 hook 收集的数据(dex 文件、调用的方法、类加载器等)
* 等等……
但不仅如此,因为 Dexcalibur 拥有自己的静态分析引擎,并且能够执行部分 smali 代码。
你想分享一些东西或者需要帮助吗?加入我们的官方聊天群组:
[Telegram](https://t.me/dexcalibur) - 最快的响应方式
[](https://discord.gg/pfB7Ez34Ts)
官方文档可在[此处(网站 - 正在建设中)](https://frenchyeti.github.io/dexcalibur-doc/)获取。
在此处查看最新消息:[http://docs.dexcalibur.org/News.html](http://docs.dexcalibur.org/News.html)
观看 Dexcalibur 演示视频:[演示:不到 1 分钟 hook 61 个方法?没问题。(youtube)](https://www.youtube.com/watch?v=2dGoolvMEpI)
## A. 安装
### A.1 新安装
前往[安装文档](https://frenchyeti.github.io/dexcalibur-doc/Installation-guide.html)
替代方案:使用 Docker
- 在您的主机上,安装 `adb`(如果适用,还需安装 Android 模拟器)
- `docker-compose build android-dexcalibur`
- `docker run --rm -it --net=host -v /tmp/dexcalibur:/shared -p 8000:8000 dexcalibur:2023.01 /bin/bash`
### A.2 启动 dexcalibur
**对于 Linux 和 MacOS**
NPM 安装:如果 Dexcalibur 是使用 NPM(`-g` 选项)全局安装的,那么可以通过在终端执行 `$ dexcalibur` 来启动 Dexcalibur,否则可以通过 `$ node $(node root -g dexcalibur)/dexcalibur/dexcalibur.js` 来启动。
从源码安装:从 `dexcalibur` 文件夹运行 `$ dexcalibur` 或 `$ node dexcalibur.js`。
**对于 Windows**
NPM 安装:即使 Dexcalibur 是使用 NPM(`-g` 选项)全局安装的,也必须通过在终端运行以下命令来启动 Dexcalibur:`node /dexcalibur/dexcalibur.js`。
从源码安装:从 `dexcalibur` 文件夹,在终端中运行命令 `node dexcalibur.js`。
### A.3 更新
#### 从版本 <= 0.6.x
您使用的是旧版本的 Dexcalibur?
按照与新安装相同的步骤操作,当您应该输入工作空间路径时,输入您当前的工作空间位置。
#### 从版本 >= 0.7
只需执行:
```
$ npm install -g dexcalibur
```
现有的配置和工作空间将被自动检测。
## C. 截图
以下截图展示了运行时 *xrefs* 的自动更新。


## D. 功能与限制
实际上,最大的限制是 Dexcalibur 无法生成针对原生函数(位于 JNI 库中)的 hook 源代码。但是,您可以通过编辑 hook 手动声明一个 Frida Interceptor。
鉴于 Dexcalibur(目前)不提供分析原生部分(如 JNI 库或 JNA)的功能,因此仅详细说明了与 Java 部分相关的功能和限制。
**分析准确性取决于分析早期步骤中使用的 Android API 镜像的完整性。这意味着,如果您使用从 Android SDK 中的 Android.jar 文件生成的 DEX 文件,则可能会缺少对 Android java API 内部方法、字段或类的引用。当分析直接从运行预期 Android 版本的真实设备上提取的“boot.oat”文件开始时,可以获得更好的结果。**
### D.1 功能
#### D.1.A 静态分析器
待办:编写文本
#### D.1.B Hook 管理器
待办:编写文本
#### D.1.C Dexcalibur 的 smali VM
**跟踪的行为**
涉及“运行 smali (VM)”操作的静态分析器能够发现并接受但跟踪以下行为:
* 越界目标寄存器(寄存器超出 v0 - v255)
* 越界源寄存器(寄存器超出 v0 - v65535)
* 检测隐式抛出内部异常的无效指令
* 检测某些不符合 Android 规范的有效字节码片段
* 计算未定义数组的长度
* 填充未定义数组
* 更多……
实际上,不支持针对此类无效指令的处理程序/侦听器,但事件会被跟踪并呈现。
**Dexcalibur IR**
VM 生成一种自定义且简化的中间表示 (IR),其显示**仅为了帮助分析师**进行分析。
根据调用堆栈深度和配置的值,IR 可能包含也可能不包含在被调用函数中执行的指令。如果执行进入 try 块并继续返回,但从未执行 catch,则 catch 块将不会被呈现。事实上,Dexcalibur IR 的目的是仅呈现 VM 上下文中“已执行的”或“根据某些符号值可能执行的”内容。
Dexcalibur IR 通过移除无用的 goto 和不透明谓词,有助于阅读清理后的字节码版本。Dexcalibur VM 可以生成具有 2 个简化级别的 IR:
*1级 IR,如果您不信任 2 级 IR,可以使用:*
- 无 CFG 简化:条件和无条件跳转均被呈现。
- 每次寄存器移动都会被呈现
*2级:*
- 如果寄存器在使用前未被未知值修改,则隐藏赋值。
- 移除始终为 TRUE/FALSE 的谓词
- 在特定条件下移除如 goto 等无条件跳转:目标基本块的单一前驱等……
- 如果可能,解析并将 Method.invoke() 调用替换为被调用的方法。
- 如果之前抛出了异常,则 Try 块中的指令不会被呈现
- ……
**Android API 模拟**
待办
**详情**
Smali VM 遵循以下步骤:
1. 初始化 VM:栈内存、堆、类加载器、方法区等……
2. VM 加载声明该方法的类。
3. (可选)如果该类具有静态块,则执行 clinit()。它有助于求解存储在静态属性中的具体值
4. 加载方法元数据
5. 执行方法的指令,如果启用了 PseudoCodeMaker,则生成 Dexcalibur IR。
VM 如何处理 invoke-* 指令?
1. 当发生 invoke-* 时,保存本地符号表,并加载被调用的方法。
2. 如果声明被调用方法的类从未被加载,则加载该类
3. 如果该方法从未被加载,则加载该方法(由 MethodArea 加载)并通过从调用者的符号表导入参数符号来初始化其本地符号表。
4. 被调用的方法被推入调用堆栈。
5. 执行方法指令。
6. 将返回值推入栈内存
7. 调用者交出控制流
#### D.1.D 应用程序拓扑分析器
**Manifest 分析(有限)**
在首次运行之前,会解析应用程序的 Android manifest。实际上,manifest 中的异常
此类不安全配置在此级别确实会被检测到。
Android manifest 解析的唯一目的是填充其他类型的分析器。
**权限分析**
从 Manifest 中提取的每个权限都会被列出和识别,并与目标 Android API 版本的 Android 规范进行比较。
Dexcalibur 仅在某些情况下提供权限用途描述、最低 Android API 版本等信息……
**Activities 分析**
**Providers 分析**
**Services 分析**
**Receivers 分析**
#### D.1.E 运行时监控(未实现)
**网络监控**
**Intent 监控**
**文件访问监控**
#### D.1.F 协作功能
您找不到多用户菜单吗?没问题,虽然没有菜单,但可以实现最基本的协作工作。
Dexcalibur 运行一个 Web 服务器。因此,如果多个人位于此 Web 服务器的同一网络中,并且主机防火墙配置正确,你们可以多人同时在同一个 Dexcalibur 实例上工作。
*目前的限制是:*
- **无身份验证:** 网络中的每个人都可以向 Dexcalibur 实例发送请求,并通过搜索引擎对主机进行 RCE。
- **无身份标识:** 修改不会被跟踪,因此,如果有人重命名了一个符号,您将无法知道是谁重命名的。类似的情况:您无法知道是谁创建了一个特定的 hook。
- **单设备 instrumentation:** 如果多台设备连接到 Dexcalibur 的主机,即使您可以选择要进行 instrumentation 的设备,instrumentation 和 hook 消息也会链接到最后选择的设备。因此,您无法同时为多台设备生成 instrumentation。
## F. 故障排除
### F.1 Dexcalibur 持续以“安装模式”启动
在深入排查之前:
- 确保您已连接到互联网:Apktool 和目标平台在安装期间会被下载
- 您是否尝试过通过执行 `dexcalibur --reinstall` 命令来重新安装?如果没有,请尝试一下。
首先,检查全局设置是否已保存到 `/.dexcalibur/` 中
```
$ ls -la ~/.dexcalibur
total 8
drwxr-xr-x 3 test_user staff 96 29 avr 11:41 .
drwxr-xr-x+ 87 test_user staff 2784 29 avr 11:47 ..
-rw-r--r-- 1 test_user staff 204 29 avr 11:41 config.json
$ cat ~/.dexcalibur/config.json
{
"workspace":"/Users/test_user/dexcaliburWS3",
"registry":"https://github.com/FrenchYeti/dexcalibur-registry/raw/master/",
"registryAPI":"https://api.github.com/repos/FrenchYeti/dexcalibur-registry/contents/"
}
```
接下来,检查 Dexcalibur 工作空间的结构是否如下所示(`/api` 文件夹的内容可能有所不同)。
```
$ ls -la ~/dexcaliburWS/.dxc/*
/Users/test_user/dexcaliburWS/.dxc/api:
total 0
drwxr-xr-x 3 test_user staff 96 29 avr 11:41 .
drwxr-xr-x 7 test_user staff 224 29 avr 11:41 ..
drwxr-xr-x 8 test_user staff 256 29 avr 11:41 sdk_androidapi_29_google
/Users/test_user/dexcaliburWS/.dxc/bin:
total 34824
drwxr-xr-x 4 test_user staff 128 29 avr 11:41 .
drwxr-xr-x 7 test_user staff 224 29 avr 11:41 ..
-rwxr-xr-x 1 test_user staff 17661172 29 avr 11:41 apktool.jar
drwxr-xr-x 18 test_user staff 576 29 avr 11:41 platform-tools
/Users/test_user/dexcaliburWS/.dxc/cfg:
total 8
drwxr-xr-x 3 test_user staff 96 29 avr 11:41 .
drwxr-xr-x 7 test_user staff 224 29 avr 11:41 ..
-rw-r--r-- 1 test_user staff 314 29 avr 11:41 config.json
/Users/test_user/dexcaliburWS/.dxc/dev:
total 0
drwxr-xr-x 2 test_user staff 64 29 avr 11:41 .
drwxr-xr-x 7 test_user staff 224 29 avr 11:41 ..
/Users/test_user/dexcaliburWS/.dxc/tmp:
total 0
drwxr-xr-x 2 test_user staff 64 29 avr 11:41 .
drwxr-xr-x 7 test_user staff 224 29 avr 11:41 ..
```
## G. 常见问题
### 我的设备未出现在设备列表中
如果您使用通过 USB 连接的物理设备,请确保已启用 *开发者模式* 和 *USB 调试*。
如果您使用虚拟设备,请转到 `/splash.html`,选择 `Device Manager`,点击
`Connect over TCP ...` 并按照说明操作。如果您不知道设备的 IP 地址,请勾选 `automatic configuration` 框让 Dexcalibur 检测它。
### USB 调试已启用,但我的设备未出现在设备列表中
- 连接/断开 USB 并确保您的计算机已被允许。
- 选择文件传输
### 为什么要注册新设备?
您需要先注册目标设备才能使用它。
在注册期间,Dexcalibur 会收集设备元数据并推送兼容版本的 Frida server。
这些元数据用于选择正确的 frida-server 和 frida-gadget 目标。
#### 我的设备已列在 Device Manager 中,但无法注册
如果设备列表中的某一行出现红色感叹号 `!`,则表示您的桌面未被设备允许。您可能需要确认
如果您的设备列在 DeviceManager 中且 `online` 列已勾选,请点击 `enroll`
#### G.1 我的设备已列在 Device Manager 中
如果您的设备列在 DeviceManager 中且 `online` 列已勾选,请点击 `enroll`
### 如何使用模拟器代替物理设备?
Dexcalibur 版本 < v0.7 无法自动检测模拟设备并使用它,原因是 ADB 输出解析不完整。
对于版本 >= v0.7,一旦您的虚拟设备运行起来,请转到 `/splash.html` 或点击导航栏中的 `DEXCALIBUR`。
点击左侧菜单中的 `Device Manager` 按钮,然后点击数组顶部的 `Refresh` 按钮。
您应该看到一行以您虚拟设备的 ADB ID 开头的数据。
### 如何通过 TCP 使用设备?
首先,像任何目标设备一样,您应该注册它。
点击 `Connect over TCP ...` 以通过 TCP 添加新设备或连接已注册的设备。
如果该设备从未被注册,则注册将通过 TCP 进行。
在某些情况下,通过 TCP 的连接比通过 USB 慢。因此注册可能需要额外的时间。
如果设备是通过 USB 注册的,那么该设备的新首选传输类型将变为 TCP。
### 如何为 dexcalibur 做贡献?
在此存储库上创建 pull request 或创建一个 issue。
### 如何为文档做贡献?
在 [dexcalibur-doc](https://github.com/FrenchYeti/dexcalibur-doc) 存储库上创建 pull request。
文档可在[此处(文档网站)](https://frenchyeti.github.io/dexcalibur-doc/)和[此处(wiki)](https://github.com/FrenchYeti/dexcalibur/wiki/News)获取## H. 赞助商
|  |
| --- |
| 他们提供了 All Products 许可证 <3 |
## I. 资源
目前关于 Dexcalibur 的文档和培训资源很少。如果您成功使用 Dexcalibur 赢得了 CTF 挑战或发现了漏洞,我强烈建议您分享您的经验。
* [THCon 2020](https://www.youtube.com/watch?v=VRVV23glm_o)
* [SSTIC 2020](https://www.sstic.org/2020/presentation/dexcalibur_hook_it_yourself/)
* [Pass the SALT 2019 幻灯片 (PDF)](https://2019.pass-the-salt.org/files/slides/02-Dexcalibur.pdf)
* [Youtube:演示](https://www.youtube.com/watch?v=2dGoolvMEpI)
* [CLI 用户指南](https://github.com/FrenchYeti/dexcalibur/wiki/CLI-User-guide)
* [用户指南](https://github.com/FrenchYeti/dexcalibur/wiki/User-guide)
* [故障排除](https://github.com/FrenchYeti/dexcalibur/wiki/Troubleshoots)
* [截图](https://github.com/FrenchYeti/dexcalibur/wiki)
## J. 他们对 Dexcalibur 的评价
* [Awesome Frida](https://github.com/dweinstein/awesome-frida)
* [Awesome OpenSource Security](https://github.com/CaledoniaProject/awesome-opensource-security)
* [n0secure.org - PassTheSalt2019 J2](https://www.n0secure.org/2019/06/sstic-2019-j2.html)
* [rootshell.be - PassTheSalt2019 Wrap Up](https://blog.rootshell.be/2019/07/04/pass-the-salt-2019-wrap-up/)
* [PentesterLand - the 5 hacking newsletter 61](https://pentester.land/newsletter/2019/07/09/the-5-hacking-newsletter-61.html)
* [Technology Knowledge Database](https://github.com/ikey4u/tkb/blob/d26f47bf75d8d4c1aa5a655ab6c60f876ad7d402/tkb201907.txt)
* [Xuanwu Lab Security](https://github.com/MyKings/security-study-tutorial/blob/3a5661fb54c6320f403eefa95bcf787324a6e923/origin/Xuanwu%20Lab%20Security/2019/08/01.md)
* [Mobile Gitbook](https://github.com/z3f1r/mobile-gitbook)
* [274 - AppsSec Ezine](https://github.com/Simpsonpt/AppSecEzine/blob/60c530b32984921daa47164591e94bb564b0c75c/Ezines/274%20-%20AppSec%20Ezine)
* [ysh329 / Android Reverse Engineering](https://github.com/ysh329/android-reverse-engineering)
标签:Android 逆向工程, DEX 反汇编, DEX 反编译, Docker支持, Frida, Hook 框架, MITM代理, Smali 执行, 动态二进制插桩, 应用渗透测试, 数据可视化, 目录枚举, 移动安全, 网络安全, 自定义脚本, 自定义脚本, 自定义脚本, 请求拦截, 错误基检测, 隐私保护, 静态代码分析