rea-reverse

IDA Pro MCP 配置:用 REA 把 Claude Code 和 Codex 接入 IDA

基于 REA 6.4.0更新于 约 9 分钟读完
本页目录

REA(morluto 的开源项目)可以把 IDA Pro 当作原生二进制的分析引擎。它的 IDA provider 建立在 mrexodia/ida-pro-mcp 之上:REA 连接你自己运行的 ida-pro-mcp 服务,只调用一组固定的只读工具,再把结果整理成 Evidence,格式和它的 Ghidra、Hopper provider 一致。所以「Claude Code 配置 IDA Pro MCP」在这里分成两层:先让 ida-pro-mcp 跑起来,再让 REA 接上它。

先看这一段,它决定你该装哪个版本: REA 6.4.0 的 attached(GUI)模式只认 ida-pro-mcp 1.4.0 的 legacy 工具。ida-pro-mcp 2.0.0 重新设计了工具名,和这个模式不兼容。这个问题记录在 REA issue #2301,本文写作时(2026-10-13 通过 GitHub API 核实)它仍处于 open 状态。headless 模式走另一套接口,后面单独说明。

适合谁读: 有正版 IDA Pro 授权,想让 Claude Code 或 Codex 通过 REA 读取 IDA 分析结果的人。

你会学到:

  • 需要准备什么:IDA Pro 8.3+、Python 3.11+、ida-pro-mcp 1.4.0、REA 6.4.0
  • REA 读取的注册文件怎么写,attached 和 headless 两种模式分别怎么配
  • REA_IDA_MCP_CONFIG 和 REA_ANALYSIS_PROVIDER 在 Claude Code 和 Codex 里写在哪
  • 哪些 REA 操作能配合 IDA 使用,哪些会失败、为什么

示例目标: 一个自己编译的小 C 程序(源码见下文)。

环境要求与授权

  • IDA Pro 8.3 或更高版本,正版授权。 ida-pro-mcp 的 README 写明需要 “IDA Pro (8.3 or higher, 9 recommended)”,并且 “IDA Free is not supported”。REA 不安装、不激活、不授权 IDA,请使用从 Hex-Rays 合法获得、按许可条款使用的版本。
  • IDA Free 在 REA 6.4.0 里同样用不了。 REA 仓库 main 的文档提到一个可用于 IDA Free 的可选原生桥接,但它的 "protocol": "native" 注册方式不在 6.4.0 发布包里:6.4.0 的注册文件校验会拒绝未知字段。需要等包含它的正式版本。
  • ida-pro-mcp 需要 Python 3.11+。
  • REA 6.4.0,用 npx rea-agents setup 注册到你的 agent(见 安装指南)。
  • headless 模式还需要 IDA Pro 自带的 idalib(IDA 9.x),并按 ida-pro-mcp README 完成激活。

只分析你有权分析的二进制文件。边界说明见 REA 的 DISCLAIMER.md。

REA 6.4.0 的版本兼容性

REA 6.4.0 在执行任何分析之前,会先检查上游服务返回的工具列表。每种模式只认一套工具:

