技术架构概览

1
2
3
4
5
6
┌─────────────────┐     stdio/MCP      ┌──────────────────┐     HTTP/JSON-RPC    ┌─────────────────┐
│ Claude Code │ ◄────────────────► │ ida-pro-mcp │ ◄──────────────────► │ IDA Pro │
│ (VSCode 插件) │ MCP Protocol │ server.py │ localhost:13337 │ + ida_mcp 插件 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │ │
AI 对话界面 MCP 代理层 实际反编译引擎

一、涉及的核心技术

1. MCP(Model Context Protocol)

MCP 是 Anthropic 提出的开放协议,用于让 AI 模型安全地调用外部工具。

核心概念:

  • Host:AI 客户端(Claude Code)
  • Server:提供工具能力的服务(ida-pro-mcp)
  • Transport:通信方式,分两种:
    • stdio:通过标准输入/输出管道通信,Claude Code 启动 server.py 作为子进程
    • HTTP/SSE:通过网络通信

握手流程(stdio 模式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Claude Code                          server.py
│ │
│──spawn subprocess─────────────► │ 启动
│ │
│──{"method":"initialize",...}──► │ 发送初始化请求
│ │
│◄──{"result":{"capabilities":{}}}─ │ 返回能力声明
│ │
│──{"method":"notifications/ │
│ initialized"}──────────────► │ 握手完成
│ │
│──{"method":"tools/list"}──────► │ 获取工具列表
│◄──{...tools...}─────────────── │
│ │
│──{"method":"tools/call",...}──► │ 调用工具
│◄──{...result...}────────────── │

为什么 60 秒超时: Claude Code 发送 initialize 后若 60 秒内没收到响应,即报 startup() initialize handshake timed out。最常见原因是 server.py 启动时 IDA Pro 未运行,导致进程异常或阻塞。


2. IDA Pro MCP 插件架构

ida-pro-mcp 分为两层:

层一:IDA 内部插件(ida_mcp.py

运行在 IDA Pro 进程内部,使用 IDA SDK:

  • 启动一个 HTTP 服务器,监听 localhost:13337
  • 接收 JSON-RPC 请求,调用 IDA API(反编译、读取汇编、重命名等)
  • ~/.idapro/mcp/instances/instance_13337.json 写入实例注册文件

注册文件示例:

1
2
3
4
5
6
7
8
{
"host": "127.0.0.1",
"port": 13337,
"pid": 16368,
"binary": "SimpleCrackme.exe",
"idb_path": "/Users/island/Downloads/SimpleCrackme.exe.i64",
"started_at": "2026-04-14T09:09:07Z"
}

层二:MCP 代理(server.py

独立 Python 进程,Claude Code 通过 stdio 与它通信:

  • 启动时读取 ~/.idapro/mcp/instances/ 自动发现 IDA 实例
  • 将 Claude 的工具调用转换为 HTTP 请求转发给 IDA 插件
  • 使用自研的 zeromcp 库实现轻量级 MCP 协议(无需官方 SDK 依赖)

请求代理流程:

1
Claude Code ──[stdio JSON-RPC]──► server.py ──[HTTP POST :13337]──► IDA 插件 ──[IDA SDK]──► 反编译结果

二、环境准备

系统要求

  • macOS / Windows / Linux
  • IDA Pro(支持 Python 插件)
  • Python 3.10+(独立于 IDA 自带的 Python)
  • VSCode + Claude Code 插件

安装 ida-pro-mcp

1
pip install ida-pro-mcp

三、IDA Pro 插件安装

将插件复制到 IDA 插件目录:

1
2
3
4
5
6
# macOS
cp $(python3 -m ida_pro_mcp install-plugin --print-path) \
"/Applications/IDA Professional 9.x.app/Contents/MacOS/plugins/"

# 或使用自动安装命令
python3 -m ida_pro_mcp install-plugin

安装成功后,IDA Pro 菜单会出现:Edit → Plugins → MCP


四、配置 Claude Code

方式一:命令行添加

1
2
3
claude mcp add ida-pro-mcp \
/Library/Frameworks/Python.framework/Versions/3.13/bin/python3 \
/path/to/ida_pro_mcp/server.py

方式二:直接编辑 ~/.claude.json

1
2
3
4
5
6
7
8
9
10
11
12
{
"mcpServers": {
"ida-pro-mcp": {
"type": "stdio",
"command": "/Library/Frameworks/Python.framework/Versions/3.13/bin/python3",
"args": [
"/Users/yourname/Library/Python/3.13/lib/python/site-packages/ida_pro_mcp/server.py"
],
"env": {}
}
}
}

注意command 填写完整的 Python 解释器路径,不要用 python3,避免路径解析问题。


五、启动顺序(关键)

必须按以下顺序操作,否则会出现 60 秒握手超时:

1
2
3
4
5
1. 打开 IDA Pro
2. 打开要分析的二进制文件(.exe / .so / .bin 等)
3. 等待 IDA 自动分析完成(进度条消失)
4. 点击 Edit → Plugins → MCP,启动插件(或配置为自动启动)
5. 启动 Claude Code(VSCode 中打开)

验证插件是否启动:

IDA 插件启动后会在 ~/.idapro/mcp/instances/ 目录写入 JSON 文件,Claude Code 的 server.py 读取这个文件来发现 IDA 实例。


六、验证连接

在 Claude Code 中直接询问:

1
检查 MCP 服务器健康状态

Claude 会调用 server_health 工具,返回类似:

1
2
3
4
5
6
7
{
"status": "ok",
"idb_path": "/Users/island/Downloads/SimpleCrackme.exe.i64",
"module": "SimpleCrackme.exe",
"auto_analysis_ready": true,
"hexrays_ready": true
}

七、可用工具一览

连接成功后,Claude 可以调用以下 IDA 功能:

分类 工具 功能
反编译 decompile 将函数反编译为 C 伪代码
汇编 disasm 获取汇编指令
分析 analyze_function 分析函数结构
重命名 rename 重命名函数/变量
注释 set_comments 添加注释
交叉引用 xrefs_to 查找引用关系
数据流 trace_data_flow 追踪数据流向
类型 set_type / declare_type 设置/声明类型
搜索 find / find_bytes 搜索字符串/字节
导入表 imports 列出导入函数

八、常见问题

Q: 出现 startup() initialize handshake timed out after 60000ms

原因:Claude Code 启动时 IDA Pro 未运行,server.py 无法完成 MCP 握手。
解决:先打开 IDA Pro 并启动 MCP 插件,再重启 VSCode/Claude Code。

Q: server.py 找到多个 IDA 实例

现象:同时打开了多个 IDA Pro 窗口。
处理server.py 自动选择第一个发现的实例,可通过 select_instance 工具切换。

Q: HexRays 反编译器不可用

原因:IDA Free 版不包含 Hex-Rays 反编译器,或 license 未授权。
现象hexrays_ready: falsedecompile 工具报错。


九、实际使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
用户:分析 sub_401000 函数,告诉我它的功能

Claude:[调用 decompile(address="0x401000")]
[调用 xrefs_to(address="0x401000")]

根据反编译结果,这是一个字符串比较函数,
接受用户输入并与硬编码字符串 "S3cr3t!" 对比...
建议将其重命名为 check_password

用户:好,重命名并加上注释

Claude:[调用 rename(address="0x401000", name="check_password")]
[调用 set_comments(address="0x401000", comment="验证用户密码")]

总结

整个技术栈的核心思路是协议分层解耦

  • MCP 协议解耦了 AI 模型与工具实现,Claude 不需要知道 IDA 的任何细节
  • stdio transportserver.py 作为无状态代理,简单可靠
  • 实例注册文件解耦了 IDA 插件与 MCP 代理的生命周期,两者独立启动
  • HTTP JSON-RPC 让 IDA 插件以标准方式暴露能力,与 MCP 层松耦合

© Rabbit 使用 Stellar 创建

✨ 营业:

共发表 56 篇Blog 🔸 总计 123.6k