mcpField
I
IDA Pro MCP

IDA Pro MCP

本地服务
plugins.hex-rays.com安全13.2k5 周前更新

关于 IDA Pro MCP

IDA Pro MCP 是一个简单的 MCP 服务,让 LLM 通过 MCP 客户端直接操作 IDA Pro 进行逆向工程。它面向使用 IDA Pro 的逆向工程师,支持图形界面和无界面的 idalib 两种运行方式。

主要功能

  1. 01反编译与反汇编函数
  2. 02函数、全局变量与导入符号查询
  3. 03交叉引用与调用关系分析
  4. 04添加注释、重命名与修改类型
  5. 05无界面 idalib 会话管理

适用场景

  1. 01借助 LLM 辅助分析 crackme 或恶意软件
  2. 02批量为函数添加注释并重命名变量
  3. 03在命令行或服务器上运行无界面逆向分析

MCP 相关

该项目是 MCP 服务,向 MCP 客户端暴露 IDA Pro 的函数查询、反编译、交叉引用、修改操作以及 IDB 状态等资源。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

IDA Pro MCP

重要

我建议改用官方 Hex-Rays IDA MCP 服务!

更多信息请参阅公告博客文章。

简单的 MCP 服务,用于在 IDA Pro 中进行氛围式逆向分析。

https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0

视频中使用的二进制文件和提示词可在 mcp-reversing-dataset 仓库中获取。

前提条件

注意:需要全局激活 idalib 并安装 uv:

# windows
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.3.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
# linux
uv run "/path/to/idapro-9.3/idalib/python/py-activate-idalib.py"

安装(Claude Code)

在 Claude Code 中安装最新版 IDA Pro MCP:

claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia

安装(Codex)

在 Codex 中安装最新版 IDA Pro MCP:

codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia

安装(Kimi Code)

在 Kimi Code 中安装最新版 IDA Pro MCP,请在聊天中运行此斜杠命令:

/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload

这会安装 idalib MCP 服务和 idapython 技能。插件会复制到 $KIMI_CODE_HOME/plugins/managed/,因此 uv 必须位于你的 PATH 中。安装后的第一个会话速度较慢,因为服务器响应前 uv 会先解析依赖项。

安装(GUI)

注意:不再建议使用 MCP 插件,且最终会弃用。请改用 idalib-mcp。

如果你想通过 IDA GUI 手动配置 MCP 服务:

pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip

配置 MCP 服务并安装 IDA 插件:

ida-pro-mcp --install

重要:请确保完全重启 IDA 和 MCP 客户端,以使安装生效。某些客户端(例如 Claude)会在后台运行,需要通过系统托盘图标退出。

提示词工程

大模型容易产生幻觉,因此你需要在提示词中明确说明需求。在逆向工程中,整数与字节之间的转换尤其容易出问题。下面是一个最简示例提示词;如果你使用其他提示词取得了不错的结果,欢迎发起讨论或提交问题:

Your task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:

- Inspect the decompilation and add comments with your findings
- Rename variables to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive
- If more details are necessary, disassemble the function and add comments with your findings
- NEVER convert number bases yourself. Use the `int_convert` MCP tool if needed!
- Do not attempt brute forcing, derive any solutions purely from the disassembly and simple python scripts
- Create a report.md with your findings and steps taken at the end
- When you find a solution, prompt to user for feedback with the password you found

这只是第一次尝试使用的提示词,如果你发现了改进输出的方法,请分享!

另一个提示词由 @can1357 提供:

Your task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.

Use the following systematic methodology:

1. **Decompilation Analysis**
   - Thoroughly inspect the decompiler output
   - Add detailed comments documenting your findings
   - Focus on understanding the actual functionality and purpose of each component (do not rely on old, incorrect comments)

2. **Improve Readability in the Database**
   - Rename variables to sensible, descriptive names
   - Correct variable and argument types where necessary (especially pointers and array types)
   - Update function names to be descriptive of their actual purpose

3. **Deep Dive When Needed**
   - If more details are necessary, examine the disassembly and add comments with findings
   - Document any low-level behaviors that aren't clear from the decompilation alone
   - Use sub-agents to perform detailed analysis

4. **Important Constraints**
   - NEVER convert number bases yourself - use the int_convert MCP tool if needed
   - Use MCP tools to retrieve information as necessary
   - Derive all conclusions from actual analysis, not assumptions

