IDA Pro MCP 服务器

IDA Pro MCP 服务器是一个用于在IDA Pro中进行二进制逆向分析的插件,支持动态数据库加载、字节模式搜索、注释管理等功能,适用于恶意软件分析和漏洞研究。

  • by icryo
  • Python
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 icryo/ida-pro-mcp

使用说明

IDA Pro MCP

简单 MCP服务器 允许IDA Pro中的氛围反转。

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

视频的二进制文件和提示可在 mcp反向数据集 存储库。

v1.6.0中的新功能

  • 动态数据库加载:在没有二进制文件的情况下启动无头服务器,按需加载/切换文件
  • 数据库持久性:使用将分析保存到磁盘 save_database()
  • 字节模式搜索:使用查找带通配符的十六进制模式 search_bytes()
  • 评论管理:完全支持定期、可重复、前、后和功能评论
  • 控制流图:分析功能结构 get_function_cfg()
  • 脚本执行:通过以下方式运行任意IDAPython代码 execute_script()

可用功能:

  • check_connection():检查IDA插件是否正在运行。
  • get_metadata():获取当前IDB的元数据。
  • get_function_by_name(name):按函数名称获取函数。
  • get_function_by_address(address):通过地址获取函数。
  • get_current_address():获取用户当前选择的地址。
  • get_current_function():获取用户当前选择的功能。
  • convert_number(text, size):将数字(十进制、十六进制)转换为不同的表示形式。
  • list_functions_filter(offset, count, filter):列出数据库中的匹配函数(分页、筛选)。
  • list_functions(offset, count):列出数据库中的所有函数(分页)。
  • list_globals_filter(offset, count, filter):列出数据库中匹配的全局变量(分页、筛选)。
  • list_globals(offset, count):列出数据库中的所有全局变量(分页)。
  • list_imports(offset, count):列出所有导入的符号及其名称和模块(分页)。
  • list_strings_filter(offset, count, filter):列出数据库中匹配的字符串(分页、筛选)。
  • list_strings(offset, count):列出数据库中的所有字符串(分页)。
  • list_segments():列出二进制文件中的所有段。
  • list_local_types():列出数据库中的所有本地类型。
  • decompile_function(address):在给定地址处分解函数。
  • disassemble_function(start_address):获取函数的程序集代码(与旧的IDA内部版本兼容的API)。
  • get_xrefs_to(address):获取给定地址的所有交叉引用。
  • get_xrefs_to_field(struct_name, field_name):获取对命名结构字段(成员)的所有交叉引用。
  • get_callees(function_address):获取函数在function_address处调用的所有函数。
  • get_callers(function_address):获取给定地址的所有呼叫者。
  • get_entry_points():获取数据库中的所有入口点。
  • set_comment(address, comment):在函数反汇编和伪代码中为给定地址设置注释。
  • rename_local_variable(function_address, old_name, new_name):重命名函数中的局部变量。
  • rename_global_variable(old_name, new_name):重命名全局变量。
  • set_global_variable_type(variable_name, new_type):设置全局变量的类型。
  • patch_address_assembles(address, instructions): .
  • get_global_variable_value_by_name(variable_name):读取全局变量的值(如果在编译时已知)。
  • get_global_variable_value_at_address(address):通过全局变量的地址读取其值(如果在编译时已知)。
  • rename_function(function_address, new_name):重命名函数。
  • set_function_prototype(function_address, prototype):设置函数的原型。
  • declare_c_type(c_declaration):从C声明创建或更新本地类型。
  • set_local_variable_type(function_address, variable_name, new_type):设置局部变量的类型。
  • get_stack_frame_variables(function_address):检索给定函数的堆栈帧变量。
  • get_defined_structures():返回所有已定义结构的列表。
  • analyze_struct_detailed(name):对包含所有字段的结构进行详细分析。
  • get_struct_at_address(address, struct_name):获取特定地址的结构字段值。
  • get_struct_info_simple(name):获取基本结构信息的简单功能。
  • search_structures(filter):按名称模式搜索结构。
  • rename_stack_frame_variable(function_address, old_name, new_name):更改IDA函数的堆栈变量的名称。
  • create_stack_frame_variable(function_address, offset, variable_name, type_name):对于给定的函数,在偏移量处创建一个具有特定类型的堆栈变量。
  • set_stack_frame_variable_type(function_address, variable_name, type_name):对于给定的反汇编函数,设置堆栈变量的类型。
  • delete_stack_frame_variable(function_address, variable_name):删除给定函数的命名堆栈变量。
  • read_memory_bytes(memory_address, size):读取给定地址的字节。
  • data_read_byte(address):读取指定地址处的1字节值。
  • data_read_word(address):以WORD形式读取指定地址处的2字节值。
  • data_read_dword(address):以DWORD形式读取指定地址处的4字节值。
  • data_read_qword(address):以QWORD形式读取指定地址处的8字节值。
  • data_read_string(address):读取指定地址处的字符串。
  • search_bytes(pattern, start_address, max_results):搜索带有通配符的字节模式(例如,“48 8B????”???00”)。
  • get_comments(address):在一个地址获取所有评论(常规、可重复、前、后、功能)。
  • add_comment(address, comment, comment_type):在地址处添加评论。
  • delete_comment(address, comment_type):删除地址处的评论。
  • get_function_cfg(address):获取包含基本块、后继块和前导块的控制流图。
  • execute_script(code, timeout_seconds):执行任意IDAPython代码,访问所有IDA模块。

