reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
# AI 辅助逆向工程
> LLM 驱动反编译 / 多 Agent 验证 / 神经语义恢复
> 2025-2026 最大范式转变
## 核心工具与模型
### LLM4Decompile
- 首个将 LLM 用于二进制→源码反编译的开源框架
- 支持 x86/ARM/MIPS 多架构
- 输入: 汇编代码 → 输出: C 源码
- 训练数据: 百万级 源码-汇编 对
### Decaf (2026)
- **编译器反馈验证**: 将 LLM 生成的源码→编译→对比原始二进制
- 效果: 反编译率 26% → 83.9% (ExeBench Real -O2)
- 关键洞察: 反馈循环比更大模型更有效
### Constraint-Guided Multi-Agent (2026)
- 三级验证管道:
1. 语法正确性 (解析)
2. 可编译性 (GCC)
3. 行为等价性 (LLM 生成测试用例)
- 84-97% 可重执行率,每次仅 $0.03-0.05
### REMEND (2026)
- 专项: 从二进制提取数学方程
- 89.8-92.4% 准确率 (跨 3 ISA × 3 优化级别 × 2 语言)
- 速度: 0.132s/函数, 仅 12M 参数
### Glaurung
- 开源 Ghidra 替代,Rust 内核 + Python 绑定
- **AI 原生架构**: LLM Agent 嵌入每个分析层
- 证据制品: plain/rich/JSON/JSONL 多格式输出供 LLM 消费
- 支持: ELF/PE/Mach-O、x86/ARM/RISC-V、IOC 检测、熵分析
## 工作流:AI 增强二进制分析
### 1. LLM 辅助快速侦察
```text
□ strings 提取 → LLM 语义分类(URL/密钥/路径/协议)
□ 导入表分析 → LLM 推断功能(加密=OpenSSL? 网络=libcurl?)
□ 反汇编片段 → LLM 识别模式(密码算法、反调试、虚拟机检测)
□ 错误消息 → LLM 推断上下文("Invalid license" → 授权逻辑位置)
```
### 2. 神经反编译
```bash
# LLM4Decompile
python llm4decompile.py --binary target.so --arch arm64 --output target.c
# 验证结果(重编译 + 对比)
gcc -O2 -o target_recompiled target.c -fPIC -shared
# → 验证输出行为等价性
```
### 3. Multi-Agent 验证
```text
Agent 1 (语法): 检查生成的 C 代码是否可以 parse
↓ 失败 → 反馈错误信息给 LLM 重试
Agent 2 (编译): GCC 编译 → 检查 warnings/errors
↓ 失败 → 反馈编译错误给 LLM
Agent 3 (行为): LLM 生成输入 → 运行原始和重编译版本 → 对比输出
↓ 不一致 → 反馈差异给 LLM → 迭代修正
```
### 4. LLM 辅助静态分析
```text
□ 函数重命名: 输入反编译伪代码 → LLM 建议语义化名称
□ 类型恢复: 分析上下文 → LLM 推断结构体/类定义
□ 算法识别: 汇编片段 → LLM 识别密码算法(AES/TEA/RC4/自定义)
□ 协议逆向: 网络包序列 → LLM 推断协议格式
□ 注释生成: 反编译代码 → LLM 生成中文/英文注释
```
### 5. macOS/iOS 私有框架逆向 (MOTIF)
```text
问题: macOS 私有框架无文档,类型信息缺失
方案: LLM 分析使用模式 → 推断方法签名和参数类型
效果: ObjC 签名恢复 15% → 86% (vs 静态分析)
```
## LLM Prompt 模板
### 函数语义分析
```
You are a reverse engineering expert. Analyze this decompiled function:
[伪代码]
1. What does this function do? (one sentence)
2. Suggest a meaningful function name.
3. What are the input parameters and their likely types?
4. What is the return value?
5. What external APIs/functions does it depend on?
6. Any security-relevant operations (crypto, auth, network, file I/O)?
```
### 算法识别
```
Analyze this assembly/disassembly for cryptographic operations:
[汇编代码]
1. Is this a known cryptographic algorithm? (AES/DES/RC4/TEA/ChaCha20/custom?)
2. Identify the key schedule and round structure.
3. What is the key size?
4. Are there any hardcoded constants that identify the algorithm?
```
### 协议格式推断
```
Given this network packet sequence, infer the protocol structure:
[hex dump]
1. Identify magic bytes and length fields.
2. Propose a struct definition for the packet header.
3. What field(s) appear to be checksums/CRCs?
4. Is this a known protocol or custom?
```
## 工具选型
| 场景 | 推荐工具 | 成本 |
|------|---------|------|
| 快速反编译 | LLM4Decompile | 免费 (本地 GPU) |
| 高精度反编译 | Constraint-Guided Multi-Agent | ~$0.05/二进制 |
| 数学函数提取 | REMEND | 免费 |
| 全平台 RE | Glaurung (Rust) | 免费开源 |
| LLM 交互 | Claude API / GPT-4 / DeepSeek | ~$0.01-0.10/次 |
## 局限性
- **复杂控制流**: 虚拟化/混淆代码仍困难(控制流平坦化、VMProtect)
- **间接调用**: 虚函数表、函数指针难以恢复
- **内联函数**: 编译器内联后边界模糊
- **浮点运算**: 向量化指令的语义恢复有待提升
- **上下文窗口**: 大函数 (>1000 行) 超出 LLM 上下文限制
Source: Decaf (2026), REMEND (2026), Constraint-Guided Multi-Agent Decompilation (2026), LLM4Decompile, Glaurung

View File

