内容
# 工具列表
适用于逆向工程的集成 Docker 容器 — radare2 + Ghidra 无界面服务端
通过 MCP 服务器连接,以及 BinDiff、angr、AFL++、honggfuzz 和 Android 工具
(apktool、jadx、frida)。可与 Claude Code、Claude Desktop、Cline、Continue 或任何 MCP 客户端配合使用。
无界面模式 — 无 GUI,无 VNC。所有操作在终端或通过 MCP 进行。
## 要求
- Docker 23.0+(需要 BuildKit — 自 23.0 默认启用)
- Docker Compose 2.0+(`docker compose`,而非 `docker-compose`)
对于 Docker 18.09–22.x 用户:在构建前请设置 `DOCKER_BUILDKIT=1`。
## 快速开始
```bash
docker compose build
docker compose up -d
docker exec -it toolbox bash
```
将二进制文件放入 `./workspace` — 在容器内映射为 `/workspace`。
## MCP
**单一入口点。** 复制 `.mcp.json` 中的 `toolbox` 条目到您的 MCP 客户端配置文件。
网关将所有工具箱 MCP 服务器组合到一个传输中 — 无需单独注册每个服务器。
```json
{
"mcpServers": {
"toolbox": {
"command": "docker",
"args": [
"exec", "-i", "toolbox",
"python3", "/opt/tools/scripts/mcp/gateway.py"
]
}
}
}
```
Claude Code 用户:项目的 `.mcp.json` 自动配置了此功能。其他客户端:
| MCP 客户端 | 文件 |
|---|---|
| Claude Code | `.claude/mcp.json`(项目)或 `~/.claude/mcp.json`(全局) |
| Claude Desktop | `claude_desktop_config.json`([文档](https://docs.anthropic.com/en/docs/claude-desktop)) |
| Cline(VS Code) | `cline_mcp_settings.json` |
| Continue | `~/.continue/config.json` |
| Zed | `settings.json` → `{"context_servers": {...}}` |
在编辑后重启客户端。`docker exec -i toolbox ...` 按需启动网关 —
主机上无需长期运行的 MCP 进程。
### 架构
```
MCP 客户端(Claude Code、Desktop 等)
└─ docker exec -i toolbox python3 gateway.py 单一标准输入/输出传输
├─ r2pm -r r2mcp → r2__* 工具
├─ bridge_mcp_ghidra.py → ghidra__* 工具(连接到 :8089)
├─ shell-mcp.py → shell__exec 工具
└─ python3 -m angr.mcp → angr__* 工具
```
网关在容器内启动每个子 MCP 服务器,并代理每个请求。工具**命名空间**(`r2__*`、`ghidra__*`、`shell__*`),
因此它们永远不会冲突。失败的子服务器将被记录,但不会阻止网关 —
它以退化模式运行,提供已连接的服务。
### 服务器目录
| 命名空间 | 服务器 | 提供功能 |
|---|---|---|
| `r2__*` | r2mcp 通过 `r2pm` | 反汇编,反编译(r2ghidra),十六进制转储,交叉引用,符号,搜索,仿真 |
| `ghidra__*` | bridge_mcp_ghidra.py → Ghidra 无界面服务端 :8089 | 项目管理,导入,自动分析,200+ 工具:反编译,补丁,结构体/类型,调试器,Bindiff |
| `shell__*` | shell-mcp.py | 任意 shell 命令 — angr,AFL++,honggfuzz,apktool,jadx,gdb,gcc,python3 等 |
| `angr__*` | angr.mcp(内置) | 二进制分析 — 项目加载,CFG,符号执行,数据依赖,VFG |
### 单个服务器(高级)
您也可以单独注册服务器 — 跳过网关,直接连接到单个 MCP。
适用于调试或只需要一个工具的情况。
<details>
<summary>单个 MCP 配置(点击展开)</summary>
**radare2** — 始终可用,无需启动服务器。
```json
{"mcpServers": {"radare2": {"command": "docker", "args": ["exec", "-i", "toolbox", "r2pm", "-r", "r2mcp"]}}}
```
**Ghidra 无界面服务端** — 服务器在 :8089 自动启动(`ENABLE_GHIDRA_HEADLESS_MCP=1` 在 docker-compose.yml 中)。
```json
{"mcpServers": {"ghidra-headless": {"command": "docker", "args": ["exec", "-i", "-e", "GHIDRA_MCP_URL=http://127.0.0.1:8089", "toolbox", "python3", "/opt/tools/ghidra-mcp/bridge_mcp_ghidra.py"]}}}
```
**Shell** — 任意命令执行。
```json
{"mcpServers": {"shell": {"command": "docker", "args": ["exec", "-i", "toolbox", "python3", "/opt/tools/scripts/mcp/shell-mcp.py"]}}}
```
**angr(内置 MCP)** — angr 9.2 自带其自己的 MCP 服务器。
```json
{"mcpServers": {"angr": {"command": "docker", "args": ["exec", "-i", "toolbox", "python3", "-m", "angr.mcp"]}}}
```
</details>
### Ghidra GUI(可选)
如果您在主机上使用 Ghidra GUI 和 GhidraMCP 插件(端口 8080),
请从 MCP 客户端连接:
```json
{
"mcpServers": {
"ghidra-gui": {
"command": "docker",
"args": [
"exec", "-i", "-e", "GHIDRA_MCP_URL=http://host.docker.internal:8080", "toolbox",
"python3", "/opt/tools/ghidra-mcp/bridge_mcp_ghidra.py"
]
}
}
}
```
### Ghidra 工具可用性
Ghidra 工具分为两类:
| 类别 | 何时可用 | 示例 |
|---|---|---|
| **静态** | 始终可用 — 无需实例 | `import_file`,`list_instances`,`connect_instance`,`list_tool_groups`,`load_tool_group` |
| **实例作用域** | 连接到加载的程序后 | `decompile_function`,`list_functions`,`rename_function`,`xrefs_to`,`disassemble_function`,所有调试器工具 |
生命周期:
```
import_file ──→ 自动连接 ──→ 模式获取 ──→ 所有 200+ 工具可用
│
└── 或:connect_instance ──→ 模式获取 ──→ 所有工具可用
```
使用 `check_tools` 查看当前可调用的工具:
```
ghidra__check_tools: "decompile_function,list_functions,import_file,bindiff"
→ import_file=可调用,decompile_function=未找到(当前无实例)
→ import_file 完成 → 所有四个 = 可调用
```
静态工具内置于网关中。实例作用域工具在连接后动态从无界面服务端的 `/mcp/schema` 获取。
如果工具显示 `not_loaded`(存在但其组未加载),请调用 `load_tool_group` 并提供类别名称。
使用 `list_tool_groups` 查看所有类别及其加载状态。
## 代理
`.claude/agents/` 包含专门的 RE 代理。任何克隆该仓库的人都会自动获得它们 —
Claude Code 从项目的 `.claude/` 目录加载代理。
| 代理 | 模型 | 功能 |
|---|---|---|
| `binary-triage` | haiku | 快速的 radare2 + shell 对未知二进制文件进行初步检查 |
| `ghidra-importer` | sonnet | 将二进制文件导入 Ghidra 无界面服务端,运行自动分析 |
| `ghidra-analyst` | sonnet | 静态 RE — 反编译,交叉引用,重命名,注释 |
| `ghidra-debugger` | sonnet | 动态分析 — 附加,断点,跟踪,内存监视 |
| `re-orchestrator` | opus | 全流程:初步检查 → 导入 → 静态 → 动态 → 报告 |
### 使用示例
```
检查此二进制文件:/workspace/suspicious.elf
将 /workspace/challenge.exe 导入 Ghidra
反编译位于 0x401000 的函数并跟踪其交叉引用
查找此二进制文件中所有包含“http”的字符串
跟踪调用 D2Common.ordinal:10624 的每个参数
对 /workspace/malware.bin 进行完整的逆向工程分析
```
### 添加您自己的代理
在 `.claude/agents/` 中添加 `.md` 文件。 frontmatter:
```yaml
---
name: my-agent
description: 功能描述
model: haiku | sonnet | opus
tools: [Read, Bash, mcp__toolbox__ghidra__*, mcp__toolbox__r2__*, mcp__toolbox__shell__exec]
---
```
`tools` 是可选的 — 忽略它以继承父会话的所有工具。对于 MCP 工具,
使用命名空间名称:`mcp__toolbox__<server>__<tool_name>`。
## 命令行工具
### radare2
```bash
r2 -A /workspace/chall # 打开并分析
r2 -c "pdg @ main" /workspace/chall # 通过 r2ghidra 反编译 main
r2pm -r r2mcp -t # 列出 r2mcp 公开的 MCP 工具
```
### Ghidra 无界面服务端
**快速导入** 通过捆绑的脚本:
```bash
/opt/tools/scripts/load-ghidra.sh /workspace/my-binary # 自动分析
/opt/tools/scripts/load-ghidra.sh /workspace/my-binary myproj # 命名项目
/opt/tools/scripts/load-ghidra.sh /workspace/my-binary --no-analyze
```
脚本检查 MCP 服务器健康状况,通过 `analyzeHeadless` 导入,
并调用 `/load_program` 使二进制文件可用于网关。
项目位于 `/home/ctf/ghidra-projects`(保存在 `ghidra-projects` Docker 卷中)。
**手动导入** 使用 analyzeHeadless:
```bash
/opt/tools/ghidra/support/analyzeHeadless /home/ctf/ghidra-projects myproj \
-import /workspace/chall -overwrite
```
### HTTP API(Ghidra 无界面服务端)
```bash
curl http://localhost:8089/check_connection
curl -X POST "http://localhost:8089/load_program" -d "file=/workspace/mybin"
curl "http://localhost:8089/decompile_function?program=mybin&name=main"
```
### BinDiff
命令行和 MCP。 从 Ghidra 或 IDA 导出 `.BinExport`,然后进行差异比较:
```bash
bindiff old.BinExport new.BinExport
```
ghidra-headless MCP 公开 `bindiff` 和 `bindiff_export_from_ghidra` 工具,
用于直接从 Ghidra 项目进行差异比较。
### angr + Python RE 栈
预安装:angr、pwntools、ropper、ropgadget、capstone、unicorn、keystone、
z3、lief、r2pipe、frida-tools、objection。
```bash
python3 -c "
import angr
p = angr.Project('/workspace/chall', auto_load_libs=False)
cfg = p.analyses.CFGFast()
print(f'{len(cfg.kb.functions)} 个函数,入口点位于 {hex(p.entry)}')
"
```
### 模糊测试
AFL++ 和 honggfuzz 安装在 `/opt/tools/fuzzing/bin`(在 PATH 中)。
```bash
# AFL++
mkdir -p fuzz-in && echo AAAA > fuzz-in/seed
afl-fuzz -i fuzz-in -o fuzz-out -- /workspace/chall @@
# 黑盒 / 无源码:添加 -Q(QEMU 模式)
# honggfuzz
mkdir -p hf-in && echo AAAA > hf-in/seed
honggfuzz -i hf-in -o hf-out -- /workspace/chall ___FILE___
```
### Android RE
```bash
apktool d app.apk -o app_decoded
jadx app.apk -d app_jadx_out
adb devices
frida -U -f com.example.app -l hook.js --no-pause
objection -g com.example.app explore
```
### 其他工具
`gdb`、`lldb`、`strace`、`ltrace`、`nasm`、`objdump`、`strings`、`patchelf`、
`gcc`、`clang` 和 `python3` 都在 PATH 中。
## 项目结构
```
.
├── .mcp.json MCP 配置 — 粘贴到您的客户端(单一入口)
├── CLAUDE.md 代理参考 + Claude Code 快速入门
├── docker-compose.yml 一键启动
├── docker/
│ └── Dockerfile 多阶段构建,版本固定
├── scripts/
│ ├── entrypoint.sh 容器入口点(启动 Ghidra MCP 守护进程)
│ ├── load-ghidra.sh 从 CLI 导入 + 加载二进制文件到 Ghidra MCP
│ └── mcp/
│ ├── gateway.py MCP 网关 — 将所有服务器组合到一个传输中
│ └── shell-mcp.py Shell 命令 MCP 服务器
├── .claude/
│ ├── settings.json 自动启用项目 MCP 服务器
│ └── agents/ 专门的 RE 代理(由 Claude Code 自动加载)
│ ├── binary-triage.md 快速 radare2 初步检查
│ ├── ghidra-importer.md 二进制文件导入 + 自动分析
│ ├── ghidra-analyst.md 静态 RE 深入分析
│ ├── ghidra-debugger.md 动态分析 / 调试器
│ └── re-orchestrator.md 全流程协调器
└── workspace/ 映射到 /workspace — 将二进制文件放在这里
```
## 安全
Compose 添加了 `SYS_PTRACHE` 并禁用 seccomp(`unconfined`)—
gdb、strace 和 AFL 需要。 在分析不受信任的二进制文件时,
请在隔离的 VM 中运行此容器。
## 构建和发布
每次推送和 PR 都通过 GitHub Actions(`.github/workflows/build.yml`)验证构建。
推送版本号标签(`v1.0.0`、`v1.0`)会将镜像发布到 GHCR(`ghcr.io/<user>/re-toolbox`)。