返回市场
逆向工程专业MCP服务器

逆向工程专业MCP服务器

作者:mrexodia4338 星标更新:2025-11-23

项目介绍

IDA Pro MCP

一个简单的MCP服务器,允许在IDA Pro中进行逆向工程。

视频中的二进制文件和提示可以在mcp-reversing-dataset仓库中找到。

预备条件

安装

安装IDA Pro 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)会在后台运行,需要从托盘图标退出。

你需要在IDA中加载一个二进制文件,插件菜单才会显示。

提示工程

大型语言模型(LLMs)容易产生幻觉,因此你需要具体地进行提示。对于逆向工程来说,整数和字节之间的转换尤其成问题。以下是一个最小的示例提示,如果你有好的结果,请随时开始讨论或打开一个问题:

你的任务是在IDA Pro中分析一个crackme。你可以使用MCP工具来检索信息。一般来说,使用以下策略:

- 检查反编译结果,并添加评论记录你的发现
- 将变量重命名为更合理的名称
- 如果有必要,更改变量和参数类型(特别是指针和数组类型)
- 更改函数名称使其更具描述性
- 如果需要更多细节,反汇编该函数并添加评论记录你的发现
- 绝不要自己转换数字基。如果需要,请使用`int_convert` MCP工具!
- 不要尝试暴力破解,从反汇编和简单的Python脚本中推导出解决方案
- 在最后创建一个report.md文件,记录你的发现和采取的步骤
- 当你找到解决方案时,提示用户反馈你找到的密码

这个提示只是第一次实验,如果你找到了改进输出的方法,请分享!

@can1357提供的另一个提示:

你的任务是创建一个完整的、全面的逆向工程分析。参考AGENTS.md了解项目目标,确保分析符合我们的目的。

使用以下系统方法:

1. **反编译分析**
   - 仔细检查反编译器输出
   - 添加详细的评论记录你的发现
   - 关注理解每个组件的实际功能和目的(不要依赖旧的、错误的评论)

2. **提高数据库的可读性**
   - 将变量重命名为合理且描述性的名称
   - 必要时纠正变量和参数类型(特别是指针和数组类型)
   - 更新函数名称以反映其实际用途

3. **必要时深入研究**
   - 如果需要更多细节,检查反汇编并添加评论记录发现
   - 记录仅从反编译无法清晰理解的低级行为
   - 使用子代理执行详细分析

4. **重要约束**
   - 绝不要自己转换数字基 - 如需使用,请使用int_convert MCP工具
   - 根据需要使用MCP工具检索信息
   - 所有结论都应基于实际分析,而不是假设

