FrenchYeti/dexcalibur

GitHub: FrenchYeti/dexcalibur

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

Stars: 1121 | Forks: 131

![npm dependencies](https://david-dm.org/frenchyeti/dexcalibur.svg) ![npm](https://img.shields.io/npm/dm/dexcalibur) ![npm](https://img.shields.io/npm/v/dexcalibur?color=green) ![Docker Automated build](https://img.shields.io/docker/automated/frenchyeti/dexcalibur.svg?style=flat-square) [![Build Status](https://travis-ci.org/FrenchYeti/dexcalibur.svg?branch=master)](https://travis-ci.org/FrenchYeti/dexcalibur) ![Twitter Follow](https://img.shields.io/twitter/follow/frenchyeti?style=social) [![欢迎 PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![可维护性](https://api.codeclimate.com/v1/badges/080688cfe119a255db70/maintainability)](https://codeclimate.com/github/FrenchYeti/dexcalibur/maintainability) ![Dexcalibur banner](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/eab81df8c3103023.jpg) # Dexcalibur Dexcalibur 是一个专注于 instrumentation 自动化的 Android 逆向工程平台。其独特之处在于利用动态分析来改进静态分析启发式算法。它旨在自动化与动态 instrumentation 相关的枯燥任务,例如: * 在运行时反编译/反汇编被拦截的字节码 * 编写 hook 代码并管理大量的 hook 消息 * 搜索有趣的模式/需要 hook 的对象 * 处理通过 hook 收集的数据(dex 文件、调用的方法、类加载器等) * 等等…… 但不仅如此,因为 Dexcalibur 拥有自己的静态分析引擎,并且能够执行部分 smali 代码。 你想分享一些东西或者需要帮助吗?加入我们的官方聊天群组: [Telegram](https://t.me/dexcalibur) - 最快的响应方式 [![https://discord.gg/pfB7Ez34Ts](https://discordapp.com/api/guilds/852565889386676246/widget.png?style=banner2)](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* 的自动更新。 ![Xref auto update](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/664d67dfe4103026.png) ![Features](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/5af0acd5e8103027.png) ## 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. 赞助商 | ![https://www.jetbrains.com/?from=dexcalibur](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/d22204354f103030.png) | | --- | | 他们提供了 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 执行, 动态二进制插桩, 应用渗透测试, 数据可视化, 目录枚举, 移动安全, 网络安全, 自定义脚本, 自定义脚本, 自定义脚本, 请求拦截, 错误基检测, 隐私保护, 静态代码分析