二进制逆向工程分析技能Skill binary-re

二进制逆向工程分析技能是专门用于分析可执行文件、二进制程序和字节码的综合性工具集。该技能提供从初步检查、静态分析到动态调试的完整方法论,支持多种架构(x86、ARM、MIPS、RISC-V等)和平台。核心功能包括:文件指纹识别、反汇编反编译、函数分析、字符串提取、交叉引用追踪、系统调用监控、网络行为分析等。适用于恶意软件分析、漏洞挖掘、软件调试、安全审计、固件逆向等场景。关键词:二进制分析、逆向工程、反汇编、反编译、恶意软件分析、漏洞挖掘、安全审计、固件逆向、ELF分析、Python字节码、QEMU仿真、Ghidra、radare2、动态调试、静态分析。

逆向工程 3 次安装 42 次浏览 更新于 3/1/2026

名称: 二进制逆向工程 描述: 当需要分析二进制文件、可执行文件或字节码以理解其功能或工作原理时使用此技能。触发词包括"二进制"、“可执行文件”、“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})
问题:{未知}
决策:{选择}(理由:{原因})

开始分析: 首先在情景记忆中搜索工件哈希值 每个阶段后: 发现自动捕获在对话中 恢复: 搜索[二进制逆向工程] {工件名称}以恢复上下文

人工介入触发点

始终在以下情况前询问人类:

  1. 执行二进制文件 - 即使在QEMU下,也需确认沙箱
  2. 网络操作 - 防止意外回连
  3. 矛盾证据 - 解决矛盾发现
  4. 特权操作 - 设备访问、root操作
  5. 主要方向变更 - 重大分析转向

会话管理

开始新分析

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:创建可重现的分析环境