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, 云安全监控, 云资产清单, 实时告警, 插件, 逆向工具, 逆向工程, 静态分析