rea-reverse

GhidraMCP、IDA Pro MCP、r2mcp 怎么选:逆向工程 MCP 服务器对比

基于 REA 6.7.0发布者 rea-reverse更新于 约 7 分钟读完
本页目录

先说结论: 你平时用哪个反汇编器,就选接哪个反汇编器的 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 复核。