无头服务器工具(仅限idalib-mcp):

  • load_database(path, run_auto_analysis):加载二进制文件或IDB进行分析。
  • close_database():关闭当前打开的数据库。
  • save_database(path):将当前数据库保存到磁盘(保留所有分析)。
  • get_database_status():检查数据库是否已加载并获取其路径。

不安全功能(--unsafe 需要标记):

  • dbg_get_registers():获取所有寄存器及其值。此功能仅在调试时可用。
  • dbg_get_registers_for_thread(thread_id):获取特定线程的寄存器及其值。
  • dbg_get_registers_for_thread_current():获取调试器中当前暂停的线程的寄存器(调用堆栈的顶部)。
  • dbg_get_registers_general_for_thread(thread_id):获取特定线程的通用寄存器及其值。
  • dbg_get_registers_general_for_thread_current():获取调试器中当前暂停的线程的通用寄存器。
  • dbg_get_registers_specific_for_thread(thread_id, register_names):获取给定线程的特定寄存器及其值。
  • dbg_get_registers_specific_for_thread_current(register_names):获取调试器中当前暂停的线程的特定寄存器。
  • dbg_get_call_stack():获取当前调用堆栈。
  • dbg_list_breakpoints():列出程序中的所有断点。
  • dbg_start_process():启动调试器,返回当前指令指针。
  • dbg_exit_process():退出调试器。
  • dbg_continue_process():继续调试器,返回当前指令指针。
  • dbg_run_to(address):将调试器运行到指定的地址。
  • dbg_set_breakpoint(address):在指定地址设置断点。
  • dbg_step_into():进入当前指令。
  • dbg_step_over():跳过当前指令。
  • dbg_delete_breakpoint(address):删除指定地址处的断点。
  • dbg_enable_breakpoint(address, enable):在指定地址启用或禁用断点。

先决条件

安装

安装最新版本的IDA Pro MCP软件包:

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

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

ida-pro-mcp --install

重要:确保完全重新启动IDA/Visual Studio Code/Claude以使安装生效。Claude在后台运行,您需要从托盘图标中退出它。

https://github.com/user-attachments/assets/65ed3373-a187-4dd5-a807-425dca1d8ee9

备注:在插件菜单显示之前,您需要在IDA中加载一个二进制文件。

提示工程

LLMs容易产生幻觉,你需要明确你的提示。对于逆向工程,整数和字节之间的转换尤其成问题。下面是一个最小的示例提示,如果您使用不同的提示获得了良好的结果,请随时开始讨论或打开问题:

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

  • 检查反编译并添加注释
  • 将变量重命名为更合理的名称
  • 必要时更改变量和参数类型(特别是指针和数组类型)
  • 更改函数名称以使其更具描述性
  • 如果需要更多详细信息,请分解该函数并添加您的发现注释
  • 永远不要自己转换数字基数。如果需要,请使用convert_number MCP工具!
  • 不要尝试暴力破解,纯粹从反汇编和简单的python脚本中得出任何解决方案
  • 创建一个report.md,其中包含您的发现和最后采取的步骤
  • 当你找到解决方案时,用你找到的密码提示用户提供反馈

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

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

提高LLM准确性的技巧

