mobile-threat-hunter/dexllm
GitHub: mobile-threat-hunter/dexllm
面向 LLM 的 Android APK/DEX 高性能静态分析器,提供 DAD 级别的 Java 反编译、多维度搜索和对抗性输入防护,专为移动威胁狩猎和恶意软件分诊而构建。
Stars: 0 | Forks: 0
# dexllm
面向 LLM 的 **Android APK / DEX 静态分析器**:包含 C++ 核心(围绕
[LuckyPray/DexKit](https://github.com/LuckyPray/DexKit) 的 pybind11 封装)、内嵌且**完全移植的
DAD 对齐的 Java 反编译器**,以及用于 agent 集成的 MCP 和 FastAPI/SSE 后端。
专为**移动威胁狩猎 / 恶意软件分诊**而构建 —— 快速、低内存占用、可嵌入且
线程安全 —— 而非用于 Xposed 模块开发。
## 安装(无需 C++ 工具链)
提供适用于 **Linux**(`manylinux_2_28` x86_64)和 **macOS**(x86_64 + arm64,macOS 13.3+),
CPython **3.9–3.13** 的 wheel 包。`pip` 会自动选择与您的平台/Python 匹配的 wheel 包:
```
pip install dexllm --find-links https://github.com/mobile-threat-hunter/dexllm/releases/expanded_assets/v0.1.0
# + LLM backends (MCP server + FastAPI/SSE);额外依赖从 PyPI 解析:
pip install "dexllm[all]" --find-links https://github.com/mobile-threat-hunter/dexllm/releases/expanded_assets/v0.1.0
```
或者从 [**Releases**](https://github.com/mobile-threat-hunter/dexllm/releases)
页面下载特定的 `.whl` 文件,并运行 `pip install ./that-file.whl`。每个版本还提供了源码分发包
(`.tar.gz`),用于在没有 wheel 包的平台上进行构建(需要 C++20 编译器)。
## 快速开始
```
import dexllm
# 通过内容探测文件而无需加载它(处理伪装的 / 无扩展名的 APKs)
dexllm.identify("/path/to/suspect") # → {format, is_apk, has_manifest, dex_count}
dk = dexllm.DexKit("/path/to/app.apk") # .apk/.jar/.zip, a bare .dex, or a disguised container
# 它涉及哪些 framework APIs?(能力 / 威胁分类)
for ref in dk.list_external_method_refs(framework_only=True)[:10]:
print(ref.java_signature)
# 反编译
print(dk.decompile_method_java("Lcom/example/Foo;->bar()V"))
print(dk.decompile_class_java("Lcom/example/Foo;"))
ast = dk.decompile_method_ast("Lcom/example/Foo;->bar()V") # nested AST + Java text
# 搜索
for m in dk.find_methods_using_strings(["http"]):
print(m)
for site in dk.find_call_sites_to_api("Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I"):
print(site)
```
LLM 后端(需要 `[all]` 额外依赖):
```
python -m dexllm.mcp_server # MCP stdio (Claude Desktop / Cursor / Continue)
uvicorn dexllm.server:app --port 8000 # FastAPI + SSE web backend
```
## 文档
- [docs/usage.md](docs/usage.md) — 完整的 API 指南(L1–L7 搜索 + 反编译 + AST)。
- [docs/architecture.md](docs/architecture.md) — 端口适配器架构 / 反编译器 pipeline。
- [docs/dexkit-vs-art-dex-handling.md](docs/dexkit-vs-art-dex-handling.md) — dexllm 的 DEX
处理与 AOSP/ART 的对比(验证、multidex、跨 dex),包含完整的
`VerifyDex` 与 `DexFileVerifier` 逐项检查明细。
## 缘由
| | dexllm |
|---|---|
| 输入 | `.apk`/`.jar`/`.zip`,纯 `.dex`,或伪装/无扩展名的容器 —— 通过内容(PK / `dex\n` magic)识别,而非文件名;`identify()` 可在不加载的情况下进行探测 |
| APK 加载 | ~28 ms(惰性切片解析 + 加载时结构验证 —— 比 androguard 快约 100 倍;耗时随 APK 大小增加:Telegram 的 39 k 个类 / 5 个 dex 加载耗时约 120 ms) |
| 反编译 | DAD 质量的 Java 代码;逐方法反编译速度比 androguard 快 4.5 倍 |
| Multidex | 先到先得的重复类解析,确定性匹配 —— 与 ART/AOSP 一致,因此加壳工具造成的类冲突会反编译为实际运行的方法体 |
| 内存 | 在包含 39k 个类的应用上占用约 520 MB —— 可进程内嵌入,无需 JVM |
| 并行 | C++ 会释放 GIL → 可通过单个进程内实例实现真正的多线程反编译 |
| 搜索 | L1–L7(名称 / 字符串 / 注解 / 父类 / API 调用点 / xref)—— 比 androguard 快 3–6 倍 |
| AST | `decompile_method_ast` 返回完整的 androguard `dast.py` 嵌套 AST |
| LLM | `dexllm.tools` 目录 → MCP stdio server + FastAPI/SSE Web 后端 |
## 格式错误的 dex 验证(对比 ART `DexFileVerifier`)
dexllm 会处理对抗性输入,因此在核心解析之前,每个 dex 都会通过加载时结构验证器 ——
`VerifyDex` —— 进行处理。被拒绝的 dex 会抛出包含字节级原因
(`dk.verify_report()`)的异常;有效的 dex 不会受到影响。它是 AOSP ART
`DexFileVerifier` 的可读性极高的 1:1 移植,侧重于**崩溃安全**,而非执行可信度。
| 阶段 (ART `dex_file_verifier.cc`) | 对比 ART |
|---|---|
| `CheckHeader` / `CheckMap` | ✅ 一致 —— magic/版本/大小/字节序,节边界,映射顺序/对齐/必选项 |
| `CheckIntraSection` | ✅ 一致 —— string_data MUTF-8,id 索引,type_list,code_item,class_data,encoded_array · **⊕ 外加 `VerifyInsns`**(逐指令操作数边界检查,ART 将其保留在*runtime*方法验证器中,而非结构验证器中) |
| `CheckInterSection` | ✅ 一致 —— id 排序/唯一性,descriptor + 成员名称语法,class_def 语义(重复 / 自继承 / 定义者匹配) |
**特意未检查的内容** —— 与只读分析器无关的执行信任机制,或
超出结构范围的检查:adler32/SHA-1 校验和、指令*数据流*语义、annotations、
debug_info、call_site/method_handle、proto shorty-match、access-flag 位掩码,以及
偏移量→map-type 的交叉检查。
**已验证:** 干净的语料库 0 误拒 · 26/26 C++ 测试套件通过 · ASan 语料库 + 格式错误的 dex 模糊测试
**0 heap-overflow/UAF/SEGV**(在没有结构验证器的情况下,相同的模糊测试会导致 66/120 的用例发生段错误)。
验证器使加载时间增加约 58%(仍比 androguard 快约 100 倍);反编译吞吐量不受影响。
## 对比 androguard 的基准测试
dexllm 将 androguard 的 DAD 反编译器移植到了 C++,因此该对比纯粹是关于运行时
(native 对比 Python)和输出一致性,**单线程、相同的 APK / 相同的方法**。
**APK:** `com.example.android.tvleanback.apk` — 4135 个类 · 500 个方法的反编译样本
(Ryzen 9 9950X,Python 3.13):
| 操作 | dexllm | androguard | 加速比 |
|---|---|---|---|
| APK 加载(包含结构验证) | **27.8 ms** | 2.83 s | 102× |
| 反编译 — 方法 (500) | **28.4 ms** | 128.9 ms | 4.5× |
| └ 逐方法 | **0.06 ms** | 0.26 ms | 4.5× |
| 反编译 — 整个类 (200) | **77.6 ms** | 368.7 ms | 4.8× |
| 搜索:使用字符串 `"http"` 的方法 | **1.95 ms** | 8.28 ms | 4× |
| 搜索:`Log.d` 的调用点 | **0.27 ms** | 1.22 ms | 5× |
**对比 androguard 的输出一致性**(缩进归一化后):方法字节级完全一致 **92.4 %** (462/500) ·
整个类的代码行重叠率 **94.0 %**。残余的差异属于语义等价(变量名
后缀),或者是 dexllm 输出了规范正确的 Java 代码而 androguard 出错的情况。
**并行反编译** — dexllm 在 `decompile_*` 期间释放了 GIL,因此线程可以在同一个共享实例上实现真正的
并行处理(androguard 根本无法使用线程)。对相同的 4135 个类进行的全 APK 反编译:
| dexllm | 实际耗时 | 加速比 |
|---|---|---|
| 顺序执行(1 线程) | 1.85 s | 1.0× |
| 16 线程(物理核心) | 178 ms | **10.3×** |
| 32 线程(SMT,共享实例) | 191 ms | 9.6× |
在接近物理核心数量时达到峰值;SMT 线程因调度器竞争而出现轻微退化。
端到端(并行反编译 + 加载)对比 androguard 单线程:**快约 59 倍**。
## 许可证
Apache-2.0。内置了引入的 [LuckyPray DexKit](https://github.com/LuckyPray/DexKit)
核心(遵循其自身的许可证)。
标签:DAST, Java反编译, MCP, 云安全监控, 云资产清单, 安卓安全, 恶意软件分析, 逆向工具, 逆向工程, 静态分析