GrecAndrei/ida-pro-mcp
GitHub: GrecAndrei/ida-pro-mcp
为 LLM agent 提供对 IDA Pro 的确定性 MCP 访问接口,支持反编译、交叉引用、语义搜索和带证据持久化的发现工作区。
Stars: 6 | Forks: 1
# IDA Pro MCP
为 LLM agent 在 IDA Pro 中提供一个专属席位。
这是一个 [MCP](https://modelcontextprotocol.io) 服务器,它将 IDA Pro 的分析能力作为 41 个具备精确 schema 的操作暴露给模型——包括反编译、交叉引用、搜索、重命名、注释——外加一个发现 (findings) 工作区,使得模型的结论可以跨轮次保留,而不是仅存在于上下文窗口中。
它运行确定性的 IDA SDK 调用。其背后没有 LLM 服务,并且关于你的二进制文件的任何信息都不会离开本机。
## 为什么使用它而不是简单的 SDK 包装器
**每个操作都有精确的 schema。** 接口形式是 `ida_decompile(address)`,而不是 `tool(action="decompile", ...)`。模型不需要推断参数结构,因此不会在 `INVALID_ARGS` 上浪费轮次。`ida_help(topic="ida_decompile")` 会通过 MCP 返回操作契约,因此它在没有文件系统访问权限的客户端中也能工作。
**反编译附带结构信息,而不仅是文本。** `ida_decompile` 返回伪代码*以及*一个有界的证据块:CFG 形状、解析后的调用目标、ctree 控制点和本地数据流。`ida_disassemble` 返回 CFG 和调用目标部分,而无需启动 Hex-Rays。对函数进行推理的模型获取到的是图谱,而不仅仅是代码列表。
**语义搜索在本地运行,如果无法运行则会明确告知。** 函数 embedding 通过 `llama-server` 使用本地 GGUF 模型。如果模型或服务器不可用,语义操作会显式返回不可用结果——它们绝不会回退到不同的向量空间,也绝不会将伪装成分数的零向量交回去。索引会记录模型、维度和 prompt 格式,并在发生任何更改时进行重建。
**发现 (findings) 有证据支撑且持久化。** `ida_write_finding` 将带有置信度和支持证据的声明记录到对应地址,并存入每个会话的 SQLite 工作区中,该工作区带有仅追加的审计追踪。并发更新会在写锁下合并证据,而不是覆盖原有数据。`ida_next_target` 会对接下来要查看的内容进行排序。
**变更操作受到门控限制,且门控权在你手中。** 任何写入 IDB 的操作都需要显式的 `risk_ack`。策略的严格程度由操作者通过 `IDA_MCP_POLICY_MODE` 或 `~/.config/ida-pro-mcp/policy.json` 决定;一个会话可以收紧策略,但绝不能放松它。参见 [SAFETY_MODEL.md](SAFETY_MODEL.md)。
**并发会话保持隔离。** 每个 MCP 连接都拥有其打开的会话。另一个客户端无法驱动、切换或终止它未打开的会话,并且断开连接会拆除该连接启动的 `idat` 进程。
## 安装
```
python install.py
```
这将构建运行时环境,定位 IDA,配置受支持的 MCP 客户端,并为 Claude Code、Codex 和 OpenCode 安装便携的 `ida-pro-mcp` 技能。
**环境要求:** IDA Pro 9.2+,Python 3.11+。运行时依赖仅有四个包(`tomli-w`、`yara-python`、`requests`、`numpy`)——不需要 torch,也不需要 transformers。
从源码构建:
```
git clone https://github.com/GrecAndrei/ida-pro-mcp.git
cd ida-pro-mcp
pip install -e .
python -u -m ida_pro_mcp.host.server
```
## 快速开始
```
// Open a binary
{"name": "ida_open_binary", "arguments": {"binary_path": "/path/to/binary"}}
// Orient
{"name": "ida_overview", "arguments": {}}
{"name": "ida_session_state", "arguments": {}}
// Find and read code
{"name": "ida_find", "arguments": {"query": "recv", "limit": 20}}
{"name": "ida_decompile", "arguments": {"address": "0x401000"}}
{"name": "ida_xrefs_to", "arguments": {"address": "0x401000"}}
// Record what you concluded
{"name": "ida_write_finding", "arguments": {
"title": "packet receive handler",
"content": "Parses inbound data before dispatching on the command byte.",
"address": "0x401000",
"confidence": 0.8}}
// Writes need an acknowledgement
{"name": "ida_rename", "arguments": {
"address": "0x401000", "name": "handle_recv", "risk_ack": true}}
```
遍历接口的典型路径:
```
ida_open_binary → ida_session_state → ida_overview → ida_find
→ ida_decompile / ida_disassemble / ida_xrefs_to → ida_write_finding
```
## 操作列表
| 分组 | 操作 |
|---|---|
| **Session** | `open_binary`, `close_session`, `session_state`, `session_status`, `session_health` |
| **Discovery** | `overview`, `find`, `list_functions`, `list_imports`, `list_strings`, `semantic_search`, `index_functions`, `index_status`, `cancel_index` |
| **Code** | `decompile`, `disassemble`, `xrefs_to`, `callers`, `callees` |
| **Findings** | `write_finding`, `update_finding`, `list_findings`, `search_findings`, `next_target`, `analysis_brief` |
| **Edit** | `rename`, `comment`, `change_function`, `create_function` |
| **Calculation** | `calc_eval`, `calc_convert`, `calc_deref`, `calc_offset`, `calc_align`, `calc_bitops`, `calc_chain`, `calc_resolve` |
| **Support** | `help`, `continue`, `python` |
| **Workflow** | `batch` |
所有操作均带有 `ida_` 前缀。完整契约见 [docs/TOOLS_REFERENCE.md](docs/TOOLS_REFERENCE.md),或者向服务器询问:`ida_help(query="strings")`。
早期的宽泛 `tool(action=...)` API 为了兼容旧脚本仍然保留——只需设置 `IDA_MCP_TOOL_SURFACE=legacy`。它是一个兼容性后端,而不是受支持的契约。
## 配置
| 变量 | 默认值 | 用途 |
| --- | --- | --- |
| `IDA_MCP_TOOL_SURFACE` | `agent` | `agent` 用于 `ida_*` 操作,`legacy` 用于旧目录 |
| `IDA_MCP_RESPONSE_MODE` | `compact` | `full` 用于获取未缩减的 payload |
| `IDA_MCP_POLICY_MODE` | `assist` | `off`, `permissive`, `assist`, `enforce` — 操作者基准 |
### 本地 embedding
语义搜索和完整索引是可选的。默认配置是 BGE Code v1;Zembed 1 为可选,且仅限非商业用途。
| 配置 | 维度 | 许可证 | 备注 |
| --- | ---: | --- | --- |
| `bge-code-v1` | 1536 | Apache-2.0 | 默认。需提供本地 GGUF。 |
| `zembed-1` | 2560 | CC-BY-NC-4.0 | Q4_K_M 量化下约 2.5 GB;在 CPU 上运行较慢。 |
```
# 托管下载,明确 opt-in
python install.py --embed-profile zembed-1 --download-embed-model \
--accept-model-license --install-llama-server
# 或指向你自己的 GGUF
python install.py --embed-profile zembed-1 --embed-model /path/to/model.gguf
# 无需打开 IDA 即可检查配置
python install.py --embedder-doctor --embed-profile zembed-1
```
模型仅在显式索引、语义搜索或锚点刷新时启动。普通的工具调用永远不会启动它。每个服务器同时只处理一个请求;超时的请求会回收该服务器,而不是排在后面等待,并且索引会返回一个可恢复的游标,以便传回给 `ida_index_functions`。
| 变量 | 默认值 | 用途 |
| --- | --- | --- |
| `IDA_MCP_EMBED_PROFILE` | `bge-code-v1` | 选择 prompt 和预期的模型配置 |
| `IDA_MCP_EMBED_MODEL` | 自动检测 | GGUF 模型的路径 |
| `IDA_MCP_EMBED_SERVER_BIN` | 自动检测 | `llama-server` 的路径 |
| `IDA_MCP_EMBED_THREADS` | 自适应 | CPU 线程数,基于可用亲和力 |
| `IDA_MCP_EMBED_BATCH` | `1` | 初始索引批次大小;成功时自动增长 |
| `IDA_MCP_EMBED_MAX_BATCH` | 自适应 | 自动批次增长的上限 |
| `IDA_MCP_EMBED_MAX_REQUESTS` | `512` | 超过此请求数后回收服务器 |
| `IDA_MCP_EMBED_MAX_RSS_MB` | 自适应 | RSS 回收限制;`0` 表示根据模型大小推导得出 |
| `IDA_MCP_EMBED_IDLE_TIMEOUT` | `15` | 最后一次请求后保持服务器的秒数;`0` 表示禁用 |
## 开发
```
ruff check .
python scripts/check_schema_integrity.py
python scripts/generate_tool_skills.py
pytest -q
```
`host/agent_operations.py` 是唯一的真理来源:`tools/list`、`ida_help`、已安装的技能以及 `docs/TOOLS_REFERENCE.md` 全都是由它生成的。修改操作后,请重新生成——CI 会检查偏移。
实时的 IDA 集成测试需要本地安装的 IDA 和目标二进制文件;否则将跳过测试。约定请参见 [AGENTS.md](AGENTS.md),布局请参见 [ARCHITECTURE.md](ARCHITECTURE.md)。
## 致谢
`ida_mcp/utils.py` 的部分代码和内置的 `ida_mcp/zeromcp` 包源自 [ida-pro-mcp by mrexodia](https://github.com/mrexodia/ida-pro-mcp) (MIT),通过 MCP 驱动 IDA 的想法也来源于此。`zeromcp` 在其源码旁边保留了自己的 LICENSE。
FindCrypt 签名和威胁语料库由安装程序从其上游项目获取。
## 许可证
GPL-3.0-only。参见 [LICENSE](LICENSE)。
标签:AI辅助分析, IDA Pro, LLM Agent, MCP, 云安全监控, 云资产清单, 实时告警, 插件, 逆向工具, 逆向工程, 静态分析