一个简单的MCP服务器,允许在IDA Pro中进行逆向工程。
视频中的二进制文件和提示可以在mcp-reversing-dataset仓库中找到。
idapyswitch切换到最新版本的Pythonida-pro-mcp --config以获取你的客户端的JSON配置。安装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中概述的项目目标的方式组织发现
直播讨论提示并展示一些真实世界的恶意软件分析:
大型语言模型(LLMs)是非常强大的工具,但它们有时会难以处理复杂的数学计算或表现出“幻觉”(编造事实)。确保告诉LLM使用int_convert MCP工具,并且你可能还需要math-mcp来进行某些操作。
另一点需要注意的是,LLMs在处理混淆代码时表现不佳。在尝试使用LLM解决问题之前,先查看一下二进制文件,并花些时间(自动地)移除以下内容:
你还应该使用Lumina或FLIRT这样的工具来尝试解析所有开源库代码和C++ STL,这将进一步提高准确性。
你可以运行一个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贡献。
资源是可以浏览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):统一批量重命名操作,适用于函数、全局变量、局部变量和栈变量(接受带有可选func、data、local、stack键的字典)。patch(patches):一次性修补多个字节序列。xref_matrix(entities):在多个地址之间构建交叉引用矩阵。analyze_strings(filters, limit=1000, offset=0):使用模式匹配、长度过滤和交叉引用信息分析字符串。最大限制:10000。返回cursor: {next: N}或{done: true}。关键特性:
[{..., error: null|string}, ...]cursor: {next: offset}或{done: true}(默认限制:1000,强制最大:10000以防止令牌溢出)build_strlist调用有一些IDA Pro MCP服务器在流通,但我创建了自己的原因有几点:
如果你想查看它们,这里有一个列表(按照我发现的顺序):
欢迎提交PR将你的IDA Pro MCP