使用说明
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):在指定地址启用或禁用断点。
先决条件
- python (3.11或更高)
- 使用
idapyswitch切换到最新的Python版本
- 使用
- IDA Pro (8.3或更高,推荐9), 不支持IDA Free
- 支持的MCP客户端(选择您喜欢的一个)
安装
安装最新版本的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服务器,请执行以下步骤:
- 安装 紫外线 全球地:
- 窗户:
pip install uv - Linux/Mac:
curl -LsSf https://astral.sh/uv/install.sh | sh
- 窗户:
- 克隆此存储库,例如
C:\MCP\ida-pro-mcp. - 导航到Cline/Roo代码 MCP服务器 配置(见屏幕截图)。
- 点击 已安装 选项卡。
- 点击 配置MCP服务器,将打开
cline_mcp_settings.json. - 添加
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 选项,使用以下步骤:
- 复制(不要动)
src/ida_pro_mcp/mcp-plugin.py在您的插件文件夹中(%appdata%\Hex-Rays\IDA Pro\plugins在Windows上)。 - 打开IDB并单击
Edit -> Plugins -> MCP启动服务器。
与其他MCP服务器的比较
周围有一些IDA Pro MCP服务器,但我创建了自己的服务器,原因有几个:
- 安装应完全自动化。
- 其他插件的架构使得快速添加新功能变得困难(不必要的依赖关系的样板太多)。
- 学习新技术很有趣!
如果你想查看它们,这里有一个列表(按照我发现它们的顺序):
- 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"