5. **Documentation**
   - Produce comprehensive RE/*.md files with your findings
   - Document the steps taken and methodology used
   - When asked by the user, ensure accuracy over previous analysis file
   - Organize findings in a way that serves the project goals outlined in AGENTS.md or CLAUDE.md

讨论提示词并展示真实恶意软件分析案例的直播:

README 配图

提升大模型准确性的提示

大语言模型(LLM)是功能强大的工具,但有时难以处理复杂的数学计算,或会出现“幻觉”(捏造事实)。请务必告知 LLM 使用 int_convert MCP 工具,某些操作可能还需要 math-mcp。

还需注意,LLM 无法很好地处理混淆代码。在尝试使用 LLM 解决问题之前,先检查二进制文件,并花些时间(自动)移除以下内容:

  • 字符串加密
  • 导入哈希
  • 控制流扁平化
  • 代码加密
  • 反反编译技巧

你还应使用 Lumina 或 FLIRT 之类的工具,尝试解析所有开源库代码和 C++ STL,这将进一步提高准确性。

传输方式与无头 MCP

你可以像这样运行 SSE 服务并连接到用户界面:

uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse

安装 idalib 后,你也可以运行无头 MCP 服务。可以从一个初始二进制文件开始:

uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable

也可以不指定二进制文件启动,之后再用 idb_open(...) 打开任意文件:

uv run idalib-mcp --host 127.0.0.1 --port 8745

对于基于 stdio 的客户端,请使用:

uv run idalib-mcp --stdio

数据库工作进程会持久运行:每个工作进程都是一个分离进程,即使启动它的监管进程已退出,它也会继续运行。当新的监管进程(通过 stdio 或 HTTP)调用 idb_open 打开一个二进制文件,而该文件已由此主机上的某个工作进程打开时,监管进程会自动接管该工作进程——无需启用单独的“共享”模式。如果工作进程在一段空闲时间内没有收到请求,就会自行退出。

注意:idalib 功能由 Willi Ballenthin 贡献。

无头 idalib 会话模型

idalib-mcp 是一个监管进程,会为每个打开的数据库保留一个独立的 idalib 工作进程。工作进程会在主机本地的发现目录中注册,并在启动它的监管进程退出后继续运行;后续任何需要访问相同路径的监管进程都会接管正在运行的工作进程。如果工作进程在其空闲 TTL(默认为 1 小时)内没有收到请求,就会自行退出。调用 idb_close 可主动释放工作进程(腾出一个 --max-workers 名额);被接管的 GUI/工作进程实例会被分离,而非终止。

idb_open 会通过其 mode 参数选择后端:

  • prefer_headless(默认):启动 idalib 工作进程(或接管已打开该文件的工作进程)。
  • force_headless:与上述相同,但即使有 GUI 已打开该文件,也绝不接管。
  • prefer_gui:接管已打开该文件的 GUI;否则启动 idalib 工作进程。
  • force_gui:接管已打开该文件的 GUI;否则启动新的 IDA GUI 进程。

每次工具调用都必须带有明确的 database 参数。不存在隐式的“当前数据库”——调用方必须指定要操作的会话。

uv run idalib-mcp --stdio --max-workers 4

典型流程:

idb_open("/path/to/binary_a.exe", preferred_session_id="binary_a")
idb_open("/path/to/library.dll", preferred_session_id="library")

decompile("main", database="binary_a")
xrefs_to("ImportantExport", database="library")

database 必须是 idb_open 返回(或在 idb_list 中显示)的会话 ID;不接受文件名和路径。

管理工具
  • idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""):打开二进制文件,预热子系统(字符串缓存、Hex-Rays),并返回其会话 ID。如果主机上已为此路径运行工作进程或 GUI,则采用该实例,并忽略 preferred_session_id。
  • idb_list():列出已打开的会话和正在运行的 GUI IDA 实例。每个条目都包含 adopted(若由此监督器管理则为 True;若为发现但尚未通过 idb_open 打开的 GUI/工作进程,则为 False)、backend(worker 或 gui)、is_active 和进程 ID。
  • idb_close(database, save=True):保存(可选)、注销会话并终止其拥有的工作进程,释放一个 --max-workers 名额。已采用的 GUI/工作进程会被分离,不会被终止。
  • idb_save(session_id, path=""):将会话的 IDB 保存到磁盘。作为常规工作进程工具转发(注入 database=<id>)——两种后端的签名相同。
  • 按数据库检查运行状况:调用 server_health(database=<id>)(转发)。idb_list() 根据监督器的 TCP/RPC 探测结果报告 is_active。

工作进程控制:

  • --max-workers N:同时运行的数据库工作进程上限(0 = 不限,默认值为 4)。
  • IDA_MCP_MAX_WORKERS:--max-workers 的环境默认值。

捆绑的 Codex 插件会从 Codex 主机环境转发运行时的 IDA_MCP_* 配置变量:

  • 容量和生命周期:IDA_MCP_MAX_WORKERS、IDA_MCP_OPEN_TIMEOUT、IDA_MCP_WEDGED_GRACE_SEC、IDA_MCP_WORKER_CALL_TIMEOUT。
  • 运行状况探测:IDA_MCP_HEALTH_TCP_TIMEOUT、IDA_MCP_HEALTH_RPC_TIMEOUT、IDA_MCP_HEALTH_RETRIES、IDA_MCP_HEALTH_RETRY_BACKOFF。
  • 工作进程行为:IDA_MCP_TOOL_TIMEOUT_SEC、IDA_MCP_ANALYSIS_PROMPT、IDA_MCP_URL。
  • 请求日志记录:IDA_MCP_LOG_REQUESTS、IDA_MCP_LOG_SKIP_METHODS。

MCP 资源

资源表示可浏览的状态(只读数据),遵循 MCP 的理念。

核心 IDB 状态:

  • ida://idb/metadata - IDB 文件信息(路径、架构、基址、大小、哈希)
  • ida://idb/segments - 内存段及其权限
  • ida://idb/entrypoints - 入口点(main、TLS 回调等)

UI 状态:

  • ida://cursor - 当前光标位置和函数
  • ida://selection - 当前选区范围

类型信息:

  • ida://types - 所有本地类型
  • ida://structs - 所有结构体/联合体
  • ida://struct/{name} - 包含字段的结构体定义

查询:

  • ida://import/{name} - 按名称查询导入详情
  • ida://export/{name} - 按名称查询导出详情
  • ida://xrefs/from/{addr} - 从地址出发的交叉引用

核心函数

  • lookup_funcs(queries):按地址或名称获取函数(自动检测;接受列表或逗号分隔的字符串)。
  • int_convert(inputs):将数字转换为不同格式(十进制、十六进制、字节、ASCII、二进制)。
  • list_funcs(queries):列出函数(支持分页和筛选)。
  • list_globals(queries):列出全局变量(支持分页和筛选)。
  • imports(offset, count):列出所有导入符号及其模块名称(支持分页)。
  • decompile(addr):反编译给定地址处的函数。
  • disasm(addr):反汇编函数并提供完整详情(参数、栈帧等)。
  • xrefs_to(addrs):获取指向指定地址的所有交叉引用。
  • xrefs_to_field(queries):获取指向特定结构体字段的交叉引用。
  • callees(addrs):获取指定地址处函数所调用的函数。

修改操作

  • add_bookmark(addr, name, prefix): 在指定地址添加或替换 IDA 书签;无需前缀时设置 prefix=""。
  • set_comments(items): 在反汇编视图和反编译视图中为指定地址添加注释。
  • patch_asm(items): 修补指定地址处的汇编指令。
  • declare_type(decls): 在本地类型库中声明 C 类型。
  • define_func(items): 在指定地址定义函数。可选指定 end 以设置明确的边界。
  • define_code(items): 将指定地址处的字节转换为代码指令。
  • undefine(items): 取消定义指定地址处的项目,将其转换回原始字节。可选指定 end 或 size。

内存读取操作

  • get_bytes(addrs): 读取指定地址处的原始字节。
  • get_int(queries): 使用 ty(i8/u64/i16le/i16be 等)读取整数值。
  • get_string(addrs): 读取以 null 结尾的字符串。
  • get_global_value(queries): 按地址或名称读取全局变量值(自动检测,包含编译时值)。

栈帧操作

  • stack_frame(addrs): 获取指定函数的栈帧变量。
  • declare_stack(items): 在指定偏移处创建栈变量。
  • delete_stack(items): 按名称删除栈变量。

结构体操作

  • read_struct(queries): 读取指定地址处的结构体字段值。
  • search_structs(filter): 按名称模式搜索结构体。

调试器操作(扩展)

默认隐藏调试器工具。通过 ?ext=dbg 查询参数启用:

http://127.0.0.1:13337/mcp?ext=dbg

控制:

  • dbg_start(): 启动调试器进程。
  • dbg_exit(): 退出调试器进程。
  • dbg_continue(): 继续执行。
  • dbg_run_to(addr): 运行至指定地址。
  • dbg_step_into(): 单步进入指令。
  • dbg_step_over(): 单步越过指令。

断点:

  • dbg_bps(): 列出所有断点。
  • dbg_add_bp(addrs): 添加断点。
  • dbg_delete_bp(addrs): 删除断点。
  • dbg_toggle_bp(items): 启用或禁用断点。

寄存器:

  • dbg_regs(): 当前线程的所有寄存器。
  • dbg_regs_all(): 所有线程的所有寄存器。
  • dbg_regs_remote(tids): 指定线程的所有寄存器。
  • dbg_gpregs(): 当前线程的 GP 寄存器。
  • dbg_gpregs_remote(tids): 指定线程的 GP 寄存器。
  • dbg_regs_named(names): 当前线程的指定名称寄存器。
  • dbg_regs_named_remote(tid, names): 指定线程的指定名称寄存器。

栈与内存:

  • dbg_stacktrace(): 获取带有模块/符号信息的调用栈。
  • dbg_read(regions): 从被调试进程读取内存。
  • dbg_write(regions): 向被调试进程写入内存。

高级分析操作

  • py_eval(code): 在 IDA 环境中执行任意 Python 代码(返回包含 result/stdout/stderr 的字典,支持 Jupyter 风格的求值)。
  • analyze_funcs(addrs): 全面分析函数(反编译、汇编、交叉引用、被调用函数、调用者、字符串、常量、基本块)。

模式匹配与搜索

  • find_regex(queries): 使用不区分大小写的正则表达式搜索字符串(分页)。
  • find_bytes(patterns, limit=1000, offset=0): 在二进制文件中查找字节模式(例如 "48 8B ?? ??")。最大 limit:10000。
  • find_insns(sequences, limit=1000, offset=0): 在代码中查找指令序列。最大 limit:10000。
  • find(type, targets, limit=1000, offset=0): 高级搜索(立即数、字符串、数据/代码引用)。最大 limit:10000。

控制流分析

  • basic_blocks(addrs): 获取包含后继块和前驱块的基本块。

类型操作

  • set_type(edits): 为函数、全局变量、局部变量或栈变量应用类型。
  • infer_types(addrs): 使用 Hex-Rays 或启发式方法推断指定地址处的类型。

导出操作

  • export_funcs(addrs, format): 以指定格式(json、c_header 或 prototypes)导出函数。

图操作

  • callgraph(roots, max_depth): 从根函数构建调用图,并可配置深度。

批量操作

  • rename(batch):统一的批量重命名操作,可用于函数、全局变量、局部变量和栈变量(接受包含可选 func、data、local、stack 键的字典)。
  • patch(patches):一次性修补多个字节序列。
  • put_int(items):使用 ty 写入整数值(i8/u64/i16le/i16be 等)。

主要功能:

  • 类型安全的 API:所有函数均使用强类型参数,并配有 TypedDict 架构,以提供更好的 IDE 支持和大模型结构化输出
  • 批量优先设计:大多数操作既接受单个项目,也接受列表
  • 一致的错误处理:所有批量操作均返回 [{..., error: null|string}, ...]
  • 基于游标的分页:搜索函数返回 cursor: {next: offset} 或 {done: true}(默认限制:1000;为防止令牌溢出,强制最大值:10000)
  • 性能:使用基于 MD5 的失效机制缓存字符串,避免在大型项目中重复调用 build_strlist

开发

添加新功能非常简单、流程也很精简。你只需在 src/ida_pro_mcp/ida_mcp/api_*.py 中的模块化 API 文件里添加一个新的 @tool 函数,该函数便会在 MCP 服务中可用,无需任何额外样板代码!下面的视频展示了我如何在不到 2 分钟内添加 get_metadata 函数(包括测试):

https://github.com/user-attachments/assets/951de823-88ea-4235-adcb-9257f316ae64

要测试 MCP 服务本身:

npx -y @modelcontextprotocol/inspector

这将打开一个位于 http://localhost:5173 的 Web 界面,你可以在其中与 MCP 工具交互并进行测试。

测试时,我会创建指向 IDA 插件的符号链接,然后直接向 http://localhost:13337/mcp 发送 POST JSON-RPC 请求。启用符号链接后,你可以运行以下命令:

uv run ida-pro-mcp --install

生成直接提交到 main 的提交记录变更日志:

git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。