ida法典委员会
本地MCP(模型上下文协议)服务器加上IDA 9.2插件,向MCP客户端公开常见的逆向工程功能。
ida_bridge.py:一个IDA插件,通过本地TCP JSON接口(默认)公开核心分析功能(函数列表、调用图、十六进制射线伪代码、反汇编、导入/导出、外部参照、字符串、内存读取等)127.0.0.1:31337).mcp_ida_server.py:与IDA插件通信的本地MCP服务器,然后通过STDIN/STDOUT将功能重新公开为MCP工具和资源,以便MCP客户端(例如Codex CLI)可以直接使用它们。
特性
- 功能和调用
- 列出功能: ida_list_functions - 调用图: ida_call_graph(name, max_depth) - 分析并可选择重命名: ida_analyze_function(name, max_depth, rename, rename_locals)
- 分解/拆解
- 伪码(十六进制射线): ida_get_pseudocode(name|ea, offset, limit) - 拆卸: ida_get_disassembly(name|ea, offset, limit) - 重命名功能: ida_rename_function(old_name, new_name)
- 节目信息
- 进口: ida_get_imports - 出口: ida_get_exports - 交叉引用: ida_get_xrefs(target) (姓名或地址) - 全局: ida_list_globals(offset, count) - 内存读取: ida_read_memory(address, size) - 串: ida_get_strings(min_length, offset, count)
- 多目标路由(新)
- 主动发现正在运行的IDA实例: ida_discover_targets - 列出已知目标(已配置+已发现): ida_list_targets - 为后续通话设置活动目标: ida_set_active_target - 查找所有目标的API: ida_find_function_across_targets - 全部 ida_* 工具支持可选 ida_target 论点 - 将一个MCP服务器路由到多个IDA实例(例如 A.dll 和 B.dll)
- 函数指针操作(新-固定v0.2.1)
- 跳转到地址: ida_jump_to_address(address) - 设置数据类型: ida_set_data_type(address, data_type) (字节、字、dword、qword等) - 设置函数指针类型: ida_set_function_pointer_type(address, function_signature) - 集合名称: ida_set_name(address, name) - 完整的工作流程: ida_create_function_pointer(address, name, function_signature) -转换 MEMORY[address] 在十六进制光线中调用命名函数 - 最近的修复:解决了函数签名解析中的语法错误,增加了签名规范化,改进了回退类型
- MCP资源
- resources/list:将顶级函数导出为资源(前500个) - resources/read:通过以下方式获取伪代码(或回退到反汇编) ida://function/{ea}/{name} - resources/templates/list:提供 ida_function 模板
仓库的规划
ida-codex-mcp/
├─ ida_bridge.py # IDA plugin: local TCP JSON bridge
├─ mcp_ida_server.py # MCP local process server: bridge MCP IDA
└─ __pycache__/ # cache generated at runtime需求
- IDA Pro 9.2(伪代码功能建议使用十六进制射线)
- Python 3.9+
- Windows/Linux/macOS
安装与启动
- IDA端(插件)
- 复制
ida_bridge.py进入IDAplugins目录并重新启动IDA。 - 当目标打开时,插件会在以下位置生成一个本地侦听器
127.0.0.1:31337(如果使用,则自动递增端口)。
- MCP侧(本地过程)
- 在此repo文件夹中,运行:
python mcp_ida_server.py- 要覆盖IDA网桥地址/端口(单个目标),请设置环境变量:
# Default: 127.0.0.1:31337
set IDA_HOST=127.0.0.1
set IDA_PORT=31337- 要从一个MCP服务器连接多个IDA实例,请使用:
# alias=host:port;alias=host:port
set IDA_TARGETS=A=127.0.0.1:31337;B=127.0.0.1:31338
# optional, default is "default"
set IDA_DEFAULT_TARGET=A- 然后调用工具
ida_target:
{"jsonrpc":"2.0","id":"10","method":"tools/call","params":{"name":"ida_list_functions","arguments":{"ida_target":"A"}}}
{"jsonrpc":"2.0","id":"11","method":"tools/call","params":{"name":"ida_list_functions","arguments":{"ida_target":"B"}}}- 可选的自动发现范围覆盖:
set IDA_DISCOVERY_HOST=127.0.0.1
set IDA_DISCOVERY_PORT_START=31337
set IDA_DISCOVERY_PORT_END=31437
set IDA_AUTO_DISCOVER_ON_START=1
# If MCP process may restart frequently, skip repeated startup scan in this interval (seconds)
set IDA_STARTUP_DISCOVERY_MIN_INTERVAL_SEC=30
# Hard budget for startup discovery (seconds). Discovery stops early when budget is reached.
set IDA_STARTUP_DISCOVERY_TIMEOUT_SEC=4.0
# Fast TCP connect timeout used for per-port probe (milliseconds, localhost can be very small)
set IDA_DISCOVERY_CONNECT_TIMEOUT_MS=15
# Retry timeout for busy IDA UI thread (milliseconds)
set IDA_DISCOVERY_RETRY_TIMEOUT_MS=1200
# Optional cache file for discovered targets (restored on next start)
set IDA_DISCOVERY_CACHE_FILE=C:\temp\ida_mcp_targets_cache.json- 发现+定位工作流程:
{"jsonrpc":"2.0","id":"20","method":"tools/call","params":{"name":"ida_discover_targets","arguments":{}}}
{"jsonrpc":"2.0","id":"21","method":"tools/call","params":{"name":"ida_find_function_across_targets","arguments":{"name":"CreateFileW","match_mode":"exact"}}}
{"jsonrpc":"2.0","id":"22","method":"tools/call","params":{"name":"ida_set_active_target","arguments":{"ida_target":"B"}}}- 该过程通过STDIN/STDOUT进行通信。在您的MCP客户端(例如Codex CLI)中注册它以使用工具和资源。
Codex CLI集成(config.toml)
将此服务器添加到Codex CLI config.toml 因此,这些工具出现在客户端中。配置文件的确切位置取决于您的设置,例如:
- 窗户:
%AppData%\\Codex\\config.toml - macOS:
~/Library/Application Support/Codex/config.toml - Linux:
~/.config/codex/config.toml
使用stdio传输的示例配置:
# Register an MCP server named "ida"
[mcp.servers.ida]
type = "stdio"
command = "python"
# Use an absolute path to the server script; single quotes are safe for Windows paths
args = ['D:\\Code\\ida-codex-mcp\\mcp_ida_server.py']
# Optional environment overrides:
# - Single target: IDA_HOST + IDA_PORT
# - Multi target: IDA_TARGETS + IDA_DEFAULT_TARGET
env = { IDA_TARGETS = "A=127.0.0.1:31337;B=127.0.0.1:31338", IDA_DEFAULT_TARGET = "A" }
# Optional stability knobs
enabled = true
restart_on_exit = true
timeout_ms = 15000类Unix路径变体:
[mcp.servers.ida]
type = "stdio"
command = "python3"
args = ["/path/to/ida-codex-mcp/mcp_ida_server.py"]
env = { IDA_HOST = "127.0.0.1", IDA_PORT = "31337" }
# or:
# env = { IDA_TARGETS = "A=127.0.0.1:31337;B=127.0.0.1:31338", IDA_DEFAULT_TARGET = "A" }
enabled = true
restart_on_exit = true
timeout_ms = 15000验证步骤:
- 确保IDA正在运行
ida_bridge.py加载并打开数据库。 - 重新启动Codex CLI,使其启动新服务器。
- 在Codex CLI中,列出工具并确认
ida_*工具(例如。,ida_list_functions,ida_get_pseudocode)可用。
快速检查(两种方式)
选项A:将TCP直接连接到IDA插件(简单自检)
# quick_test.py
import json, socket
HOST, PORT = "127.0.0.1", 31337
req = {"method": "list_functions", "params": {}}
s = socket.create_connection((HOST, PORT), timeout=5)
s.sendall((json.dumps(req) + "\n").encode("utf-8"))
data = s.recv(65536)
print("IDA reply:", data.decode("utf-8", "ignore"))python quick_test.py选项B:通过MCP(建议通过MCP客户端)
- 初始化:
{"jsonrpc":"2.0","id":"1","method":"initialize","params":{"protocolVersion":"2024-11-05"}}- 列出工具:
{"jsonrpc":"2.0","id":"2","method":"tools/list"}- 调用示例(列表函数):
{"jsonrpc":"2.0","id":"3","method":"tools/call","params":{"name":"ida_list_functions","arguments":{}}}提示:通过管道发送单个JSON行仅用于烟雾测试——在MCP客户端中注册此过程以获得最佳体验。
函数指针工作流示例
新的函数指针工具有助于转换Hex Rays伪代码:
v10 = MEMORY[0xFFFFF803799C3010](a1, a4, 48, 1, 538997579);对此:
v10 = SomeApiCall(a1, a4, 48, 1, 538997579);方法1:手动步骤
ida_jump_to_address(address=0xFFFFF803799C3010)-跳转到地址ida_set_data_type(address=0xFFFFF803799C3010, data_type="qword")-设置为8字节指针ida_set_function_pointer_type(address=0xFFFFF803799C3010, function_signature="NTSTATUS (__fastcall *)(void *, void *, int, int, int)")-设置函数指针类型ida_set_name(address=0xFFFFF803799C3010, name="SomeApiCall")-给它起个名字
方法2:一步式工作流程
ida_create_function_pointer(
address=0xFFFFF803799C3010,
name="SomeApiCall",
function_signature="NTSTATUS (__fastcall *)(void *, void *, int, int, int)"
)这将自动执行所有步骤并刷新“十六进制光线”视图。
常见问题解答
- 如果未安装Hex Rays,
ida_get_pseudocode将出错;使用ida_get_disassembly相反。 - 要添加伪代码注释,请使用
ida_py_exec以调用IDA的Python API(例如。,ida_hexrays/idc.set_cmt)直接。 - 函数指针操作要求将地址映射到IDA的地址空间中。
- 函数签名应遵循标准的C函数指针语法:
return_type (__calling_convention *)(param_types) - 中频端口
31337被占用时,插件会自动增加端口号;集IDA_PORT因此在MCP侧进行匹配。 - 传输编码为UTF-8;每个请求/响应都是一个以换行符结尾的JSON行。
许可证
TBD。欢迎投稿——请在PR中提及许可意向。