@@ -0,0 +1,298 @@
# 非 PE / 多格式 Agent 响应菜谱 U–AV + AW–DN
> 与 PE 反调试菜谱 A–T(../anti-analysis.md)并列:按**文件类型**给出「触发 → 动作一行 → Evidence」。
> **不是**第二套主流程。Triage 识别类型后跳转到对应 skill + 本表。
> 默认 **授权隔离 lab / 已授权样本与设备**。格机、BYOVD、反射注入等写**检测与取证**,不写未授权破坏/利用教程。
> 绕过或还原失败也 MUST 记 Evidence;禁止静默当「无害」。
>
> §1–§8 / U–AV = 原始规则(Issue #65)。§9–§23 / AW–DN = 扩展规则(Issue #87,去重后 + 语义增强 + edge-case 补丁)。
## 0. 路由速查
| 类型线索 | 主 skill | 本表章节 |
|----------|----------|----------|
| .bat / .cmd / 批处理 | malware-analysis | §1, §19 |
| .ps1 / PowerShell | malware-analysis | §2, §20 |
| Office 宏 / VBA / XLM / .docm/.xlsm | malware-analysis | §3 (含 DD OLE 提取, DJ XLM 宏) |
| .docx/.xlsx/.pptx OOXML 外链 / DDE / .rtf OLE | malware-analysis | §10 (含 DK RTF) |
| Web/前端 JS 混淆、JSVMP | js-reverse | §4, §21 (含 DE/DF) |
| .sys / 内核驱动 | reverse-engineering/kernel-driver-reverse.md + cre | §5 |
| .dll 侧重点 | malware-analysis / re-agent-workflow | §6(与 A–T 去重) |
| APK / Magisk / 隐藏图标 | apk-reverse | §7–§8, §23 |
| .pdf / PDF 文档 | malware-analysis | §9 |
| .wasm / WebAssembly | reverse-engineering | §11 |
| .jar/.class / Java 字节码 | reverse-engineering | §12 |
| .exe(AutoIt) / .au3 | malware-analysis | §13 |
| .hta / HTML Application | malware-analysis | §14 |
| .wsf/.jse/.vbe | malware-analysis | §15 |
| .msi / Windows Installer | malware-analysis | §16 |
| .reg / 注册表脚本 | malware-analysis | §17 |
| .vbs / VBScript | malware-analysis | §18 |
| Xposed/LSPosed 模块 | apk-reverse | §22 |
| ELF / Linux 二进制 | reverse-engineering | → elf-analysis.md, anti-analysis.md |
| Mach-O / macOS/iOS | reverse-engineering | → platforms.md |
| Python 字节码 | reverse-engineering | → languages.md |
## 1. BAT/CMD(U V W)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **U** | 大量 SET 单字符变量 + %a%%b% 拼接,或 ^ 续行拆命令 | 逐行展开 SET;还原后命令列表;可用 batch 脱混淆工具;**禁止**未还原就当「无动作」 | E-batch-deobf | P0 |
| **V** | 文本打开乱码,HEX 头 FF FE(UTF-16 LE BOM) | 确认 BOM → 转 UTF-8 再解析;或 chcp 65001 + type | E-batch-encoding | P2 |
| **W** | 大量 REM/::、冗余 GOTO/标签淹没真实逻辑 | 去注释;梳 GOTO 真路径;隔离执行抓 cmd 实际命令日志 | E-batch-deadcode | P1 |
## 2. PowerShell(X Z)
> 编号保留提出者习惯:**无补丁 Y**。
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **X** | 多层 FromBase64String / Gzip / Compress / 嵌套 -replace | **逐层**解码;每层结果单独记;工具可选(PowerDecode 等),无工具则手工/脚本 | E-ps-decode-layer-N | P0 |
| **Z** | 字符串倒序、碎片 + 拼接后 Invoke-Expression/IEX | 还原完整串;对 IEX 下断或脚本块日志;明文命令入 Evidence | E-ps-string-restore | P1 |
## 3. VBA 宏 / XLM(AA AB AC DD DJ)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AA** | olevba/OLEDump 仅见 P-Code、源码流空(VBA Stomping) | P-Code 反编译工具;不全则 Word/Excel 宏调试观察;写清限制 | E-vba-pcode | P0 |
| **AB** | 大量 Chr() 拼接或 Base64 串,疑 shellcode/嵌套脚本 | 立即窗口/脚本还原串;解码后判类型;动态盯 CreateObject/Shell | E-vba-str-decode | P1 |
| **AC** | 无意义 If 1=2、或 InsertLines/DeleteLines 自修改 | 静跟真分支;动态 bp 自修改 API 并 dump 改后宏 | E-vba-selfmod | P2 |
| **DD** | olevba/oledump 检出 VBA 宏项目(vbaProject.bin);扩展名 .docm/.xlsm/.pptm | oledump.py 检查 OLE 流结构;olevba 提取 VBA 源码检测可疑 API;检查 AutoOpen/Workbook_Open 等自动执行宏 | E-office-vba | P0 |
| **DJ** | .xls/.xlsm 含 Excel 4.0/XLM 宏(隐藏在单元格公式中,非 VBA 流);olevba 检出 XLM 宏标记 | olevba --xlm 提取 XLM 宏公式;检查隐藏工作表中的 EXEC/CALL/REGISTER 函数;XLMMacroDeobfuscator 动态仿真还原 | E-office-xlm | P0 |
## 4. JavaScript(AD AE AF)→ 主路径 js-reverse
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AD** | 自定义字节码数组 + while/switch 解释器(JSVMP) | 找 VM 入口与 opcode 分发;动态日志轨迹;AST+动态双轨;见 js-reverse DeepDive | E-js-vmp | P0 |
| **AE** | while(1){switch} + 大字符串数组下标 | AST/Babel 重构;数组下标还原字符串;wakaru 等可选;**勿**整份粘贴 PE ollvm-deobfuscation 长文 | E-js-deobf | P0 |
| **AF** | debugger、劫持 console、performance.now 差、DevTools 检测 | 停用断点/固定时间源/无头浏览器;patch 检测点;授权页面 | E-js-anti-debug | P1 |
## 5. SYS 内核驱动(AG AH AI)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AG** | DriverEntry 很短,逻辑不在入口 | 扫 MajorFunction[] 非空槽;优先 IRP_MJ_DEVICE_CONTROL/CREATE;地址列表入证 | E-driver-irp-handlers | P0 |
| **AH** | 存在 DeviceIoControl / IOCTL 分发 | 建控制码→处理函数表;标 METHOD_* 与缓冲方向;用户态通信面 | E-driver-ioctl | P0 |
| **AI** | 样本加载/投放知名脆弱驱动或异常签名驱动(BYOVD 模式) | 对照 LOLDrivers 等**公开**列表;记驱动名/哈希/签名;分析**调用意图**;**不**展开 exploit 步骤 | E-driver-byovd | P1 |
详见 kernel-driver-reverse.md 流程;本表只补 agent 动作锚点。
## 6. DLL(AJ–AQ)— 与 A–T / #72 去重
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AJ** | DLL 分析只看了导出/EP,忽略 TLS 或 DllMain | **TLS 回调 + DllMain 都必须看**;动态断点顺序仍遵循四级火箭(TLS→EP/DllMain→API→ExitProcess) | E-dll-tls-dllmain | P0 |
| **AK** | 导出名前良后恶、错名、或导出与行为不符 | 导出表与实际调用交叉;异常导出列表 | E-exports-anomaly | P0 |
| **AL** | 无导出或导出极少,仍被加载 | 从入口、字符串、xrefs、调用方定位;不要因「无导出」放弃 | E-dll-noexport | P0 |
| **AM** | 静态 IAT 缺 DLL、运行时才用 | **See A–T 补丁 R**(Delay-Load / E-delay-import),此处不双写长文 | E-delay-import | P0 指针 |
| **AN** | 需还原导出函数参数与调用约定 | 交叉引用 + 动态看寄存器/栈;标注 stdcall/fastcall 等 | E-dll-export-abi | P1 |
| **AO** | 疑 DLL 劫持/侧加载 | 查应用目录同名 DLL、搜索路径、KnownDLLs;合法程序+异常 DLL 组合 | E-dll-sideload | P1 |
| **AP** | 无文件映射/反射加载线索 | 内存特征、加载器行为、无路径模块;授权环境取证 | E-dll-reflective | P1 |
| **AQ** | 仅因导出名「不像恶意」降风险 | **禁止**只凭导出名判安全;结合段权限、入口、字符串、动态行为 | E-dll-export-priority | P1 |
DLL/SYS 硬门仍:E-imports + E-exports(见 re-agent-workflow)。
## 7. Android 格机 / 持久化(AR AS AT)→ apk-reverse
> **仅授权样本、镜像或测试设备。** 动作是检测、提取 IOC 与持久化路径,不是实施破坏。
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AR** | Magisk 模块/脚本含删库、刷写、批量 rm 系统分区等**格机特征命令** | 特征命令表 + 模块路径;标高危破坏能力;不执行格机命令 | E-android-wiper-cmd | P0 |
| **AS** | 循环 curl|sh / 远程拉脚本、非常规 C2 URL | 提 URL;分析下载体是否含格机命令;记临时路径 | E-android-wiper-backdoor | P0 |
| **AT** | /data/adb/service.d、post-fs-data.d、可疑 /system/priv-app 等 | 列持久化脚本/APK;内容摘要入证 | E-android-persistence | P1 |
## 8. Android 透明/隐藏图标(AU AV)→ apk-reverse
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AU** | LAUNCHER 图标全透明/空 label、Theme.NoDisplay、无 LAUNCHER category、组件 disabled | aapt dump badging + manifest;反编译查图标像素;异常项入证 | E-android-hidden-icon-manifest | P0 |
| **AV** | 已装但桌面无图标,后台流量/自启/高危权限/动态恢复图标 | pm list vs 桌面;dumpsys package;广播与 device_admin;行为入证 | E-android-hidden-icon-behavior | P1 |
---
> **以下 §9–§23 为 Issue #87 扩展规则(AW–DC)。**
> 已去除与现有文件重复的 ELF(→ elf-analysis.md)、Mach-O(→ platforms.md)、Python(→ languages.md)章节。
## 9. PDF 恶意文档(AW AX AY AZ)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AW** | pdfid 检出 /JS、/JavaScript、/OpenAction、/AA、/Launch 计数 >0(含 hex 编码名称如 /4A#61#76#61... 的混淆计数) | pdfid -e 统计(对比 plain vs obfuscated 计数);pdf-parser 提取可疑对象;peepdf 交互分析 + JS 仿真 | E-pdf-autoaction | P0 |
| **AX** | pdfid 检出 /EmbeddedFile >0;对象流含 FlateDecode/ASCIIHexDecode 级联过滤器链;或 /Annot 对象中隐藏编码载荷 | pdf-parser 提取流数据;peepdf 解码多层级联过滤器(含 AES 加密流 security handler r5/r6);检查 Annotation 对象;file 识别解码结果类型 | E-pdf-embedded | P0 |
| **AY** | 提取的 PDF JS 含大量 eval、unescape、String.fromCharCode、atob | peepdf JS 仿真环境执行跟踪;逐层解码 Base64/Hex/ROT13;CyberChef 辅助 | E-pdf-js-deobf | P1 |
| **AZ** | PDF 结构异常:/JBIG2Decode、XREF 表被操纵、对象编号跳跃 | pdfid -d 重命名可疑关键字;检查已知 CVE 利用模式;提取 exploit 触发条件 | E-pdf-exploit | P1 |
## 10. Office OOXML / DDE / RTF(BA BB DK)→ 与 §3 VBA 互补
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BA** | docx/xlsx/pptx ZIP 解压后 word/_rels/ 或 xl/_rels/ 中含可疑外部关系(含 remote template injection) | 检查 *.rels 外部链接;检查 vbaData.xml;提取嵌入 OLE 对象;检查协议处理器滥用(ms-msdt: / search-ms: / ms-officecmd:) | E-office-ooxml | P0 |
| **BB** | 文档含 DDEAUTO 或 DDEEXEC 域代码,通过域执行外部命令 | olevba --dde 扫描;提取 DDE 命令参数;检查是否指向 PowerShell/外部 exe | E-office-dde | P0 |
| **DK** | .rtf 文件含嵌入 OLE 对象(非 OOXML、非经典 OLE 复合文档) | rtfobj 提取嵌入 OLE 对象;oleobj 分析对象类型;检查 Equation Editor 漏洞利用(CVE-2017-11882 等);file 识别提取物类型 | E-rtf-ole | P0 |
## 11. WebAssembly(BC BD BE)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BC** | 文件以 \x00asm 魔术字节开头;或 JS 代码含 WebAssembly 实例化逻辑 | wasm2wat 转文本;检查 import 段识别宿主环境导入函数;wasm-decompile 生成伪代码;检查 Emscripten 胶水签名(__wasm_call_ctors)判断是否由 JS 编译而来 | E-wasm-struct | P0 |
| **BD** | WASM 函数数量多但逻辑简单、函数体被拆分为微小函数;或存在无意义 block/loop 嵌套 | diswasm 评估函数最小化级别;JEB Pro / IDA WASM 插件深度分析;动态追踪执行日志 | E-wasm-obfuscation | P1 |
| **BE** | WASM 模块通过 JS 导入/导出函数与浏览器交互,存在 WebSocket、fetch、WebGL 调用 | 同时分析 JS 胶水代码和 WASM 模块;浏览器 DevTools 追踪数据交换;提取网络通信 URL/域名 | E-wasm-c2 | P1 |
## 12. Java JAR/Class(BF BG BH BI)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BF** | JD-GUI/jadx 打开 JAR 时类名/方法名为无意义短字符(a.a.a / _0x 前缀 / 数字类名);或大量 while/switch 控制流混淆 | 识别混淆器类型(ProGuard / Allatori / ZKM);Java Deobfuscator 静态反混淆;高强度时动态调试追踪关键逻辑 | E-java-obfuscation | P0 |
| **BG** | 大量 Class.forName()、Method.invoke()、Constructor.newInstance();或自定义 ClassLoader + defineClass() 从字节数组内存加载类;导入表无害但运行时动态加载恶意类 | javap -c -v 查看反射调用细节;追踪 Class.forName 参数字符串;检查 defineClass() 字节数组来源;动态对 Method.invoke 下断 | E-java-reflection | P0 |
| **BH** | JAR 含 .so(Linux/Android)或 .dll(Windows);或 System.loadLibrary() 调用 | 提取原生库文件;file 识别格式;转入 ELF/PE 独立分析流程 | E-java-native | P1 |
| **BI** | JAR/ZIP 解压后含嵌套 JAR/WAR/EAR;/resources、/assets 中存在高熵 .dat/.bin/.img 文件 | 递归解压所有嵌套归档;熵值分析判断加密/压缩;检查 META-INF/MANIFEST.MF 和 pom.xml | E-java-nested | P1 |
## 13. AutoIt(BJ BK BL DM)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BJ** | PE 字符串含 AutoIt / AU3 / EA05 / EA06 签名;或资源节含 AutoIt 脚本资源(注意与 AutoHotKey 区分,MITRE T1059.010 两者共用) | autoit-ripper 提取编译脚本;识别编码家族(EA05 = AutoIt3.00 / EA06 = AutoIt3.26);EA06 头部后提取 8 字节解密密钥用于解密载荷;还原源码 | E-autoit-extract | P0 |
| **BK** | 提取脚本含大量 StringEncrypt/_StringEncrypt;或 Execute 动态执行 + 无意义变量名 | myAutToExe 静态反编译;识别反调试技术;分析混淆后控制流 | E-autoit-deobf | P1 |
| **BL** | 脚本含 RegWrite(注册表持久化)、FileInstall(文件释放)、InetGet(网络下载)、Run/RunWait | 标记敏感 API 调用序列;分析 InetGet URL;追踪 FileInstall 释放路径 | E-autoit-malicious | P0 |
| **DM** | AutoIt 作为 loader 执行进程空洞注入(process hollowing):CallWindowProc/EnumWindows 回调 + shellcode + 注入合法进程(regsvcs.exe 等),释放 .NET 载荷(DarkGate / Snake Keylogger / ArechClient2 模式) | 检查 DllCall/DllCallbackRegister 对 kernel32 注入 API 的调用链;提取 shellcode 数据;识别被注入目标进程;提取 .NET 载荷独立分析 | E-autoit-hollowing | P0 |
## 14. HTA / HTML Application(BM BN BO)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BM** | HTML 含 HTA:APPLICATION 标签、window.execScript 或 CreateObject 调用 | 检查 HTA:APPLICATION 属性(Application、WindowState);提取 script 标签中的 VBS/JS | E-hta-bypass | P0 |
| **BN** | HTA 通过 mshta.exe 启动后 XMLHttpRequest / ActiveXObject 远程拉 Payload 执行 | 提取网络请求 URL;跟踪 ActiveXObject 创建(ADODB.Stream 等);还原完整下载执行链 | E-hta-download-chain | P0 |
| **BO** | HTA 仅含单行极长混淆字符串,经 eval / execScript 执行 | 提取 Base64/Hex 编码载荷解码;CyberChef 递归检测编码类型;还原载荷 | E-hta-oneline | P1 |
## 15. WSF / JSE / VBE(BP BQ BR BS)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BP** | .wsf 含 \<job\> + \<script language="..."\> 标签,混合 JScript/VBScript/Python | 按 \<script language\> 分割代码块;分别按对应语言规则分析 | E-wsf-multi | P0 |
| **BQ** | .jse/.vbe 开头含 #@~^ 签名,Microsoft Script Encoder 编码 | screnc-decoder 解码;无工具时动态执行 + dump 解码脚本 | E-jse-decode | P0 |
| **BR** | WSF 多 \<script\> 块 + \<package\> 引用外部资源 + \<component\> 引用 COM 组件 | 建立跨块调用图;追踪 \<script\> 之间函数调用;还原完整执行流程 | E-wsf-call-chain | P1 |
| **BS** | WSF 含 WshShell.SendKeys 绕过 UAC、WshShell.Run 配合 0 窗口隐藏、WScript.Sleep 延时绕过 | 检查用户模拟操作是否用于绕过安全提示;记录隐蔽执行参数 | E-wsf-anti-detect | P1 |
## 16. MSI 安装包(BT BU BV)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BT** | MSI 文件含 CustomAction 表(Binary / Script / DLL 类型自定义操作) | msiexec /a 或 lessmsi 提取内容;检查 CustomAction 表;提取自定义操作二进制文件 | E-msi-custom-action | P0 |
| **BU** | MSI Binary 表含 VBScript/JScript 自定义操作脚本 | 从 Binary 表提取脚本二进制解码为可读脚本;按 VBS/JS 规则分析 | E-msi-script | P1 |
| **BV** | MSI 通过 /quiet /passive /qn 静默安装;ALLUSERS=1 提权 | 记录安装命令行参数;分析 Property 表权限设置;标记静默+提权组合 | E-msi-privilege | P1 |
## 17. REG 注册表脚本(BW BX BY)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BW** | .reg 写入 HKCU\...\Run 或 HKLM\...\Run 等自动启动路径 | 提取所有路径;标记 Run 路径条目为持久化;记录完整路径和值 | E-reg-persistence | P0 |
| **BX** | .reg 修改 HKCR\...\shell\open\command(文件关联)或 HKCR\CLSID\{...}\InprocServer32(DLL 注入) | 检查 shell\open\command 是否为非常规 exe;检查 InprocServer32 DLL 路径 | E-reg-hijack | P0 |
| **BY** | .reg 修改 HKLM\...\Policies\System(UAC 级别)、EnableLUA、ConsentPromptBehaviorAdmin | 检查修改前默认安全配置;分析对 UAC 的影响;标记降级行为 | E-reg-uac-bypass | P1 |
## 18. VBScript(BZ CA CB CC DN)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **BZ** | .vbs/.js 同时被 VBScript 和 JScript 解析;条件编译(@_win32)或语言特性交叉执行 | 分离 VBScript/JScript 代码块;分别语法分析;识别混合执行逻辑 | E-vbs-mixed | P1 |
| **CA** | 脚本含 CreateObject("WScript.Shell") / CreateObject("Shell.Application") / Scripting.FileSystemObject | 标注高危 COM 对象调用;跟踪 Run/Exec 参数;追踪 FSO 创建的文件路径 | E-vbs-com-abuse | P0 |
| **CB** | 脚本开头 #@~^ 签名,Microsoft Script Encoder 编码(VBS 专有) | screnc-decoder 解码;无工具时动态执行 + dump 解码脚本 | E-vbs-encoded | P0 |
| **CC** | VBA/VBScript 含 WScript.Shell.Run + cmd /c + PowerShell,后续进程注入 | 追踪 CreateObject COM 对象链;分析 Run 参数中注入特征;记录完整进程创建链 | E-vbs-inject-chain | P0 |
| **DN** | VBScript/JScript 通过 WMI ActiveScriptEventConsumer 实现无文件持久化(无启动文件夹/注册表 Run 键) | 检查 WMI 事件订阅(__EventFilter + __FilterToConsumerBinding + ActiveScriptEventConsumer);提取绑定脚本内容;标记无文件持久化 | E-vbs-wmi-persist | P0 |
## 19. BAT/CMD 高级混淆(CD–CI)→ 与 §1 U–W 互补
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **CD** | setlocal enabledelayedexpansion + !var! + 动态变量名(!var_%i%!) | 启用延迟扩展后逐条展开;Batch-Dump --expand 自动展开 | E-bat-delayed-expand | P0 |
| **CE** | 通过 type/more/findstr 读取自身或文件的 :stream ADS 替代数据流执行 | 检查 : 后缀引用(file.bat:payload);dir /r 列 ADS;type file:stream 提取 | E-bat-ads-hidden | P0 |
| **CF** | 大量 echo 逐行写入 .tmp/.cmd 临时文件再 call 执行 | 提取所有 echo 重定向还原临时文件内容;监控临时目录生成的脚本 | E-bat-temp-gen | P1 |
| **CG** | for %%i in (...) do set var=%%i 累加变量;for /f 逐行解析命令输出 | 逐条展开 for 循环记录每次迭代赋值;序列化还原 for /f 结果 | E-bat-for-expand | P1 |
| **CH** | 主批处理通过 %1 %* 接收参数,由父进程/下载器传入混淆指令 | 检查调用上下文记录传入参数;Base64 参数解码还原;还原完整调用链 | E-bat-param-call | P1 |
| **CI** | certutil -decode / powershell -Command / echo \| findstr 组合解码执行 | 提取 Base64/Hex 字符串解码;检查解码结果是否为可执行脚本/PE | E-bat-encoded-exec | P0 |
## 20. PowerShell 高级绕过(CJ–CO, DL)→ 与 §2 X–Z 互补
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **CJ** | [Ref].Assembly.GetType('...AmsiUtils') / amsiInitFailed / GetTypes() 等 AMSI 绕过(含硬件断点绕过:CPU 调试寄存器,无内存写入/VirtualProtect) | 识别绕过模式(Patch / 注册表 / 环境变量 / 硬件断点);动态确认生效;标记绕过技术类型 | E-ps-amsi | P0 |
| **CK** | [PSConstraintLanguage] 类型操作或通过 DefaultRunspace 修改会话状态绕过 CLM | 识别 CLM 绕过模式;标记 bypass-clm;分析绕过后执行上下文 | E-ps-clm-bypass | P0 |
| **CL** | [ScriptBlock]::Create / $ExecutionContext.InvokeCommand 构造器;或覆盖 ScriptBlock 日志设置 | 检查脚本是否禁用日志记录;动态验证日志是否被绕过 | E-ps-sb-log-bypass | P1 |
| **CM** | IEX (New-Object Net.WebClient).DownloadString(...) 或 [Reflection.Assembly]::Load(FromBase64...) 无文件执行 | 提取下载 URL 检查域名/IP 信誉;PS 日志捕获内存加载代码;隔离网络模拟提取载荷 | E-ps-reflect-load | P0 |
| **CN** | 三层以上编码嵌套:外层 Base64 → Gzip → XOR → 明文(超出 §2 X 的两层范围) | 递归解码到明文或无法继续;每层记中间状态;PowerDecode 自动化;每层结果入证 | E-ps-multi-decode | P0 |
| **CO** | Set-Alias 将 IEX 映射为单字符别名;Get-ChildItem variable: 动态获取变量值 | 展开所有别名映射替换回原始命令名;AST 分析还原变量 | E-ps-alias-decode | P1 |
| **DL** | 脚本含 ntdll.dll EtwEventWrite 补丁(stomping)静默遥测;常与 AMSI 绕过组合使用 | 检查是否存在 EtwEventWrite 地址获取 + 内存补丁(ret 0xC3);与 CJ AMSI 绕过同时检查;标记双绕过组合 | E-ps-etw-bypass | P0 |
## 21. JavaScript 高级混淆(CP CQ DE DF)→ 与 §4 AD–AF 互补
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **CP** | JS 使用 Proxy 对象拦截属性访问 + Reflect API 动态调用方法绕过静态分析 | 识别 Proxy get/set/apply 陷阱函数;追踪 Reflect.get 实际目标;标记动态拦截行为 | E-js-proxy | P1 |
| **CQ** | JS 含 _0x... 十六进制字符串数组 + while(!![]) 死循环 + for+switch 控制流(obfuscator.io 特征) | 识别 obfuscator.io 特征(字符串数组+死循环);de4js / jsnice 自动反混淆;还原后代码入证 | E-js-obfuscator | P0 |
| **DE** | JS 主体为大型字节码数组 + VM 解释器循环(多 while/switch),入口指向 eval/Function 构造器;业务逻辑完全不可读(§4 AD 的深化) | 识别 VM 入口函数跟踪 opcode→处理函数映射;浏览器动态执行 Hook eval 输出;JSimplifier AST 重构;记录 opcode 映射表 | E-jsvmp-deep | P0 |
| **DF** | JS 含 eval 动态生成新代码并立即执行、document.write 重写页面、或 Function 构造器动态构造函数体 | Hook eval 和 Function 构造函数记录生成的代码;浏览器动态执行捕获自修改内容 | E-js-selfmod | P1 |
## 22. Xposed/LSPosed 模块分析(CR–CX)→ apk-reverse
> 分析 Xposed/LSPosed **模块本身**作为逆向目标(非工具使用场景)。
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **CR** | AndroidManifest.xml 无 android:name 入口 Activity;meta-data 指定 xposedmodule=true | 检查 assets/xposed_init 确定入口类;搜索 IXposedHookLoadPackage/ZygoteInit/CmdInit 接口实现 | E-xp-entry | P0 |
| **CS** | 代码含 XposedHelpers.findAndHookMethod / XposedBridge.hookMethod / findClass | 提取 findAndHookMethod 第一参数(目标类)+ 第二参数(目标方法);建立目标应用清单 | E-xp-hook-targets | P0 |
| **CT** | 模块含 DexClassLoader/PathClassLoader 动态加载;或 Runtime.exec / ProcessBuilder 执行命令 | 追踪 DexClassLoader 构造参数;提取动态加载 DEX 独立分析;检查 exec 命令参数 | E-xp-dynamic-load | P0 |
| **CU** | Hook 目标涉及支付/生物识别/短信/通讯录/位置/加密密钥等敏感 API | 对 Hook 目标类/方法进行敏感度分类;标记支付类/生物识别类/短信通讯录类;汇总威胁等级 | E-xp-sensitive-hooks | P0 |
| **CV** | 代码含 XposedBridge 检测规避 / Zygote 注入痕迹清除 / 自定义网络通信 | 检查 stacktrace 修改 / XposedBridge 类引用清除;检查独立网络请求(OkHttp/Socket);识别 C2 目标 | E-xp-anti-detection | P1 |
| **CW** | 代码含 Resources 动态替换 / View 绘制拦截 / AccessibilityService 声明 | 检查 AssetManager 替换 / Resources.updateConfiguration;检查 AccessibilityService 配置;识别 UI 劫持 | E-xp-ui-hijack | P1 |
| **CX** | AndroidManifest.xml 声明 lsposed xposedscope meta-data;或代码含包名白名单检查 | 解析 xposedscope 目标应用范围;检查动态白名单绕过(反射修改 scope);识别全局 Hook 越权 | E-xp-scope-bypass | P1 |
## 23. Magisk 模块深度分析(CY–DC, DG–DI)→ 与 §7 AR–AT 互补
> §7 聚焦格机/破坏行为。本节覆盖非破坏性但可疑的模块行为:安装脚本分析、文件释放、Zygisk 注入、反检测、持久化、提权、横向感染。
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **DG** | Magisk 模块 ZIP 根目录含 config.sh / install.sh;META-INF/com/google/android/update-binary 为非标准安装器 | 提取 config.sh/install.sh 中 on_install/print_modname/set_permissions 函数;检查 update-binary 是否含额外载荷;标记 pm install / dd 块设备 / mount -o remount,rw 操作 | E-mg-install-script | P0 |
| **DH** | ZIP 内含 system/ / vendor/ / data/ 目录结构;或 post-fs-data.sh / service.sh 等开机执行脚本 | 提取释放文件路径识别是否释放 APK 到 /system/priv-app/;检查 service.sh + post-fs-data.sh 内容识别开机自启/后台保活/C2 通信;标记所有写入系统分区操作 | E-mg-file-drop | P0 |
| **CY** | 模块含 zygisk/ 目录(arm64-v8a.so 等原生库);或 config.sh 声明 IS_ZYGISK=true | 提取 zygisk/ 原生库分析 ZygiskModule 回调(onLoad / preAppSpecialize / postAppSpecialize);检查 JNI Hook | E-mg-zygisk | P0 |
| **DI** | 模块脚本写入 /data/adb/service.d/ 或 /data/adb/post-fs-data.d/;或修改 crontab/init.rc(§7 AT 的深化) | 提取写入 service.d + post-fs-data.d 的脚本内容;检查卸载时自动感染其他模块的逻辑(post-uninstall.sh / 模块目录监控);检查 magisk --remove-modules 触发保护机制 | E-mg-persistence | P0 |
| **CZ** | 模块脚本含 resetprop 修改系统属性 / magiskhide / DenyList;或集成 Shamiko(隐藏 Zygisk 本身)/ TrickyStore(篡改证书链)/ PlayIntegrityFork(伪造 Play Integrity API) | 提取所有 resetprop 调用识别被修改属性(ro.debuggable / ro.build.tags 等);检查 DenyList 隐藏自身;识别 Shamiko/TrickyStore/PlayIntegrityFork 模块级反检测 | E-mg-anti-detect | P0 |
| **DA** | 模块脚本含 setenforce 0 / mount -o rw,remount /system / chmod 777 敏感目录 | 检查 SELinux 操作(setenforce/chcon/restorecon);检查系统分区挂载 + dm-verity 禁用;标记高危提权 | E-mg-privilege | P0 |
| **DB** | 释放 APK/脚本含 curl/wget/HTTP 客户端;或释放 APK 申请 INTERNET + READ_CONTACTS/SMS 等敏感权限 | 提取网络请求目标 URL/IP;分析释放 APK 权限声明;识别数据外传逻辑 | E-mg-c2 | P0 |
| **DC** | 脚本遍历 /data/adb/modules/ 目录、修改其他模块文件、或写入自身副本到其他模块 | 检查 module.prop 注入恶意指令;检查其他模块 service.sh 追加恶意代码;识别"寄生"逻辑 | E-mg-cross-infect | P0 |
---
## 24. 约束(全局)
1. **不平行主流程**:阶段门闩仍以 re-agent-workflow / 各 skill 为准。
2. **Evidence 必记**:含失败、半还原、quality= 标注。
3. **与 A–T 去重**:PE 反调试不重复;AM→R;AJ 补 DLL 视角不推翻 TLS 火箭。
4. **工具缺失**:记 n/a + 手工等价,不假装已用商业套件。
5. **授权**:破坏性/注入/驱动漏洞类只做防御分析与取证表述。
6. **扩展规则去重**:ELF → elf-analysis.md;Mach-O → platforms.md;Python → languages.md。本表不重复这些格式的规则。
## 25. P0 最小勾选(类型命中时)
```text
□ bat/cmd → U(+ 需要时 V/W;高级 CD–CI)
□ ps1 → X(+ Z;高级 CJ–CO + DL ETW)
□ vba/xlm → AA + DD + DJ(+ AB/AC)
□ office ooxml/rtf → BA + DK(+ BB 若疑 DDE)
□ js 强混淆 → AD 或 AE(+ AF;高级 CP/CQ/DE/DF)
□ sys → AG + AH(+ AI 若疑 BYOVD)
□ dll → AJ + AK/AL;Delay-Load 走 R
□ apk 破坏/隐藏 → AR/AS 或 AU(+ AT/AV)
□ pdf → AW + AX(+ AY/AZ)
□ wasm → BC(+ BD/BE)
□ jar/class → BF + BG(+ BH/BI)
□ autoit → BJ + BL + DM(+ BK)
□ hta → BM + BN(+ BO)
□ wsf/jse/vbe → BP + BQ(+ BR/BS)
□ msi → BT(+ BU/BV)
□ reg → BW + BX(+ BY)
□ vbs → CA + CB + CC + DN(+ BZ)
□ xposed 模块 → CR + CS + CT + CU(+ CV–CX)
□ magisk 深度 → DG + DH + CY + DI + CZ + DA(+ DB/DC)
```

View File

@@ -0,0 +1,501 @@
# OLLVM 反混淆 / Obfuscator-LLVM Deobfuscation
> 面向 APK .so、ELF 二进制和控制流平坦化场景的 OLLVM 脱密工作流。
> 工具与变种信息基于 2026 年社区活跃项目调研,非训练记忆。
> 适用:Android NDK 加固、CTF 逆向、加壳 .so 分析、商业混淆器对抗。
---
## 0. 快速决策:我该用哪个工具?
根据你的环境和对目标混淆类型的判断,直接对号入座:
| 你的情况 | 首选工具 | 备选 | 说明 |
|---------|---------|------|------|
| 有 IDA Pro 7.5-7.7 + Hex-Rays,想一键去平坦化 | **obpo-plugin** | d810-ng | obpo 用 microcode + 数据流 + 混合执行,效果最强,但是云插件(需联网,核心闭源) |
| 有 IDA Pro(任意较新版本),想本地一站式反混淆 | **d810-ng** | D-810 原版 | 本地、开源、集成 Z3,支持 OLLVM/Tigress/Hodur/Approov 多变种 |
| 有 Binary Ninja | **ollvm-breaker** | — | 针对 Android .so 实战(libvdog 等加固样本) |
| 无 IDA/BN,纯脚本,目标 x86/x64 | **ollvm-unflattener** (Miasm) | angr deflat | 基于 Miasm 符号执行,BFS 多层处理 |
| 无 IDA/BN,纯脚本,目标 x86/x64 | **ollvm-unflattener** (Miasm) | angr deflat | 基于 Miasm 符号执行,BFS 多层处理 |
| 纯 Python 符号执行,CTF 场景 | **angr** Deobfuscator | Triton | 不依赖 GUI,脚本化 |
| 目标是 ARM64 .so,无 IDA | **deollvm** (Unicorn) | angr | 基于 Unicorn 的 ARM64 deflat |
| 遇到 BR 混淆(间接分支) | **DeObfBR** | 设置数据段只读 | Goron/Arkari 风格的 BR 混淆可被数据段只读简单对抗 |
| 遇到 Tigress 混淆 | d810-ng `UnflattenerSwitchCase`/`UnflattenerTigressIndirect` | — | d810-ng 内置 Tigress 专用 unflattener |
> **核心建议:** 优先用 **d810-ng**(本地、维护活跃、变种覆盖广)。云服务可用时 **obpo-plugin** 效果最好。两者都失败再上 **angr/Miasm** 符号执行做定制化处理。
---
## 1. 现代 OLLVM 变种生态(2026 社区调研)
OLLVM 早已不只是 2017 年那个原始仓库。以下是目前活跃的混淆器分支,**脱密前必须先判断目标是哪个变种**,因为不同变种的对抗手段差异很大:
### 1.1 混淆器分支谱系
| 变种 | 基准 LLVM | 相比原始 OLLVM 的新增特性 | 对抗要点 |
|------|----------|----------------------|---------|
| **Obfuscator** (原始) | 3.3~4.0 | sub + bcf + fla(三大基础 pass) | 标准工具均可处理 |
| **Hikari** | 6~8 | Anti Class Dump、Function Call Obfuscate、Function Wrapper、Indirect Branching、Split BB、String Encryption | 需先解密字符串 + 修复间接跳转 |
| **Hikari-LLVM15** | 15~19 | + Anti Debugging、Anti Hook、Constant Encryption | 已闭源;Constant Encryption 增加静态分析难度 |
| **goron** | 7~10 | Indirect Branch/Call/GlobalVariable | ⚠️ Goron 风格间接混淆可被「设置数据段只读」简单对抗 |
| **Arkari** (komimoe/Hikari) | 14~latest | 基于 goron,持续维护 | 同 goron,数据段只读即可部分对抗 |
| **Pluto** | 14 | MBA Obfuscation、Random CF、Split BB、**Trap Angr**(专门坑 angr) | ⚠️ Trap Angr pass 会让 angr 符号执行失效,需换工具或绕陷阱 |
| **Polaris** (原 Pluto) | 16 | Alias Access、Indirect Branch/Call、String Encryption、Merge Function、Linear MBA、Dirty Bytes Insertion、Function Splitting、Junk Insertion | 综合 Hikari+Pluto,最棘手,需分层处理 |
| **O-MVLL** | open-obfuscator | Python 驱动 pass manager;Anti Hooking、Arithmetic(MBA)、BB Duplicate、CF Breaking、Function Outline、Indirect Branch/Call、Opaque Constants | 现代 Android 加固常用,Python 配置易定制 |
| **amice** (Rust) | Rust 实现 | 全套 + VM Flatten、Instruction Virtualization、Delayed Offset Loading、Parameter Aggregation | 含 VM 化,需 VM handler 还原而非单纯 deflat |
| **VMP 系** (SmallVmp/VMPilot/xVMP/VMPacker) | — | 指令虚拟化 | **不属于 OLLVM 范畴**,需 VM 逆向,参考 VM 专用工具 |
### 1.2 关键判断线索
- **Trap Angr**(Pluto/Polaris):如果 angr 跑着跑着爆炸或路径爆炸,怀疑目标用了 Trap Angr pass → 改用 d810-ng 或 Unicorn 动态方法
- **Goron/Arkari 间接跳转**:如果分发器用间接跳转(BR x8 而非 switch),先尝试把相关数据段设为只读,间接跳转目标常变成可静态求解
- **Constant Encryption**(Hikari-LLVM15/Polaris/O-MVLL):常量在运行期解密,纯静态看不到真实值 → 需要 Unicorn 动态执行解密 stub
- **VM Flatten**(amice):控制流变成 VM dispatch loop,**不要当普通 fla 处理**,需要先识别 VM handler 表
---
## 2. OLLVM 混淆类型检测
OLLVM 三大核心 pass 的识别特征:
### 2.1 控制流平坦化 (Control Flow Flattening / `fla`)
**IDA 视图特征:**
- 函数入口先跳转到唯一的分发器(dispatcher)块
- 主逻辑被拆成多个基本块,每个块末尾跳回分发器
- 分发器通过**状态变量**(state variable)决定下一个要执行的块
- 巨大的 `switch` 结构,各 case 之间无逻辑关联
```
Original: OLLVM flattened:
block_A entry -> dispatcher
block_B ↓
block_C state_machine:
switch(state):
0 → block_A
1 → block_B
2 → block_C
```
**变种形态(d810-ng 识别的多种 dispatcher):**
- O-LLVM:switch / if-chain + 状态变量
- Tigress:`m_jtbl`(switch-case)或 `m_ijmp`(间接跳转,需 `goto_table_info` 配置)
- Hodur (PlugX):嵌套 `while(1)` 状态机,`jnz state, #CONST`,**无 switch 分发器**
- Approov:`while(v8 != C)`,状态常量集中在 `0xF6000–0xF6FFF`
### 2.2 虚假控制流 (Bogus Control Flow / `bcf`)
- 每个真实分支间插入**不可达假分支**
- 假分支用**不透明谓词**保护(条件恒真/恒假,但静态分析无法直接证明)
- 大量死代码膨胀函数体积
```c
// 经典不透明谓词:x(x+1) 必为偶数,编译器证明不了
if (x * (x + 1) % 2 == 0) {
// 真实逻辑
} else {
// 不可达垃圾代码
}
```
### 2.3 指令替换 (Instruction Substitution / `sub`) → MBA
- 简单算术/位运算替换为等价复杂表达式(MBA, Mixed Boolean-Arithmetic)
```
a + b → (a ^ b) + 2*(a & b)
a ^ b → (a | b) - (a & b)
a - b → a + (~b) + 1
```
### 2.4 快速分类表
| 混淆类型 | IDA 特征 | 主要对抗手段 |
|---------|---------|------------|
| fla (平坦化) | 巨大 switch + 分发器 | obpo / d810-ng / deflat |
| bcf (虚假控制流) | 不可达分支 + 死代码 | d810-ng opaque predicate removal / 符号执行 |
| sub/MBA | 复杂算术表达式 | d810-ng MBA simplifier / SiMBA (Z3) |
| fla + bcf + sub | 全上,极大膨胀 | **分层去混淆(先 bcf 再 fla 再 sub)** |
---
## 3. 主流工具详解(社区活跃项目)
### 3.1 obpo-plugin — 最强效果,云插件
> [obpo-project/obpo-plugin](https://github.com/obpo-project/obpo-plugin) · 629⭐ · 2026-06 活跃
基于 Hex-Rays **microcode** 的伪代码优化器,使用**数据流跟踪 + 程序切片 + 混合执行(concolic)**重建平坦化控制流。效果是社区公认最强之一。
**关键特性:**
- 在 microcode 层操作,直接优化反编译输出(不是改 ASM)
- 支持 IDA 7.5.0 / 7.6.0 / 7.7.0 + Hex-Rays
- 架构:ARM, ARM64, x86, x86_64, PowerPC, PowerPC64, MIPS(7.6/7.5)
- **云插件**:目标函数二进制会上传到 obpo-server 处理(核心闭源,插件免费开源)
- 服务器自费维护,超时 600s,**禁止多线程/恶意调用**
**安装与使用:**
```text
1. 下载 obpo_plugin.py 和 obpoplugin 目录
2. 复制到 IDA plugins 路径
3. 重启 IDA,打开目标二进制
4. 在 CFG 中定位分发块(dispatcher),通常长这样:
[截图参考仓库 assets/dispatchblock.png]
5. 右键 → OBPO → Mark and process function
6. 处理完成后刷新反编译器
7. 可根据反编译变化继续标记新的分发块(迭代处理嵌套 fla)
```
**适用场景与限制:**
- ✅ 标准和嵌套 fla,效果好
- ⚠️ 需要联网,敏感样本(内部未公开漏洞、商业机密)慎用——二进制会上传
- ⚠️ 服务器可能宕机,依赖作者维护
- ❌ 不能解决所有混淆(作者明确声明)
### 3.2 d810-ng — 本地一站式首选
> [w00tzenheimer/d810-ng](https://github.com/w00tzenheimer/d810-ng) · 223⭐ · 2026-06-26 更新
D-810 的现代维护/重构版(Next Generation)。本地运行、开源、集成 **Z3 SMT** 求解器,变种覆盖最广。
**核心能力(按 d810-ng README 整理):**
*指令级优化:*
| 类别 | 说明 |
|------|------|
| MBA simplification | `(a+b)-2*(a&b) => a^b`,Z3 验证的 DSL 规则 |
| Hacker's Delight | 位运算等价(来自 Hacker's Delight 一书) |
| O-LLVM patterns | Obfuscator-LLVM 专用 MBA 模式 |
| Constant folding | 22 条常量简化规则 |
| Predicate simplification | 不透明谓词去除(setz/setnz/lnot/smod) |
| Z3 rules | 模板匹配失败时用 SMT 求解 |
| Hodur-specific | PlugX (Hodur) 恶意软件的 MBA 模式 |
*控制流 Unflattener(按目标混淆分类):*
| Unflattener | 目标 | 说明 |
|------------|------|------|
| `Unflattener` | O-LLVM | 标准 switch/if-chain + 状态变量 |
| `UnflattenerSwitchCase` | Tigress | Tigress switch-case 分发(`m_jtbl`) |
| `UnflattenerTigressIndirect` | Tigress | Tigress 间接跳转(`m_ijmp`),需 `goto_table_info` 配置 |
| `HodurUnflattener` | Hodur (PlugX) | 嵌套 `while(1)` + `jnz state, #CONST`,无 switch |
| `BadWhileLoop` | Approov | `while(v8 != C)`,状态常量在 0xF6000–0xF6FFF |
| `UnflattenerFakeJump` | 通用 | 去除恒真/恒假的条件跳转 |
| `SingleIterationLoopUnflattener` | 残留 | 清理 `INIT == CHECK` 且 `UPDATE != CHECK` 的单次循环 |
| `UnflattenControlFlowRule` (实验) | 通用 | 基于 path emulation 的 CFG unflattener |
**安装与使用:**
```text
1. clone d810-ng
2. 安装依赖(含 Z3)
3. 复制到 IDA plugins 目录
4. IDA 中按 Ctrl-Shift-D 加载插件
5. 在 GUI 中勾选要应用的规则集
6. 对目标函数应用
```
**为什么选 d810-ng 而非原版 D-810:**
- 原版 D-810 已较少维护
- d810-ng 有 CI 测试、重构代码、新增 Tigress/Hodur/Approov 专用 unflattener
- 集成 Z3,模板匹配失败时回退到 SMT 求解,成功率更高
### 3.3 ollvm-unflattener — Miasm 符号执行,纯脚本
> [cdong1012/ollvm-unflattener](https://github.com/cdong1012/ollvm-unflattener) · 265⭐ · 2026-06 活跃
基于 **Miasm** 符号执行引擎,不依赖 IDA/BN,纯 Python 命令行。
**特性:**
- 用 Miasm 符号执行恢复原始控制流(区别于 MODeflattener 的纯静态方法)
- **BFS 多层处理**:自动跟随目标函数的调用,递归去混淆
- 支持 Windows/Linux x86/x64
- 输出去混淆后的新二进制
**安装与使用:**
```bash
git clone https://github.com/cdong1012/ollvm-unflattener.git
cd ollvm-unflattener
pip install -r requirements.txt # miasm, graphviz, keystone-engine
# 基本用法
python unflattener -i <input.bin> -o <output.bin> -t <function_addr> -a
# -a: 自动跟随调用做多层处理
```
**适用:** 无 IDA、目标 x86/x64、需要批量脚本化处理。
### 3.4 ollvm-breaker — Binary Ninja 实战
> [amimo/ollvm-breaker](https://github.com/amimo/ollvm-breaker) · 441⭐
使用 **Binary Ninja** 去平坦化,仓库自带 Android 加固样本 `libvdog.so` 作为测试用例,已修复 JNI_OnLoad、crazy::GetPackageName、prevent_attach_one 等函数。
**适用:** Binary Ninja 用户、Android .so 实战。
### 3.5 deollvm — ARM64 Unicorn
> [GeT1t/deollvm](https://github.com/GeT1t/deollvm) · 34⭐ · 2026-04
基于 **Unicorn** 的 ARM64 OLLVM deflat。无 IDA 时处理 ARM64 .so 的备选。
### 3.6 DeObfBR — BR 混淆专项
> [Mrack/DeObfBR](https://github.com/Mrack/DeObfBR) · 96⭐ · 2026-06-25
专门去除 **BR 混淆**(间接分支混淆,Goron/Arkari 风格)。
**⚠️ 简易对抗技巧(来自 awesome-ollvm):** Goron/Arkari 风格的间接相关混淆,可以通过**设置数据段为只读**来简单对抗——间接跳转目标常依赖运行期可写的数据段,设只读后变成可静态求解。
### 3.7 angr — 符号执行通用框架
```python
import angr
proj = angr.Project("target.so", auto_load_libs=False)
cfg = proj.analyses.CFGFast()
func = proj.kb.functions[0x12345]
# 内置 Deobfuscator
deob = proj.analyses.Deobfuscator(func=func)
deob.normalize()
```
**⚠️ Pluto/Polaris 的 Trap Angr pass:** 这两个变种专门写了 trap 来坑 angr 符号执行。如果 angr 路径爆炸或异常,怀疑目标用了 Trap Angr → 改用 d810-ng 或 Unicorn 动态方法。
---
## 4. 完整脱密工作流(按场景)
### 4.1 通用决策树
```
目标二进制
↓
1. 识别 OLLVM 变种(看 1.2 节线索)
├── 原始 OLLVM / Hikari / O-MVLL → 标准 fla/bcf/sub
├── Pluto / Polaris → 注意 Trap Angr,避开 angr
├── Goron / Arkari → 先试数据段只读,再处理 BR
├── Tigress → d810-ng Tigress unflattener
├── Hodur (PlugX) → d810-ng HodurUnflattener
└── amice (含 VM) → 不是单纯 fla,需 VM handler 还原
↓
2. 选择工具(看第 0 节决策表)
├── 有 IDA + 可联网 + 非敏感样本 → obpo-plugin
├── 有 IDA + 本地 → d810-ng
├── 有 Binary Ninja → ollvm-breaker
├── 无 GUI + x86/x64 → ollvm-unflattener (Miasm)
├── 无 GUI + ARM64 → deollvm (Unicorn) / angr
└── 纯符号执行 / CTF → angr
↓
3. 分层去混淆(顺序很重要)
a) 先去除不透明谓词 (bcf) → d810-ng opaque predicate removal
b) 再去除控制流平坦化 (fla) → unflattener
c) 最后简化 MBA (sub) → d810-ng MBA simplifier / SiMBA
↓
4. 验证
├── 函数体积显著减小?
├── CFG 从星形/放射状变为链形/树形?
└── Frida hook 关键函数验证逻辑正确?
```
### 4.2 Android NDK .so 脱密专项
Android NDK 编译的 .so 经 OLLVM 加固是 APK 逆向最常见的场景。
**Step 1 — 提取 .so:**
```bash
adb pull /data/app/~~/lib/arm64/libnative.so
# 或从 APK 直接解压:unzip target.apk -d out/ ; find out -name "*.so"
```
**Step 2 — 识别 OLLVM 与变种:**
```bash
readelf -a libnative.so | grep -E "Size|text" # .text 异常大但函数少 → 大概率 OLLVM
# IDA 打开看函数特征:
# 巨大 switch → fla
# 不可达分支 → bcf
# 复杂算术 → sub/MBA
# 间接跳转 BR x8 → Goron/Arkari,试数据段只读
# while(1) + jnz state → Hodur,用 d810-ng HodurUnflattener
```
**Step 3 — 脱密(分层):**
```
a) bcf: d810-ng opaque predicate removal (或 obpo 自动处理)
b) fla: d810-ng Unflattener / obpo-plugin / deollvm(ARM64)
c) sub: d810-ng MBA simplifier
```
**Step 4 — Frida 动态验证:**
```javascript
// Trace OLLVM 状态变量,辅助 deflat 确定状态变量地址
const target = Module.findBaseAddress("libnative.so");
console.log("[+] libnative.so @", target);
// 在分发器入口下 hook,观察 state 变化序列
Interceptor.attach(target.add(0x1234), { // dispatcher offset
onEnter(args) {
// 读取状态变量(需根据反编译确定寄存器/栈位置)
console.log("[state]", this.context.x8); // 假设 state 在 x8
}
});
```
### 4.3 CTF 场景快速脱密
CTF 通常时间紧,优先用最快路径:
```python
#!/usr/bin/env python3
"""CTF OLLVM quick deflat with angr"""
import angr
proj = angr.Project("challenge", auto_load_libs=False)
cfg = proj.analyses.CFGFast()
# 找最大的几个函数(最可能是被混淆的)
funcs = sorted(cfg.functions.values(), key=lambda f: f.size, reverse=True)[:5]
for func in funcs:
print(f"[*] {func.name} @ {hex(func.addr)} size={hex(func.size)}")
try:
deob = proj.analyses.Deobfuscator(func=func)
deob.normalize()
print(f" [+] deobfuscated")
except Exception as e:
print(f" [-] failed: {e}")
# angr 失败 → 怀疑 Trap Angr → 换 d810-ng / Unicorn
```
---
## 5. MBA 表达式简化
### 5.1 常见 OLLVM MBA 模式
```python
# 这些等式是 OLLVM sub pass 生成表达式的化简目标
"(a | b) + (a & b)" # → a + b
"(a | b) - (a & b)" # → a ^ b
"(a ^ b) + 2*(a & b)" # → a + b
"(a | b) & ~(a & b)" # → a ^ b
"~(~a & ~b)" # → a | b (De Morgan)
```
### 5.2 工具选择
| 工具 | 方式 | 适用 |
|------|------|------|
| **d810-ng MBA simplifier** | IDA 内批量,Z3 验证 | 首选,集成在反编译流程 |
| **SiMBA** (`pip install simba-simplifier`) | 命令行/库 | 纯表达式化简,批量处理 |
| **Arybo** | 符号位向量 | 大量 MBA 表达式 |
| **Z3 直接求解** | SMT | 最通用,模板匹配都失败时 |
```python
# SiMBA 示例
from simba import simplify_mba
exprs = ["(a | b) + (a & b)", "(a ^ b) + 2*(a & b)"]
for e in exprs:
print(f"{e} → {simplify_mba(e)}")
```
---
## 6. 完整脱密案例脚本
```bash
#!/bin/bash
# OLLVM deobfuscation pipeline (2026 community tools)
# 适用标准 OLLVM / Hikari / O-MVLL 加固的 ELF/.so
BINARY=$1
echo "[*] Stage 0: 基本分析与变种识别"
file $BINARY
readelf -h $BINARY 2>/dev/null | head -5
echo " → 在 IDA 中确认变种(参考第 1 节)"
echo "[*] Stage 1: d810-ng 本地反混淆(首选)"
echo " IDA → Ctrl-Shift-D 加载 d810-ng"
echo " 勾选: MBA + Opaque predicate + Unflattener"
echo " Apply to target functions"
echo " 保存 IDB"
echo "[*] Stage 2: obpo-plugin(如 d810-ng 效果不足且可联网)"
echo " IDA → 右键 dispatcher → OBPO → Mark and process"
echo " ⚠️ 敏感样本勿用(二进制上传云服务)"
echo "[*] Stage 3: 无 IDA 备选(x86/x64)"
echo " python unflattener -i $BINARY -o deobf.bin -t <func_addr> -a"
echo "[*] Stage 4: ARM64 .so 无 IDA 备选"
echo " deollvm (Unicorn) 或 angr Deobfuscator"
echo "[+] Done. 在 IDA 中重新分析验证。"
```
---
## 7. 常见陷坑(社区实战总结)
| 问题 | 原因 | 解决办法 |
|------|------|---------|
| angr 路径爆炸/异常退出 | Pluto/Polaris 的 **Trap Angr** pass | 换 d810-ng 或 Unicorn 动态方法 |
| obpo-plugin 联不上 | 服务器自费维护,可能宕机 | 转用本地 d810-ng;可在 obpo 仓库提 issue |
| Goron/Arkari 间接跳转 deflat 失败 | 分发器用 BR x8 而非 switch | 先把数据段设只读,再用 DeObfBR |
| d810-ng 处理后函数仍乱 | OLLVM 自定义了 pass 参数/seed | 先符号执行去不透明谓词,再 unflatten |
| 嵌套 fla(多层平坦化)一次没清干净 | obpo/d810-ng 单次只清一层 | **迭代处理**:每次标记新出现的 dispatcher |
| ARM64 .so 用 deflat 报错 | 老 deflat 脚本只支持 x86 | 用 d810-ng / obpo(支持 ARM64)/ deollvm |
| Hikari 字符串看不到 | String Encryption pass | 用 Unicorn 模拟解密 stub,dump 解密后字符串 |
| amice 目标 deflat 完全无效 | 含 VM Flatten / Instruction Virtualization | **不是 OLLVM fla**,需 VM handler 还原(参考 VM 逆向) |
| Hodur(PugX) 样本没有 switch 分发器 | 嵌套 while(1) + jnz state | 用 d810-ng **HodurUnflattener**,别用普通 Unflattener |
| Approov 样本状态常量看不出规律 | 常量集中在 0xF6000–0xF6FFF | 用 d810-ng **BadWhileLoop** unflattener |
| 敏感样本误用 obpo | 二进制上传云服务 | 涉密/未公开漏洞样本**只用本地工具**(d810-ng/angr) |
| Frida hook OLLVM 函数卡死 | 状态变量被改导致无限循环 | 在分发器入口加条件断点限制执行次数 |
---
## 8. 工具速查表(2026 社区活跃度)
| 工具 | 平台 | 方式 | Stars/价 | 最近更新 | 开源 | 备注 |
|------|------|------|---------|---------|------|------|
| **obpo-plugin** | IDA | microcode+concolic(云) | 629 | 2026-06 | 插件开源/核心闭源 | 效果最强,需联网 |
| **ollvm-breaker** | Binary Ninja | BN API | 441 | 2026-06 | ✅ | Android .so 实战 |
| **ollvm-unflattener** | CLI | Miasm 符号执行 | 265 | 2026-06 | ✅ | x86/x64,BFS 多层 |
| **d810-ng** | IDA | microcode+Z3 | 223 | 2026-06 | ✅ | **本地首选**,变种覆盖广 |
| **DeObfBR** | — | BR 混淆专项 | 96 | 2026-06 | ✅ | Goron/Arkari 间接分支 |
| **IDA_Ollvm-unflattener** | IDA | Miasm 插件版 | 90 | 2026-04 | ✅ | ollvm-unflattener 的 IDA 插件封装 |
| **deollvm** | CLI | Unicorn | 34 | 2026-04 | ✅ | ARM64 专项 |
| **angr** | CLI | 符号执行 | — | 活跃 | ✅ | 通用,被 Trap Angr 克制 |
| **SiMBA** | CLI/库 | MBA 化简 | — | — | ✅ | 表达式化简 |
| **Triton** | CLI | 符号执行+污点 | — | 活跃 | ✅ | 动态符号执行 |
---
## 9. 参考链接
**混淆器(用于理解对抗目标):**
- [obfuscator-llvm/obfuscator](https://github.com/obfuscator-llvm/obfuscator) — 原始 OLLVM
- [HikariObfuscator/Hikari](https://github.com/HikariObfuscator/Hikari) — Hikari
- [komimoe/Hikari](https://github.com/komimoe/Hikari) — Arkari (基于 goron, LLVM 14+)
- [amimo/goron](https://github.com/amimo/goron) — goron
- [bluesadi/Pluto](https://github.com/bluesadi/Pluto) — Pluto
- [za233/Polaris-Obfuscator](https://github.com/za233/Polaris-Obfuscator) — Polaris (原 Pluto)
- [open-obfuscator/o-mvll](https://github.com/open-obfuscator/o-mvll) — O-MVLL
- [fuqiuluo/amice](https://github.com/fuqiuluo/amice) — Rust 实现 OLLVM passes
- [lich4/awesome-ollvm](https://github.com/lich4/awesome-ollvm) — **变种生态总览(强烈推荐先读)**
**反混淆工具:**
- [obpo-project/obpo-plugin](https://github.com/obpo-project/obpo-plugin) — 最强云插件
- [w00tzenheimer/d810-ng](https://github.com/w00tzenheimer/d810-ng) — 本地首选
- [cdong1012/ollvm-unflattener](https://github.com/cdong1012/ollvm-unflattener) — Miasm 纯脚本
- [amimo/ollvm-breaker](https://github.com/amimo/ollvm-breaker) — Binary Ninja
- [GeT1t/deollvm](https://github.com/GeT1t/deollvm) — ARM64 Unicorn
- [Mrack/DeObfBR](https://github.com/Mrack/DeObfBR) — BR 混淆专项
- [maskelihileci/IDA_Ollvm-unflattener](https://github.com/maskelihileci/IDA_Ollvm-unflattener) — IDA 插件版
- [angr](https://angr.io/) — 符号执行框架
- [SiMBA](https://github.com/tech-srl/simba) — MBA 化简
**学术/博客:**
- [Quarkslab: Deobfuscation: Recovering an OLLVM-protected program](https://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html) — deflat 经典原理
- [MODeflattener](https://github.com/mrT4ntr4/MODeflattener) — 静态 deflat(ollvm-unflattener 的对照)
> 关联文档:[[anti-analysis.md]] (反调试/反分析总表)、[[tools-advanced.md]] (高级工具集)、[[elf-analysis.md]] (ELF 文件分析)、[[ai-assisted-re.md]] (AI 辅助逆向)

View File

@@ -0,0 +1,240 @@
# RE Agent 工作流门闩(静态↔动态)
> 来源启发:binary-re 阶段划分、社区 RE skill(Frida/r2/Ghidra/IDA 循环)、Cerberus 三头环(静/动/插桩)
> Issue #65 增量:IAT 修复铁律、六阶段映射、.NET/DLL·SYS 等价路径;用户指令可行性门闩;旁路补丁 6–10;反调试/混淆菜谱 A–T;非 PE 多格式菜谱 U–AV(2026-08-12)
> 适用:`reverse-engineering/`、`ida-reverse/`、`radare2/`、`malware-analysis/`、与 cre 角色交接
## 0. 启动
```text
□ scope.md:offline 样本路径 或 授权设备/靶机
□ tool-index:file/strings/r2/ida/frida 等实际路径
□ 角色:cre(ops/role-map)
```
## 0.1 Transition handoff(decision delta)
阶段之间不重新注入完整 case context。`scope.md` / `workitems.md` / Evidence 保持 authoritative;`timeline.md` 只承载 transition delta:
1. stage/turn 结束时只写真正改变后续动作的 `decision_delta`;无变化写 `[]`。
2. unchanged route/auth/scope/network profile/tool state/hypothesis 只放 `carry_forward_refs`,consumer 依引用读取,不重新 serialize / emit。
3. `decision_delta` 不是完整 state;consumer 必须先继承 refs,再应用 delta。
4. 只有两个或以上 evidence-supported 分支会导致不同下一动作时才停在 next-step menu;确定性 gate 直接推进。
例:Triage 完成且唯一合法下一步是 Static 时,transition 只需 `decision_delta: [phase=triage->static]` + `carry_forward_refs: [scope.md, evidence/E-triage.md]`。
## 0.5 用户指令可行性门闩(Issue #65)
**原则**:服从用户**目标**,不盲从用户**步骤顺序**。跳步前必须说明前提并请确认;确认后的强制步骤必须做,且诚实标注 Evidence 质量。
| 情况 | Agent MUST |
|------|------------|
| 用户要做 X,且当前状态可得到**有效** Evidence | 执行 X,更新 Evidence |
| 用户要做 X,但存在**已知阻塞前提**(例:已判定加壳且静态 IAT 不可读) | **禁止**假装完成有意义的 IAT;① 一句话说清阻塞;② 给出推荐顺序(先脱壳/修 IAT,或直接动态抓 API);③ **请用户确认**是「仍强制看当前花表」还是「按推荐顺序」 |
| 用户明确**强制**当前步骤(如未脱壳也要看 IAT) | 执行并记 Evidence,MUST 标注 `quality=unreadable` / `packed`(或等价);**禁止**据此下「无网络能力」等结论 |
| 用户接受推荐顺序 | 先做前提步骤;完成后自动或再应要求做 X;**禁止**用前提步骤(如脱壳)**冒充**「已完成导入表检查」 |
**与「重做 X」的关系**:重做 X 仍 = 重做被点名步骤(或其经确认的合法前提协商结果),禁止偷换成无关步骤。脱壳是导入表的**前提**,不是导入表的**替代品**。
典型冲突:用户在加壳样本上说「先不要脱壳,先看导入表」→ 壳常篡改导入目录/加密描述符,静态表花且无意义 → 走本表「阻塞前提」行,不得默默脱壳冒充,也不得默默交出花表当完成。
## 1. Triage(5–15 分钟 · 强制起点)
```text
□ 计算样本 Hash(MD5/SHA256)→ 唯一 ID
□ 识别文件类型:EXE / DLL / SYS / ELF / Mach-O / .NET / 脚本(bat/ps1/vba) / JS / APK 等
□ 非 PE/脚本/APK/驱动专项:见 §3.4 与 `references/nonpe-format-cookbook.md`(U–AV)
□ file / DIE / 熵 / 壳特征(PEiD / DIE / Exeinfo 等)
□ 架构:x86 / x64 / ARM;编译语言线索(VC++ / Delphi / .NET / Go / Rust)
□ 加壳类型线索:UPX / ASPack / VMProtect / Themida / 未知混淆
□ strings / rabin2 -z 捡漏
□ MUST 导入/导出锚点(见下方「导入表硬门与等价路径」);若用户抢跑且有壳 → 先走 §0.5
□ 产出:E-triage(MUST 含 imports 或等价锚点分类摘要,含 quality 标注如适用)+ 假设清单
```
**阶段门闩(Triage → Static/Dynamic)**:E-triage 中未记录 imports **或** 合法等价锚点摘要前,MUST NOT 进入 Dynamic(除非已记录 IAT 修复失败并选择动态旁路,见 §1.2),也 MUST NOT 声称「基础分诊完成」。解析失败时仍 MUST 把失败输出写入 Evidence,不得跳过。用户要求「重做导入表检查」时 MUST 重做 imports/等价步骤本身(或先完成 §0.5 协商后的前提),禁止改换其他分析步骤冒充。
### 1.1 导入表硬门与等价路径
| 样本类型 | MUST 锚点(Evidence) | 说明 |
|----------|----------------------|------|
| 原生 PE/ELF/Mach-O(IAT 可读) | `E-imports` / `E-triage-imports`:导入分类摘要 | `rabin2 -i` / IDA imports / 等价 |
| DLL / SYS / 共享库 | **并列** `E-imports` + `E-exports`(`rabin2 -i` + `rabin2 -E`) | 导出表优先级等同导入表(对外入口) |
| .NET 托管(无传统 IAT) | **等价路径**:dnSpy/IL/元数据/程序集引用与敏感 API 摘要 → 仍写入 `E-imports` 或 `E-triage-imports` 语义槽 | **禁止** 因「没有 IAT」而空过硬门;dnSpy 查看 = 原生「查导入表」 |
| 导入表解析失败 / 为空 / 加壳花表 | 仍记失败或花表输出为 Evidence,并标 `quality` | 不得静默跳过;花表不得支撑能力否定结论 |
**干净导入表警告(MUST 提醒)**:若导入表「过干净」(仅 kernel32/ntdll 等基础 DLL、几乎无业务 API),高度怀疑 `LoadLibrary` + `GetProcAddress` 动态加载 → 在 Evidence 注明嫌疑,并 **SHOULD** 转入 Dynamic 抓取内存 API;不得仅凭静态 IAT 宣称「无网络/无文件能力」。
**高危 API 组合(补丁 8 · SHOULD)**:导入表过长时,优先输出**恶意组合聚类**,过滤纯系统基础调用。示例(非穷尽):
- 高危簇:`FindWindowA/W` + `WriteProcessMemory` + `CreateRemoteThread`(注入)
- 高危簇:`CryptEncrypt` / `CryptAcquireContext` + 大量 `FindFirstFile` / `DeleteFile`(勒索倾向)
- 高危簇:`InternetOpen` / `WinHttp` / `URLDownloadToFile` + 持久化 API(`RegSetValue` / `CreateService`)
- 单独 `CreateFile` / `ReadFile` 等多为良性噪声,除非与上簇共现
### 1.2 脱壳与 IAT 处理(高风险分岔 · Issue #65)
```text
分支 A:无壳 / .NET 托管
→ 直接进入 §2 Static(.NET 走等价锚点)
分支 B:有壳 / 强混淆
Step 1:尝试脱壳(自动脱壳机 / 手动找 OEP)— 须在授权与隔离环境
Step 2:尝试修复 IAT
工具:x86 → ImportREC(或等价);x64 → Scylla(或等价)。禁止 64 位样本死磕 ImportREC。
情况 B1:修复成功且可解析 → 记 E-imports(修复后)→ §2 Static
情况 B2:ImportREC/Scylla 报错、修复后无法运行、或 IAT 全乱码(VMP/加密壳)
→ 【IAT 修复铁律】立即终止继续静态 IAT 修复
→ MUST 记录 E-iat-repair-fail(命令、工具、失败现象、决定转动态)
→ 直接进入 §3 Dynamic:API 断点 / 硬件执行断点 / 内存搜索抓取导入
→ 这不算「跳过导入表」:导入表路径已尝试并记 Evidence
情况 B3(补丁 6):脱壳并修 IAT 后双击闪退 / 蓝屏(疑文件 CRC/大小自校验)
→ 放弃继续静态修文件;记 E-self-check-crash 或并入 E-iat-repair-fail
→ 转入 §3 Dynamic:对 CreateFile / GetFileSize / 哈希相关 API 下断,定位校验绕过点
```
**IAT 修复铁律(MUST)**:优先尝试自动/半自动修复;一旦修复工具报错或修复后程序无法运行,**立即停止**在静态导入表上死磕,切换动态调试,用 API 断点(如 `bp CreateFile` / 关键网络 API)在运行时捕获导入函数。
## 2. Static(基础静态锚点 → 深挖)
| 工具 | 何时 |
|------|------|
| radare2 / rabin2 | 快速函数/导入/字符串(imports 已在 Triage MUST 完成或已记失败旁路) |
| IDA / Ghidra(MCP 或 headless) | 深挖、交叉引用、类型;survey 阶段复核 imports 分类 |
| jadx / dnSpy | Android / .NET |
| OLLVM 文档 | 控制流平坦化怀疑 |
```text
□ 确认 E-imports / E-triage 已含导入表或等价锚点 Evidence(缺失则先补,禁止后置)
□ 若 DLL/SYS:确认 E-exports 已记录
□ 敏感 API 分组 + 高危组合聚类(补丁 8)
□ 硬编码域名/IP/URL 字符串;资源节是否藏 Payload
□ 定位关键函数(加密/校验/网络/授权)→ 地址/符号写入 Evidence
□ 一条路不通 → 换工具(IDA↔r2↔Ghidra)
□ 时间盒(补丁 9 · SHOULD 默认):静态深挖约 15 分钟仍无关键路径 → 强制转入 §3 Dynamic(用户/任务可覆盖时长)
```
**无 MCP 时**:可用导出反编译文本再分析(对照 P4nda0s reverse-skills / IDA-NO-MCP 思路),仍写 Evidence 路径。
## 3. Dynamic(交叉验证循环区)
核心理念:**静态提供线索 → 动态验证 → 验证卡壳 → 回静态重审**(无固定唯一顺序)。
### 3.0 断点起手式(补丁 7 + 10 · MUST 顺序)
在用户态调试器(x64dbg 等)启动样本前,按「四级火箭」预置断点(可因架构/工具略名不同,顺序不变):
1. **TLS 回调**断点(调试器 EP 之前可能已跑)
2. **入口点 EP** 断点
3. **敏感 API** 断点(如 `CreateRemoteThread` / 网络 / 文件写)
4. **保底**:`ExitProcess` / 进程退出路径断点(补丁 10)— 一旦因反调试直接退出,**不急着重启**;立即 dump memory,将崩溃前镜像路径写入 Evidence,供字符串/数据恢复
```text
□ Frida / x64dbg / gdb / emulator:验证静态假设
□ 按 §3.0 预置断点后再跑;单步跟踪栈/寄存器(白盒)
□ 行为监控:沙箱 / Procmon / RegShot(黑盒)
□ IAT 修复失败 / 自校验闪退样本:硬件执行断点或内存搜索强行捕捉 API;CreateFile/GetFileSize 查 CRC
□ 反调试/反 Frida → reverse-engineering/anti-analysis
□ Android:root 检测 / SSL pinning 绕过脚本按需生成,**须在授权设备**
□ 崩溃日志驱动下一轮 hook(自适应循环)
□ 时间盒(补丁 9 · SHOULD 默认):单步跟踪约 200 条指令仍无恶意行为线索 → 强制回静态搜字符串/换锚点(可覆盖)
```
### 3.1 沙箱 / 动态无行为应急分支(MUST)
```text
无行为或立刻退出 / 无限休眠
→ 检查反调试 / 反虚拟机例程(CPUID、高精度计时、沙箱特征等)
→ 尝试硬件断点绕过、修补检测点、或换物理机/更高保真环境
→ 将「无行为 + 疑似 anti-VM」写入 Evidence,禁止写成「样本无害」而不加条件
```
### 3.2 时间盒策略(补丁 9 · SHOULD)
| 阶段 | 默认阈值(可被用户/任务覆盖) | 动作 |
|------|------------------------------|------|
| Static 深挖无关键路径 | ~15 分钟 | 转入 Dynamic |
| Dynamic 单步无进展 | ~200 条指令 | 回 Static 字符串/交叉引用重锚 |
| 任一路径重复失败 | 记 Evidence 后换工具或旁路 | 禁止同一失败手法空转 |
### 3.3 反调试 / 混淆旁路速查(Issue #65 补丁 A–T · 高频)
完整索引与动作细节见 `reverse-engineering/anti-analysis.md`「Agent 响应菜谱 A–T」。此处只列 **P0 必查 + 常见转场**。默认 **授权隔离 lab**;patch/改标志位不是未授权生产动作。
| 触发特征 | 首选动作(摘要) | Evidence |
|----------|------------------|----------|
| `cpuid` 后 jz/jnz(A) | lab:改标志位或 patch 走真实分支;记检测点地址 | `E-anti-debug-cpuid` |
| `rdtsc` + sub/cmp(B) | bp rdtsc 或 hook 时间源;禁止无限空转等沙箱超时当「无害」 | `E-anti-debug-rdtsc` |
| PEB BeingDebugged / NtGlobalFlag(K) | ScyllaHide 或手改 PEB;patch 条件跳 | `E-anti-debug-peb` |
| `NtQueryInformationProcess` DebugPort/Flags/Object(P) | ScyllaHide / hook 返回值;记 class 参数 | `E-anti-debug-ntqip` |
| 导入极少但行为丰富 → API 哈希(N) | bp GetProcAddress;哈希反查回注 IDA | `E-api-hash` |
| strings 空但有网/文件行为 → 串加密(I) | 找 decode 例程 xref;解密后 dump 回注 | `E-string-decrypt` |
| 有签名但来源可疑(F) | SigCheck:有效/吊销/时间;**无效不降**威胁等级 | `E-sig-forge` |
| 标准 strings 无 IOC → 试宽字符(T) | `strings -el` / UTF-16LE;Alt+A unicode | `E-wide-strings` |
| 调试器名字符串 / Toolhelp 扫描(C) | bp CreateToolhelp32Snapshot 链 | `E-anti-debug-procscan` |
| AddVectoredExceptionHandler + 故意异常(D) | bp VEH 注册;分析 handler | `E-anti-debug-veh` |
| int3 / DR0–DR7(M) | patch int3;软断点或 ScyllaHide 藏硬件 BP | `E-anti-debug-bp` |
| 多 PE 头/重叠节(G) | 节表真实映射 + 熵;不信节名 | `E-pe-anomaly` |
| 文件尾 > 节总和 Overlay(J) | 提取 overlay;file/熵;找加载偏移 xref | `E-overlay` |
| .rsrc 异常大/高熵 RT_RCDATA(Q) | 提取资源;FindResource 链 + 解密 dump | `E-rsrc-payload` |
| 运行时才加载 DLL(R) | 查 Delay Import;bp delay-load helper | `E-delay-import` |
| while+switch 星形 CFG(H) | **See** `ollvm-deobfuscation.md`;插件失败则动态路径 | `E-cff` |
| 恒真/恒假分支(S) | **See** ollvm / 符号执行;动态为准 | `E-opaque-pred` |
| `/proc/self/status` TracerPid(L) | **Linux/ELF**;hook 或 patch;Windows 主路径不强制 | `E-anti-debug-tracerpid` |
**约束**:绕过失败也记 Evidence;禁止把「反调试触发退出」写成「样本无害」。完整 A–T 与 P2(E 编译时间、O 花指令)见 anti-analysis 菜谱节。
### 3.4 非 PE / 多格式旁路(Issue #65 补丁 U–AV · 路由)
完整索引:`reverse-engineering/references/nonpe-format-cookbook.md`。此处只列 **类型 → 入口**;动作细节在 cookbook / 对应 skill。
| 类型 | 跳转 | P0 Evidence 锚点(示例) |
|------|------|---------------------------|
| BAT/CMD | cookbook §1 + malware | `E-batch-deobf` |
| PowerShell | cookbook §2 + malware | `E-ps-decode-layer-N` |
| VBA 宏 | cookbook §3 + malware | `E-vba-pcode` |
| JS 强混淆 / JSVMP | **js-reverse** + cookbook §4 | `E-js-vmp` / `E-js-deobf` |
| SYS 驱动 | kernel-driver-reverse + cookbook §5 | `E-driver-irp-handlers` / `E-driver-ioctl` |
| DLL 侧重点 | cookbook §6(AM≡A–T **R**) | `E-dll-tls-dllmain` / `E-exports` |
| Android 格机/隐藏图标 | **apk-reverse** + cookbook §7–8 | `E-android-wiper-*` / `E-android-hidden-icon-*` |
**约束**:不另起「非 PE 六阶段」;与 §3.3 A–T 分工(PE 反调试 vs 多格式)。授权 lab;格机/BYOVD/反射 = 检测取证表述。
## 4. Synthesis(IOC / 攻击链 / 报告)
### Decision quality overlay (Issue #77)
Before closing Synthesis, apply [analysis-decision-framework.md](../../ops/analysis-decision-framework.md) **P0 checklist**: R41 grounded claims, R4* validated sufficiency, R1 confidence->dynamic, R2 hypothesis exit, R43 deadlock replan (under feasibility gate), R8/R23 no default malice/IOC. Multi-module -> R50; anti-analysis effort -> R51 + A-T cookbook.
Blindspots (Rust/Go/VMP/injection/OLE/PDF/agent-meta): [analysis-blindspot-cookbook.md](../../ops/analysis-blindspot-cookbook.md) R52-R81 — detection-oriented; not a parallel master flow.
```text
□ Finding:算法/校验逻辑/可利用点 / 行为结论
□ Path:callflow 或 solve 步骤挂 E-*
□ IOC:网络指纹 + 主机指纹(有则表;无则 n/a+原因)
□ 报告 docs-generator(malware/apt/null/vuln overlay 按任务选型)+ 可选图
□ 可选:YARA / Snort·Suricata 规则化沉淀
□ field-journal 脱敏
```
## 5. 六阶段实战映射(Issue #65 思维导图 → 本文件)
| 实战阶段 | 本文件章节 | 硬门 / 铁律 |
|----------|------------|-------------|
| 1 初步快速研判 | §0–§1 Triage | Hash、架构、文件类型、查壳;imports/等价锚点;§0.5 指令门闩 |
| 2 脱壳与 IAT | §1.2 | IAT 铁律;失败/自校验闪退 → Evidence → Dynamic |
| 3 基础静态锚点 | §2 Static | 高危 API 组合;时间盒 SHOULD |
| 4 深度交叉验证 | §3 Dynamic | 断点四级火箭;无行为应急;时间盒;§3.3 A–T;§3.4 U–AV 类型路由 |
| 5 提取 IoC 与攻击链 | §4 Synthesis | IOC + Kill Chain / Path |
| 6 归档与规则化 | §4 + docs-generator / YARA | 结构化报告;规则可选 |
## 6. 与「堆 RE skill 插件」的差异
- 本包用 **阶段门闩 + tool-index**,不默认启用 Hex-Rays「unsafe 全自动执行」类插件
- 动态插桩默认 **offline/lab** network_profile
- IAT/导入表:**尝试 + 记录** 优先于「无限静态死磕」或「静默跳过」
- 用户指令:**目标优先 + 前提协商**,禁止用无关步骤冒充被点名步骤