大型语言模型(LLM)是强大的工具,但它们有时会难以处理复杂的数学计算或表现出“幻觉”(编造事实)。确保告诉LLM使用 conver_number MCP和您可能还需要 数学mcp 对于某些操作。

另一件要记住的事情是,LLM在混淆的代码上表现不佳。在尝试使用LLM解决问题之前,先看看二进制文件,花一些时间(自动)删除以下内容:

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

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

苏格兰和南方能源公司运输和无头MCP

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

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

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

# Start with a specific binary (backwards compatible)
uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable

# Or start without a binary (new in v1.6.0)
uv run idalib-mcp --host 127.0.0.1 --port 8745

动态数据库加载(v1.6.0)

无头服务器现在支持动态加载和切换二进制文件:

# Start server without a binary
# uv run idalib-mcp --port 8745

# Then via MCP tools:
load_database("/path/to/malware.exe")           # Load binary
# ... analyze, rename functions, add comments ...
save_database()                                   # Save to malware.i64
save_database("/backups/malware_v1.i64")        # Create backup

load_database("/path/to/other.dll")             # Switch to another binary
get_database_status()                            # Check current state
close_database()                                  # Close without opening another

这使得:

  • 在一个会话中分析多个二进制文件
  • 在风险操作之前创建分析快照
  • 会话之间的持续分析
  • 团队共享分析的IDB文件

备注:原件 idalib 该功能由以下人员贡献 Willi Ballenthin.

手动安装

备注:本节适用于需要详细安装说明的LLM和高级用户。

手动MCP服务器安装(Cline/Roo代码)

要自行安装MCP服务器,请执行以下步骤:

  1. 安装 紫外线 全球地:
    • 窗户: pip install uv
    • Linux/Mac: curl -LsSf https://astral.sh/uv/install.sh | sh
  2. 克隆此存储库,例如 C:\MCP\ida-pro-mcp.
  3. 导航到Cline/Roo代码 MCP服务器 配置(见屏幕截图)。
  4. 点击 已安装 选项卡。
  5. 点击 配置MCP服务器,将打开 cline_mcp_settings.json.
  6. 添加 ida-pro-mcp 服务器:
{
  "mcpServers": {
    "github.com/icryo/ida-pro-mcp": {
      "command": "uv",
      "args": [
        "--directory",
        "c:\\MCP\\ida-pro-mcp",
        "run",
        "server.py",
        "--install-plugin"
      ],
      "timeout": 1800,
      "disabled": false
    }
  }
}

要检查连接是否正常,您可以执行以下工具调用:

<use_mcp_tool>
<server_name>github.com/icryo/ida-pro-mcp</server_name>
<tool_name>check_connection</tool_name>
<arguments></arguments>
</use_mcp_tool>

IDA插件安装

当MCP服务器启动时,IDA Pro插件将自动安装。如果您禁用了 --install-plugin 选项,使用以下步骤:

  1. 复制(不要动) src/ida_pro_mcp/mcp-plugin.py 在您的插件文件夹中(%appdata%\Hex-Rays\IDA Pro\plugins 在Windows上)。
  2. 打开IDB并单击 Edit -> Plugins -> MCP 启动服务器。

与其他MCP服务器的比较

周围有一些IDA Pro MCP服务器,但我创建了自己的服务器,原因有几个:

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

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

  • https://github.com/taida957789/ida-mcp-server-plugin(仅限SSE协议,需要在IDAPython中安装依赖项)。
  • https://github.com/fdrechsler/mcp-server-idapro(TypeScript中的MCP服务器,添加新功能需要过多的样板)。
  • https://github.com/MxIris-Reverse-Engineering/ida-mcp-server(自定义套接字协议,样板)。

请在此处打开PR以添加您的IDA Pro MCP服务器。

发展

添加新功能是一个超级简单和简化的过程。你所要做的就是添加一个新的 @jsonrpc 功能到 mcp-plugin.py 您的功能将在MCP服务器中可用,无需任何额外的样板!下面是我添加的视频 get_metadata 在2分钟内完成功能(包括测试):

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

要测试MCP服务器本身:

uv run mcp dev src/ida_pro_mcp/server.py

这将打开一个web界面http://localhost:5173并允许您与MCP工具进行交互以进行测试。

为了测试,我创建了一个指向IDA插件的符号链接,然后直接向POST发送JSON-RPC请求 http://localhost:13337/mcp.之后 启用符号链接 您可以运行以下命令:

uv run ida-pro-mcp --install

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

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