GhidraMCP、IDA Pro MCP、r2mcp 怎么选:逆向工程 MCP 服务器对比
本页目录
先说结论: 你平时用哪个反汇编器,就选接哪个反汇编器的 MCP 服务器。GhidraMCP 接 Ghidra(免费),ida-pro-mcp 接 IDA Pro(收费,不支持 IDA Free),r2mcp 接 radare2(免费),Binary Ninja 插件接 Binary Ninja(需要支持插件的付费版)。REA 是另一种形态:一个服务器,原生代码可以走 Ghidra、Hopper 或 IDA,另外还覆盖 .NET、Electron、Android 等非原生目标。在同一个测试二进制上,GhidraMCP 和 REA 的 Ghidra provider 输出的伪代码逐字节相同,因为底层都是 Ghidra;区别在外面那层包装。
怎么核实的。 2026-11-02,我在一台 Apple Silicon Mac 上,用同一个自己编译的二进制跑了 GhidraMCP 2.0 和 REA 6.7.0(Ghidra provider)。ida-pro-mcp(我没有 IDA Pro 授权)、r2mcp 和 Binary Ninja 插件都没有运行,相关内容是 2026-10-13 根据各仓库和厂商页面整理的资料,出处列在文末。本站发布 REA 教程,看 REA 部分时请把这一点考虑进去;本站与 REA 及文中任何项目都没有隶属关系。
实测:同一个二进制上的 GhidraMCP 和 REA
样本是我用 Apple clang 21(clang -O1)编译的一个 33,464 字节的 Mach-O arm64 hello-world,SHA-256 为 f4f27f8a…6fafc914。它对第一个参数算哈希,然后打印 hello, friend 或 hello, stranger。
两者共同需要的准备
两者都用 Ghidra 12.1.4 加 Temurin JDK 21.0.13,下载到一个临时目录里。开跑之前有两个坑:
- Ghidra 12.1.4 的发布包里没有 macOS 的反编译器二进制,
Ghidra/Features/Decompiler/os/下只有linux_x86_64和win_x86_64。GhidraMCP 的 README 让你先编译一次:support/gradle/gradlew buildNatives(JAVA_HOME指向 JDK 21)。这里用 Xcode 自带的 clang,18 秒编完,生成了build/os/mac_arm_64/decompile。之后 REA 的rea doctor --provider ghidra报告ghidra-native_decompiler ... reports mach-o arm64, which matches darwin/arm64。 - 别直接装最新版 Ghidra。 12.2 在 2026-10-22 发布了,但 GhidraMCP 2.0 的扩展是针对 12.1.4 构建的,REA 文档写明它的桥接在 12.1.4 上验证,REA 的安装说明还提到 12.2 需要 JDK 25。
GhidraMCP 2.0,无界面模式
GhidraMCP 2.0 有一个 headless 模式,自己通过 PyGhidra 导入二进制,不需要打开 Ghidra 界面。我用发布包里的 wheel 和扩展 JAR 启动桥接程序,再通过 stdio 用 MCP 协议和它通信:
export GHIDRA_INSTALL_DIR=/path/to/ghidra_12.1.4_PUBLIC
uvx --python 3.13 --from "ghidra-mcp[headless] @ file:///path/to/ghidra_mcp-2.0.0-py3-none-any.whl" \
ghidra-mcp --headless --binary ./hello --extension-jar /path/to/GhidraMCP/lib/GhidraMCP.jar
它暴露了 28 个工具,包括 decompile_function、get_xrefs_to、rename_function_by_address、set_function_prototype 和 set_local_variable_type。结果节选:
get_program_info -> "language_id": "AARCH64:LE:64:AppleSilicon", "function_count": 3,
"external_function_count": 2, "entry_points": ["100000460", "100000000"],
"sha256": "f4f27f8a515a31de487540dbee06481074f3c808a26e1133a127f6713fafc914"
list_functions -> entry @100000460, _puts @1000004f0, _strlen @1000004fc
decompile_function {"name": "main"}
-> [FUNCTION_NOT_FOUND] No function found named 'main'
rename_function_by_address {"function_address": "100000460", "new_name": "main"}
-> {"old_name": "entry", "new_name": "main"}
两个实用细节。这个二进制其实有 _main 符号(nm 显示在 0x100000460),但 Ghidra 把这个函数标成了程序入口 entry,search_functions_by_name("main") 返回空。agent 如果直接要 main 就会报错,得先列出函数。另外,改名成功了,但在 headless 模式下只在本次会话有效:退出时服务器日志写着 Discarding unsaved changes to hello。README 里的 --project DIR 参数可以保留项目、在多次运行之间保存修改。第一次运行连同 uvx 下载约 20 秒;再跑一次,五个调用共 3.6 秒。
REA 6.7.0,Ghidra provider
REA(第三方开源工具)通过自己的无界面桥接使用同一个 Ghidra:
export GHIDRA_INSTALL_DIR=/path/to/ghidra_12.1.4_PUBLIC JAVA_HOME=/path/to/jdk-21/Contents/Home
rea analyze ./hello --provider ghidra --json
rea decompile ./hello 0x100000460 --provider ghidra --json
analyze 报告 image_base 为 0x100000000,9 个段,5 个过程(3 个本地函数加 2 个外部函数),17 个已定义字符串,耗时 5.3 秒。decompile 耗时 5.2 秒,因为命令行每次调用都会把二进制导入一个全新的临时 Ghidra 项目。它的伪代码和 GhidraMCP 的逐字节相同(711 个字符,用脚本比对):
undefined8 entry(int param_1,long param_2)
{
...
if (param_1 < 2) {
uVar4 = 2;
pcVar2 = "usage: hello <word>";
}
else {
pbVar5 = *(byte **)(param_2 + 8);
sVar1 = _strlen((char *)pbVar5);
if (sVar1 == 0) {
uVar4 = 0;
pcVar2 = "hello, stranger";
}
else {
iVar3 = 0;
do {
iVar3 = (uint)*pbVar5 + iVar3 * 0x1f;
sVar1 = sVar1 - 1;
pbVar5 = pbVar5 + 1;
} while (sVar1 != 0);
uVar4 = 0;
pcVar2 = "hello, friend";
if (iVar3 != 0x5f2a1c3b) {
pcVar2 = "hello, stranger";
}
}
}
_puts(pcVar2);
return uVar4;
}
REA 在外面多加的是:一个 evidence_id、目标文件的 SHA-256、确切的 Ghidra 版本和分析设置、"confidence": "observed",以及一串限制说明,比如 “Pseudocode is Ghidra decompiler output, not original source”,以及临时项目在关闭时会被删除。
对比说明了什么
- 同一个引擎,同一个答案。 两个服务器底下都是 Ghidra 12.1.4,反编译结果就一样。该比的是外面那层,而不是“谁反编译得更好”。
- 会话模式。 GhidraMCP 在服务器生命周期内一直开着同一个分析好的程序(或者连到你的图形界面),后续调用快,还能改名。REA 的命令行每次调用都重新导入,对 Ghidra 的修改只限函数名和入口注释,关闭就丢弃;换来的是每个结果都带哈希和明确的限制说明。
- 工具面。 GhidraMCP 直接暴露 Ghidra 的“读取加标注”循环(28 个工具)。REA 的 Ghidra provider 在修改上更窄,但多了 Ghidra 之外的目标类型。
IDA Pro MCP:我没能测试的部分
ida-pro-mcp 需要 IDA Pro 8.3 或更高(推荐 9),README 写明不支持 IDA Free。我没有 IDA Pro 授权,所以没有运行,下面都不是亲测。按其 README(2026-11-02 复核),推荐模式是 idalib-mcp:一个无界面的管理进程,每个数据库放在独立的 idalib 工作进程里;GUI 插件“is no longer recommended”。工具涵盖反编译、反汇编、交叉引用、注释、打补丁、类型、栈帧、调试器扩展和 py_eval。README 开头现在写着 “I recommend using the Official Hex-Rays IDA MCP Server instead!”(HexRaysSA/ida-mcp,需要带 idalib 的 IDA 9.4+)。最新的 GitHub Release 仍是 1.4.0(2025-10-06),默认分支还在活跃提交。
如果打算把 IDA 接在 REA 后面:REA 6.7.0 默认的 attached 模式要求 ida-pro-mcp 1.4.0 的工具名,与上游 main 现在安装出来的 2.0 风格工具不兼容(REA issue #2301)。可以用 python3 -m pip install "ida-pro-mcp==1.4.0" "mcp<2" 锁定版本,或使用 REA 的 "protocol": "native" 模式。rea doctor --provider ida 只校验注册文件,所以插件不兼容时也可能报告健康。这两条路我都没有测试。
对比表(资料整理,2026-10-13 核对)
“引擎费用”指底层反汇编器的费用,不是 MCP 服务器本身。只有标明实测的行是亲测。
| GhidraMCP | ida-pro-mcp | r2mcp | Binary Ninja MCP(fosdickio) | REA | |
|---|---|---|---|---|---|
| 本文是否实测 | 是,2.0 headless | 否 | 否 | 否 | 是,6.7.0 + Ghidra |
| 引擎 | Ghidra 12.1.4(GUI 扩展或 PyGhidra 无界面) | IDA Pro,经 idalib 或 GUI 插件 | radare2(原生 C API) | Binary Ninja 插件(GUI) | Hopper、Ghidra 12.1.x,或经上游 IDA MCP 接 IDA |
| 服务器语言 | Java 扩展 + Python 桥接 | Python | C | Python 插件 + Node 或 Python 桥接 | TypeScript / Node.js |
| 安装 | 发布包装进 Ghidra,再用 uvx 跑桥接 |
插件市场,或 pip + ida-pro-mcp --install |
r2pm -Uci r2mcp、Docker 或源码 |
Binary Ninja 插件管理器 | npx rea-agents setup |
| 运行依赖 | Ghidra + JDK 21,Python 3.10+(headless 为 3.10–3.13) | IDA Pro 8.3+、Python 3.11+、uv |
radare2 | Binary Ninja、Python 3.12+ | Node.js 22.19+/24.11+/26+,外加引擎 |
| 写入能力 | 改名、函数原型、局部变量类型、注释 | 注释、打补丁、类型等 | 支持,可选只读模式 | 改名、注释、类型、字节补丁 | Ghidra:函数名和入口注释,关闭即丢弃 |
| 服务器许可证 | Apache-2.0 | MIT | MIT | GPL-3.0 | MIT |
| 引擎费用 | 免费 | IDA Pro,商业 | 免费 | 需付费版才支持插件 | Ghidra 免费;Hopper、IDA 商业 |
| 最新版本 | 2.0(2026-10-10) | 1.4.0(2025-10-06);分支活跃 | 1.8.8(2026-09-06) | v1.2.1(2026-03-22);分支活跃 | npm 6.7.0(2026-10-18) |
引擎价格取自厂商页面,2026-10-13 核对:Hex-Rays 列出 IDA Free 免费、IDA Home 每年 365 美元起、IDA Pro 每年 1,099 欧元起(价格);IDA Home 能否配合 ida-pro-mcp 使用未查证。Vector35 列出 Binary Ninja Free(0 美元,不支持插件)、Personal(199 美元,仅 GUI 内支持插件)、Commercial(1,799 美元,支持无界面)和 Ultimate(3,499 美元)(购买)。Vector35 还有一个测试版 Sidekick MCP 服务器(文档),本文没有评估。
据各 README:r2mcp 可以作为 stdio 服务器、r2 核心插件或带可选 bearer token 认证的 HTTP 服务器运行,有只读和沙箱开关,也可选执行原始 r2 命令或 r2js。Binary Ninja 插件暴露 HLIL、MLIL、LLIL、字符串、交叉引用,并支持同时打开多个二进制。REA 的非原生目标(Electron、.NET、Android、网页抓包、固件)各有前置条件,其中几类只支持 Linux。
该选哪个?
- 本来就在用 IDA Pro: ida-pro-mcp,或者在 IDA 9.4+ 上用 Hex-Rays 官方的 IDA MCP。
- 想要一套基于 Ghidra 的免费方案: GhidraMCP。编好反编译器原生组件之后,它的 headless 模式在 macOS 上能正常工作。
- 常用 radare2,或者想要一个带只读和沙箱开关的小型 C 服务器: r2mcp。
- 有 Binary Ninja Personal 或更高版本,想用 IL 层面的能力: Binary Ninja MCP 插件。
- 目标类型混杂(原生辅助程序加 Electron 应用、APK、.NET DLL),或者想要带哈希、可复现的结果: REA,见 REA MCP 入门。
同时跑多个也没问题,但要在客户端配置里给每个服务器起不同的名字,工具名太像会让 agent 混淆。HTTP 服务器请只绑定本机回环地址,并且只分析你有权分析的软件。
资料来源
实测:2026-11-02(Ghidra 12.1.4、JDK 21.0.13、GhidraMCP 2.0、REA 6.7.0,Apple Silicon 上的 macOS)。资料整理:2026-10-13,其中 GhidraMCP、ida-pro-mcp 和 Ghidra 版本信息于 2026-11-02 复核。
- GhidraMCP:仓库、Releases
- Ghidra:Releases
- ida-pro-mcp:仓库;Hex-Rays IDA MCP:仓库、发布公告
- r2mcp:仓库
- Binary Ninja MCP:fosdickio/binary_ninja_mcp、Sidekick MCP 服务器文档
- REA:README、安装、Ghidra provider、IDA provider
- 价格:Hex-Rays、Binary Ninja