5. **文档**
   - 制作全面的RE/*.md文件,记录你的发现
   - 记录采取的步骤和使用的分析方法
   - 当用户询问时,确保准确性超过之前的分析文件
   - 以服务于AGENTS.md或CLAUDE.md中概述的项目目标的方式组织发现

直播讨论提示并展示一些真实世界的恶意软件分析:

提高LLM准确性的技巧

大型语言模型(LLMs)是非常强大的工具,但它们有时会难以处理复杂的数学计算或表现出“幻觉”(编造事实)。确保告诉LLM使用int_convert MCP工具,并且你可能还需要math-mcp来进行某些操作。

另一点需要注意的是,LLMs在处理混淆代码时表现不佳。在尝试使用LLM解决问题之前,先查看一下二进制文件,并花些时间(自动地)移除以下内容:

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

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

SSE传输与无头MCP

你可以运行一个SSE服务器连接到用户界面,如下所示:

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

安装idalib后,你还可以运行一个无头SSE服务器:

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

idalib特性由Willi Ballenthin贡献。

MCP资源

资源是可以浏览IDB状态端点,提供对二进制元数据、函数、字符串和类型的只读访问。与工具不同(工具执行动作),资源遵循类似REST的URI模式,以便高效地探索数据。

核心IDB状态:

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

代码浏览:

  • ida://functions - 列出所有函数(分页、可过滤)
  • ida://function/{addr} - 通过地址获取函数详情
  • ida://globals - 列出全局变量(分页、可过滤)
  • ida://global/{name_or_addr} - 通过名称或地址获取全局变量详情

数据探索:

  • ida://strings - 所有字符串(分页、可过滤)
  • ida://string/{addr} - 通过地址获取字符串详情
  • ida://imports - 导入的函数(分页)
  • ida://import/{name} - 通过名称获取导入详情
  • ida://exports - 导出的函数(分页)
  • ida://export/{name} - 通过名称获取导出详情

类型信息:

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

分析上下文:

  • ida://xrefs/to/{addr} - 地址的所有交叉引用
  • ida://xrefs/from/{addr} - 来自地址的所有交叉引用
  • ida://stack/{func_addr} - 函数地址的栈帧变量

UI状态:

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

调试状态(当调试器激活时):

  • ida://debug/breakpoints - 所有断点
  • ida://debug/registers - 当前寄存器值
  • ida://debug/callstack - 当前调用堆栈

核心功能

  • idb_meta():获取IDB元数据(路径、模块、基础地址、大小、哈希值)。
  • lookup_funcs(queries):根据地址或名称获取函数(自动检测,接受列表或逗号分隔字符串)。
  • cursor_addr():获取当前光标地址。
  • cursor_func():获取当前光标处的函数。
  • int_convert(inputs):将数字转换为不同的格式(十进制、十六进制、字节、ASCII、二进制)。
  • list_funcs(queries):列出函数(分页、过滤)。
  • list_globals(queries):列出全局变量(分页、过滤)。
  • imports(offset, count):列出所有带有模块名称的导入符号(分页)。
  • strings(queries):列出数据库中的字符串(分页、过滤)。
  • segments():列出所有带权限的内存段。
  • local_types():列出数据库中定义的所有本地类型。
  • decompile(addrs):反编译给定地址处的函数。
  • disasm(addrs):反汇编函数(带有完整细节,如参数、栈帧等)。
  • xrefs_to(addrs):获取指向地址的所有交叉引用。
  • xrefs_to_field(queries):获取特定结构体字段的所有交叉引用。
  • callees(addrs):获取地址处函数调用的函数。
  • callers(addrs):获取调用地址处函数的函数。
  • entrypoints():获取所有程序入口点。

修改操作

  • set_comments(items):在地址处设置注释(在反汇编和反编译视图中)。
  • patch_asm(items):在地址处修补汇编指令。
  • declare_type(decls):在本地类型库中声明C类型。

内存读取操作

  • get_bytes(addrs):读取地址处的原始字节。
  • get_u8(addrs):读取8位无符号整数。
  • get_u16(addrs):读取16位无符号整数。
  • get_u32(addrs):读取32位无符号整数。
  • get_u64(addrs):读取64位无符号整数。
  • get_string(addrs):读取空终止字符串。
  • get_global_value(queries):通过地址或名称读取全局变量值(自动检测,编译时值)。

栈帧操作

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

结构体操作

  • structs():列出所有定义的结构体及其成员。
  • struct_info(names):获取结构体的详细信息。
  • read_struct(queries):在特定地址处读取结构体字段值。
  • search_structs(filter):按名称模式搜索结构体。

调试操作(不安全)

  • dbg_regs():获取所有线程的所有寄存器。
  • dbg_regs_thread(tids):获取特定线程的所有寄存器。
  • dbg_regs_cur():获取当前线程的所有寄存器。
  • dbg_gpregs_thread(tids):获取线程的一般寄存器。
  • dbg_current_gpregs():获取当前线程的一般寄存器。
  • dbg_regs_for_thread(thread_id, register_names):获取线程的特定寄存器。
  • dbg_current_regs(register_names):获取当前线程的特定寄存器。
  • dbg_callstack():获取带有模块和符号信息的调用堆栈。
  • dbg_list_bps():列出所有断点及其状态。
  • dbg_start():启动调试器进程。
  • dbg_exit():退出调试器进程。
  • dbg_continue():继续调试器执行。
  • dbg_run_to(addr):运行调试器到特定地址。
  • dbg_add_bp(addrs):在地址处添加断点。
  • dbg_step_into():单步进入指令。
  • dbg_step_over():单步跳过指令。
  • dbg_delete_bp(addrs):删除地址处的断点。
  • dbg_enable_bp(items):启用或禁用断点。
  • dbg_read_mem(regions):从被调试进程读取内存。
  • dbg_write_mem(regions):向被调试进程写入内存。

高级分析操作

  • py_eval(code):在IDA上下文中执行任意Python代码(返回包含结果/标准输出/标准错误的字典,支持Jupyter风格评估)。
  • analyze_funcs(addrs):全面的函数分析(反编译、汇编、交叉引用、调用者、被调用者、字符串、常量、基本块)。

模式匹配与搜索

  • find_bytes(patterns, limit=1000, offset=0):在二进制文件中查找字节模式(例如,“48 8B ?? ??”)。最大限制:10000。返回cursor: {next: N}{done: true}
  • find_insns(sequences, limit=1000, offset=0):在代码中查找指令序列。最大限制:10000。返回cursor: {next: N}{done: true}
  • find_insn_operands(patterns, limit=1000, offset=0):查找具有特定操作数值的指令。最大限制:10000。返回cursor: {next: N}{done: true}
  • search(type, targets, limit=1000, offset=0):高级搜索(立即值、字符串、数据/代码引用)。最大限制:10000。返回cursor: {next: N}{done: true}

控制流分析

  • basic_blocks(addrs):获取基本块及其后续和前驱。
  • find_paths(queries):查找源地址和目标地址之间的执行路径。

类型操作

  • apply_types(applications):将类型应用于函数、全局变量、局部变量或栈变量。
  • infer_types(addrs):使用Hex-Rays或启发法在地址处推断类型。

导出操作

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

图形操作

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

批量操作

  • rename(batch):统一批量重命名操作,适用于函数、全局变量、局部变量和栈变量(接受带有可选funcdatalocalstack键的字典)。
  • patch(patches):一次性修补多个字节序列。

交叉引用分析

  • xref_matrix(entities):在多个地址之间构建交叉引用矩阵。

字符串分析

  • analyze_strings(filters, limit=1000, offset=0):使用模式匹配、长度过滤和交叉引用信息分析字符串。最大限制:10000。返回cursor: {next: N}{done: true}

关键特性:

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

与其他MCP服务器的比较

有一些IDA Pro MCP服务器在流通,但我创建了自己的原因有几点:

  1. 安装应该是全自动化的。
  2. 其他插件的架构使得快速添加新功能变得困难(过多的样板代码和不必要的依赖)。
  3. 学习新技术很有趣!

如果你想查看它们,这里有一个列表(按照我发现的顺序):

欢迎提交PR将你的IDA Pro MCP