REA 模式 REA 要求的上游工具 对应的 ida-pro-mcp 状态
attached(默认) 1.4 legacy:get_metadata、list_functions、list_strings、get_function_by_name、get_function_by_address、decompile_function、disassemble_function、get_callers、get_callees、get_xrefs_to 1.4.0 GUI 插件 支持
attached (2.0.0 GUI 插件改成了 lookup_funcs、decompile、disasm 等) 2.0.0 不兼容(#2301)
headless 数据库 supervisor:idb_open、idb_list、idb_close、server_health、list_funcs、lookup_funcs、find_regex、decompile、disasm、callees、xrefs_to 带 supervisor API 的 idalib-mcp 范围很窄,见下文

关于 headless:1.4.0 的 idalib-mcp 根本没有 supervisor API。这套 API 只存在于上游开发分支,它的 pyproject.toml 版本号写的是 2.0.0。#2301 的讨论显示,上游 PR #495 之前构建的 2.0.0 缺少 idb_close,会失败。REA 的 IDA provider 文档 记录的 headless 验证只针对上游的一个提交 c133c3853faa111a9b00ee615c013b720d0c4acd,平台是 Windows x64(IDA 9.3)和 macOS arm64(IDA Pro 9.1),Linux 上的 headless 运行还没有验证。所以请把 headless 当成实验功能,并锁定在这个提交上。想走 REA 6.4.0 文档里明确支持的路线,就用 attached 模式 + 1.4.0。

这在实际操作中很关键:上游 README 让你从 GitHub main 的压缩包 pip install,现在装下来的就是 2.0.0。照着上游 README 原样装,attached 模式一定会失败。

第 1 步:编译一个测试目标

用自己编译的小程序,答案心里有数:

// check.c
#include <stdio.h>
#include <string.h>

static int check_key(const char *s) {
    if (strlen(s) != 8) return 0;
    int sum = 0;
    for (int i = 0; i < 8; i++) sum += s[i] ^ 0x5A;
    return sum == 0x2F0;
}

int main(int argc, char **argv) {
    if (argc < 2) { puts("usage: check KEY"); return 1; }
    puts(check_key(argv[1]) ? "ok" : "bad key");
    return 0;
}
cc -O0 -g -o check check.c
shasum -a 256 check

为什么: REA 把每个结果都绑定到输入文件的 SHA-256。attached 模式下,它会拿这个哈希和 IDA 记录的输入哈希比对,所以你必须清楚自己在 IDA 里打开的是哪个文件。macOS 上 C 符号带前导下划线,函数名会变成 _main 和 _check_key。

第 2 步:安装 ida-pro-mcp 1.4.0(attached 模式)

从 PyPI 安装打了 tag 的 1.4.0,而不是 GitHub main 的压缩包:

python3 -m pip install "ida-pro-mcp==1.4.0" "mcp<2"
ida-pro-mcp --install

为什么要锁 mcp<2: ida-pro-mcp 1.4.0 声明的依赖是 mcp>=1.16.0,允许装上 2.x 的 Python MCP SDK。#2301 里给出的绕过办法指出,1.4 代理的 server.py 在 2.x SDK 下无法导入,所以要锁在 1.x。

--install 会复制 IDA 插件,并把 ida-pro-mcp 注册到它认识的 MCP 客户端。装完重启 IDA。

然后在 IDA Pro 里打开原始二进制(check),等自动分析完成,通过 Edit → Plugins → MCP 启动插件(1.4.0 的快捷键是 Ctrl-Alt-M)。插件监听 127.0.0.1:13337。

如果你已经装了 2.0.0,#2301 的报告者提到:1.4.0 的插件文件是自包含的,可以和 2.0.0 并存;但 1.4 插件把地址和端口写死了,要跑第二个实例需要手动改。

第 3 步:编写 REA 读取的注册文件

REA 不直接连 IDA 的端口,而是启动 ida-pro-mcp 的 stdio 代理(server.py),由它转发给插件。先用下面的命令拿到准确的解释器和脚本路径:

ida-pro-mcp --config

它会输出一个 mcpServers → ida-pro-mcp 条目,包含 command、args、timeout 和 disabled。只把 command、args(有 env 的话也带上)抄进一个新文件,例如 ~/ida/ida-mcp.json:

{
  "mode": "attached",
  "command": "/absolute/path/to/python3",
  "args": [
    "/absolute/path/to/site-packages/ida_pro_mcp/server.py",
    "--ida-rpc",
    "http://127.0.0.1:13337"
  ]
}

为什么不能直接粘贴输出: REA 6.4.0 对这个文件做严格校验。stdio 方式只接受 command、args、env、type、mode、timeoutMs 和 workspaceRoot;本机 HTTP 方式用本机回环 url 和可选的 headers 代替 command/args/env,同样可以带 type、mode、timeoutMs 和 workspaceRoot。多出任何字段,包括 --config 输出里的 timeout 和 disabled,整个文件都会判为无效。外面包一层 {"mcpServers": {"ida-pro-mcp": {...}}} 可以接受,但里面的条目同样按严格规则检查。

可选字段:

  • "timeoutMs":对上游每次请求的超时,默认 300000。
  • "mode":默认就是 "attached",这里写出来只是为了清楚。

文件不能超过 64 KiB(65,536 字节),REA_IDA_MCP_CONFIG 必须是绝对路径。

第 4 步:先在命令行里验证

export REA_IDA_MCP_CONFIG="$HOME/ida/ida-mcp.json"
export REA_ANALYSIS_PROVIDER=ida

rea doctor --provider ida --json
rea search /absolute/path/check "bad key" --json
rea function /absolute/path/check check_key --json
rea decompile /absolute/path/check check_key --json

如果你同时也用 Ghidra,可以不设 REA_ANALYSIS_PROVIDER,改为在单条命令上加 --provider ida。

每一步验证了什么:

  • doctor --provider ida 只校验注册文件,不启动 IDA,也不检查上游兼容性(#2301 指出,即使连的是 2.0.0,它也会报告正常)。
  • 第一条真正的分析命令会建立连接,把工具列表和 attached 模式要求的工具对比,并检查 IDA 记录的输入 SHA-256 是否和 check 一致。之后每次请求前后,REA 都会重新核对身份和镜像基址。
  • function 返回完整的函数档案;decompile 只返回伪代码。

在 IDA 下用 xrefs 时必须给十六进制地址(rea xrefs /absolute/path/check 0x...),不能给符号名。

第 5 步:Claude Code 配置 IDA Pro MCP(以及 Codex)

两个变量要加在 REA 的服务条目里,不是 ida-pro-mcp 的条目。如果运行 npx rea-agents setup --client claude_code 时 shell 里已经设置了 REA_IDA_MCP_CONFIG,并且它指向的注册文件能通过校验,setup 会把它带进注册信息;REA_ANALYSIS_PROVIDER 需要手动加。之后重新运行 setup,已有的 env 设置会保留。

Claude Code(~/.claude.json,写在已有的 rea 条目里):

"env": {
  "REA_IDA_MCP_CONFIG": "/Users/you/ida/ida-mcp.json",
  "REA_ANALYSIS_PROVIDER": "ida"
}

Codex(~/.codex/config.toml):

[mcp_servers.rea.env]
REA_IDA_MCP_CONFIG = "/home/you/ida/ida-mcp.json"
REA_ANALYSIS_PROVIDER = "ida"

改完后彻底重启客户端。打开目标要等 IDA 响应,headless 模式还要等自动分析完成,所以把客户端的工具超时设得宽松一些:Codex 是 [mcp_servers.rea] 下的 tool_timeout_sec,Claude Code 是环境变量 MCP_TOOL_TIMEOUT(单位毫秒)。这两个都是客户端自己的设置,默认值请以客户端文档为准。

如果 ida-pro-mcp 的 --install 也把它自己注册进了 Claude Code,你现在就有两个和 IDA 相关的服务。这样能用,但要在提问时说明用哪一个,因为两边都有反编译类的工具。

推荐的提问方式

如果没有设置 REA_ANALYSIS_PROVIDER,就让 agent 用 provider_id: "ida" 打开目标:

Use REA. Open /absolute/path/check with open_binary and provider_id "ida".
Find the function that decides whether a key is valid, decompile it, and
explain the condition in plain terms. Quote addresses for every claim and
list anything the IDA adapter reported as unknown. Close the binary when done.
With REA's IDA provider, search strings in /absolute/path/check for "key",
find which function references that string (use xrefs with the string's
address), and show that function's callees.

用中文提问也可以,比如:「用 REA 的 IDA provider 打开 /absolute/path/check,找出判断 key 是否正确的函数,反编译并用通俗的话解释判断条件;每个结论附上地址,列出 IDA 适配器报告为未知的部分,最后关闭目标。」

为什么要显式打开和关闭: open_binary 启动 provider 会话,close_binary 释放它。attached 模式下,关闭只会断开 REA 的 MCP 连接,不会保存或关闭你的 IDA 数据库。

通用的提问结构见 Claude Code 逆向 Skill。

6.4.0 的 headless 模式

headless 模式让 REA 不经过 GUI,自己打开一个 IDA 数据库。注册文件如下:

{
  "mode": "headless",
  "command": "idalib-mcp",
  "args": ["--stdio", "--max-workers", "1"]
}

如果你的 idalib 环境需要,可以加 "env": {"IDADIR": "/absolute/path/to/ida"};还可以选填 "workspaceRoot": "/absolute/existing/tmp/dir"。本机的 Streamable HTTP supervisor 可以用 "url": "http://127.0.0.1:8745/mcp" 代替 command。REA 只接受不带凭据的 localhost、127.0.0.1 或 [::1] 地址。

这个模式下 REA 会:

  1. 把二进制复制到私有临时目录,并重新核对 SHA-256。
  2. 用 force_headless 和自己的会话 ID 调用 idb_open,再通过 idb_list 确认自己拥有一个处理这份副本的活动 worker。
  3. 在 server_health 报告自动分析完成之前,拒绝执行分析。
  4. 关闭时用 save: false 调用 idb_close,确认 worker 已退出,然后删除副本。

原始文件永远不会被修改。要求和限制:

  • supervisor 必须提供 idb_close(见兼容性表),这正是上游 PR #495 之前的 2.0.0 构建缺少的部分。
  • REA 和 supervisor 必须共享同一个文件系统和路径格式:要么都跑在 Windows 上,要么都在同一台 Unix 主机上。
  • headless 模式下没有 procedure_callers(直接调用者),因为新版工具无法证明直接调用关系。改用对函数地址做 xrefs。

IDA 能做什么、不能做什么

REA 的 IDA 适配器声明了这些只读操作:列出和搜索函数、字符串,解析函数地址,伪代码,汇编,函数原始指令,调用者(仅 attached),被调用者,交叉引用,以及 analyze_function 函数档案。

不支持的有:

  • rea analyze / rea inspect / MCP 的 binary_overview。 它们需要段和文档列表,IDA 适配器没有声明这些操作,所以会以 capability_unavailable 失败(#2460,open)。请从 search、function 或 decompile 入手。
  • .idb / .i64 文件。 REA 只接受可执行文件,请打开原始输入。
  • MIPS 目标。 REA 的 IDA 适配器没有经过验证的 MIPS 支持,请改用 Ghidra。
  • 重命名、打补丁、类型修改、调试或任意 IDAPython。适配器按设计就是只读的。

结果是实时的:描述的是 IDA 数据库当前的状态。REA 会记录请求前后的数据库状态,但无法证明数据库没被修改过。

常见报错与排查

刚连上就报 unreadable_output /「Analysis returned an unreadable result」。 最可能是版本不匹配,比如 attached 模式后面接的是 2.0.0 的 GUI 插件。#2301 提到,CLI 只显示这个笼统的错误,内部错误信息里才写着缺了哪些工具。用 pip show ida-pro-mcp 看版本,换成 1.4.0。

“REA_IDA_MCP_CONFIG must contain an IDA MCP command/args or local url registration”。 JSON 里有多余字段(多半是 --config 输出的 timeout 或 disabled),或者 URL 不是本机回环地址。按第 3 步列出的字段精简。

“The attached IDA input SHA-256 does not match the selected target”。 IDA 里打开的是另一个文件,或者你传入的副本字节不同。在 IDA 里打开同一个文件,或者传 IDA 实际加载的路径。

“IDA MCP integration admits executable inputs, not analysis databases”。 你传的是 .i64 或 .idb,改传原始二进制。

“IDA auto-analysis is incomplete or readiness is unknown”。 headless worker 还在分析。等分析完成后重试;大文件可以调大 timeoutMs。

代理启动时报 FastMCP 的 ImportError。 1.4 代理运行在 2.x 的 Python MCP SDK 上。加上 "mcp<2" 重新安装。

端口 13337 被占用。 另一个 IDA 实例已经启动了插件。关掉它,或者参考 #2301 里修改 1.4 插件端口的说明。

rea doctor 显示正常但就是用不了。 这是预期的:doctor 只检查文件。第一次真正的分析调用才是兼容性测试。

下一步