名称: 二进制逆向工程 描述: 当需要分析二进制文件、可执行文件或字节码以理解其功能或工作原理时使用此技能。触发词包括"二进制"、“可执行文件”、“ELF”、“这是什么功能”、“逆向工程”、“反汇编”、“反编译”、“pyc文件”、“Python字节码”、“分析二进制”、“弄清楚”、“marshal”。可路由到子技能进行初步检查、静态分析、动态分析、综合报告或工具设置。
二进制逆向工程
目的
二进制逆向工程的综合指南。本技能提供整体方法论、哲学理念和参考资料。相关技能处理特定阶段:
相关技能
| 技能 | 目的 | 触发关键词 |
|---|---|---|
binary-re:triage |
快速指纹识别 | “这是什么二进制文件”、“识别”、“文件类型” |
binary-re:static-analysis |
r2 + Ghidra分析 | “反汇编”、“反编译”、“函数” |
binary-re:dynamic-analysis |
QEMU + GDB + Frida | “运行”、“执行”、“调试”、“跟踪” |
binary-re:synthesis |
报告生成 | “总结”、“报告”、“记录发现” |
binary-re:tool-setup |
安装工具 | “安装”、“设置”、“工具未找到” |
注意: 每个技能根据关键词自动检测。您无需显式路由 - 只需询问您需要的内容。
预检验证
开始任何分析前,验证工具可用性:
核心工具(必需)
rabin2 -v # 应显示版本
r2 -v # 应显示版本
反编译(可选)
# 检查r2ghidra可用性
r2 -qc 'pdg?' - 2>/dev/null | grep -q Usage && echo "r2ghidra正常" || echo "r2ghidra缺失 - 使用安装: r2pm -ci r2ghidra"
动态分析平台检查
| 主机平台 | 方法 | 所需设置 |
|---|---|---|
| Linux x86_64 | 原生QEMU | apt install qemu-user |
| macOS(任意) | Docker + binfmt | 参见binary-re-tool-setup技能 |
| Windows | WSL2 | 在WSL内使用Linux方法 |
如果动态工具不可用: 继续进行仅静态分析,注意综合阶段置信度降低。
备用工具(无r2/Ghidra)
当radare2或Ghidra不可用时,使用标准binutils/LLVM工具:
# 元数据(替代rabin2 -I)
readelf -h binary # ELF头
readelf -d binary # 动态段(依赖项)
file binary # 快速识别
# 导入/导出(替代rabin2 -i/-E)
readelf -Ws binary | grep -E "FUNC|OBJECT" | awk '{print $8}'
nm -D binary 2>/dev/null # 动态符号
# 字符串(替代rabin2 -zz)
strings -a -n 8 binary | grep -Ei 'http|ftp|/etc|/var|error|pass|key|token|api'
# 反汇编(替代r2 pdf)
objdump -d -M intel binary | head -500
# 或LLVM(更好的跨架构支持):
llvm-objdump -d --no-show-raw-insn binary | head -500
# 依赖项(替代rabin2 -l)
ldd binary 2>/dev/null || readelf -d binary | grep NEEDED
备用方法的限制:
- 无交叉引用(axt/axf)- 必须手动跟踪
- 无反编译 - 仅汇编
- 无函数边界检测 - 原始反汇编
- 对剥离二进制文件准确性降低
哲学理念
LLM驱动分析;人类提供上下文。
人类提供:
- 平台信息(设备类型、操作系统、硬件)
- 推测目的(二进制文件可能的功能)
- 约束条件(无网络、隔离环境等)
LLM执行:
- 工具选择和调用
- 基于证据的假设形成
- 实验设计
- 知识综合
智能体循环
┌─────────────────────────────────────────────────┐
│ 假设驱动分析流程 │
├─────────────────────────────────────────────────┤
│ │
│ 0. I/O完整性检查 → 比较已知输入/输出 │
│ 1. 观察 → 通过工具收集事实 │
│ 2. 假设 → 基于事实形成理论 │
│ 3. 计划 → 设计实验验证理论 │
│ 4. 执行 → 运行工具(风险操作需批准) │
│ 5. 记录 → 捕获观察结果 │
│ 6. 更新 → 确认/反驳假设 │
│ 7. 循环 → 直到理解足够充分 │
│ │
└─────────────────────────────────────────────────┘
步骤0:首先比较已知I/O(关键)
深入代码分析前,始终检查是否存在已知输入/输出。
此步骤通过首先建立基本事实,防止浪费数小时的分析时间。
⚠️ 需要人工批准 - 即使是I/O比较,执行前也需要明确批准。
# 安全:对跨架构二进制文件使用仿真(人工批准后)
# ARM32示例:
qemu-arm -L /usr/arm-linux-gnueabihf -- ./binary input.txt > actual_output.txt
# x86-64原生(仍需批准):
./binary input.txt > actual_output.txt
# 基于Docker(macOS - 最安全选项):
docker run --rm --platform linux/arm/v7 -v ~/samples:/work:ro \
arm32v7/debian:bullseye-slim /work/binary /work/input.txt > actual_output.txt
# 比较输出:
diff expected_output.txt actual_output.txt
cmp -l expected_output.txt actual_output.txt | head -20 # 字节级
# 记录差异:
# - 输出在何处首次出现分歧?
# - 损坏中出现什么模式?
# - 文件大小匹配(逻辑错误)还是不同(截断)?
记录为事实:
事实:输出在第{N}字节处不同,预期"{X}"得到"{Y}"(来源:diff/cmp)
事实:文件大小匹配/相差{N}字节(来源:ls -l)
此单一步骤通常在反汇编前就揭示了错误类别。
知识模型
在整个分析过程中,通过情景记忆维护结构化知识:
事实:带有工具归因的已验证观察
假设:带有置信度和证据的理论
问题:阻碍进展的未解之谜
实验:计划的工具调用
观察:实验结果
决策:带有理由的人工批准选择
情景记忆集成
知识通过情景记忆跨会话持久化。使用一致的标签:
[二进制逆向工程:{阶段}] {工件名称} (sha256: {哈希值})
事实:{观察}(来源:{工具})
假设:{理论}(置信度:{0.0-1.0})
问题:{未知}
决策:{选择}(理由:{原因})
开始分析: 首先在情景记忆中搜索工件哈希值
每个阶段后: 发现自动捕获在对话中
恢复: 搜索[二进制逆向工程] {工件名称}以恢复上下文
人工介入触发点
始终在以下情况前询问人类:
- 执行二进制文件 - 即使在QEMU下,也需确认沙箱
- 网络操作 - 防止意外回连
- 矛盾证据 - 解决矛盾发现
- 特权操作 - 设备访问、root操作
- 主要方向变更 - 重大分析转向
会话管理
开始新分析
1. 计算工件哈希:sha256sum binary
2. 搜索情景记忆:"[二进制逆向工程] sha256:{哈希值}"
3. 如果找到先前分析:
→ "找到{日期}的先前分析。恢复还是重新开始?"
4. 如果恢复:加载事实/假设,从最后阶段继续
5. 如果全新:从初步检查阶段开始
恢复中断的分析
用户:"继续分析那个恒温器二进制文件"
Claude:
1. 调用情景记忆:搜索对话
查询:"[二进制逆向工程] 恒温器"
2. 检索先前会话发现
3. 总结:"上次会话识别出ARM32/musl,发现网络函数。我们即将进行动态分析。"
4. 从该阶段继续
搜索过去分析
用户:"我们分析过任何带有硬编码密码的ARM二进制文件吗?"
Claude:
1. 搜索:"[二进制逆向工程] 事实:硬编码"或"[二进制逆向工程] ARM"
2. 返回匹配的工件和发现
标准分析流程
对于典型的未知二进制文件分析:
1. 初步检查(binary-re:triage)
└─ 架构、ABI、依赖项、能力
2. 静态分析(binary-re:static-analysis)
└─ 函数、字符串、交叉引用、反编译
3. 动态分析(binary-re:dynamic-analysis)- 如果安全
└─ 系统调用、网络、文件访问
4. 综合(binary-re:synthesis)
└─ 带有证据的结构化报告
快速参考
基本命令
# 快速初步检查
rabin2 -I binary # 元数据
rabin2 -l binary # 依赖项
rabin2 -zz binary # 字符串
# 静态分析
r2 -q -c 'aa; aflj' binary # 函数
r2 -q -c 'izj' binary # 字符串
# 动态(ARM示例)
qemu-arm -L /usr/arm-linux-gnueabihf -strace ./binary
架构检测
| 指示器 | 架构 | QEMU二进制文件 | Ghidra处理器 |
|---|---|---|---|
e_machine=EM_386 (3) |
x86 32位 | qemu-i386 或 Docker --platform linux/i386 |
x86:LE:32:default |
e_machine=EM_ARM (40) |
ARM 32位 | qemu-arm 或 Docker --platform linux/arm/v7 |
ARM:LE:32:v7 |
e_machine=EM_AARCH64 (183) |
ARM 64位 | qemu-aarch64 或 Docker --platform linux/arm64 |
AARCH64:LE:64:v8A |
e_machine=EM_X86_64 (62) |
x86-64 | 原生或 Docker --platform linux/amd64 |
x86:LE:64:default |
e_machine=EM_MIPS (8) |
MIPS 32 LE | qemu-mipsel |
MIPS:LE:32:default |
e_machine=EM_MIPS (8) BE |
MIPS 32 BE | qemu-mips |
MIPS:BE:32:default |
e_machine=EM_RISCV (243) |
RISC-V 64 | qemu-riscv64 |
RISCV:LE:64:RV64I |
e_machine=EM_RISCV (243) 32 |
RISC-V 32 | qemu-riscv32 |
RISCV:LE:32:RV32I |
Libc检测
| 解释器 | Libc |
|---|---|
ld-linux-armhf.so.3 |
glibc(ARM硬浮点) |
ld-musl-arm.so.1 |
musl |
ld-uClibc.so.0 |
uClibc |
错误恢复
| 情况 | 操作 |
|---|---|
| 工具未找到 | 使用binary-re-tool-setup技能 |
| 错误架构 | 重新运行初步检查,验证文件输出 |
| QEMU失败 | 尝试Qiling、Unicorn或设备上运行 |
| 分析超时 | 缩小范围,使用aa而非aaa |
| 矛盾证据 | 询问人类,记录两种解释 |
文档
参见配套文档:
docs/r2-commands.md- LLM的完整r2参考docs/ghidra-headless.md- Ghidra脚本指南docs/arch-adapters.md- 每架构特性docs/python-bytecode-re.md- Python .pyc/marshal混淆模式
集成
与其他插件配合使用:
- remote-system-maintenance:通过SSH从设备提取二进制文件
- fresh-eyes-review:记录前验证结论
- scenario-testing:创建可重现的分析环境