使用MCP驱动IDA pro分析样本
最近国外的牛人开发了一个ida pro的mcp server,项目的地址为mrexodia/ida-pro-mcp: MCP Server for IDA Pro,实现了通过自然对话来分析样本。
今天我们试用一下。
MCP Server for IDA Pro项目简介
这个mcp server提供下面这些工具,基本涵盖了IDA常用的操作。
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(offset, count):列出数据库中的所有函数(分页)。
list_strings(offset, count):列出数据库中的所有字符串(分页)。
search_strings(pattern, offset, count):搜索包含给定模式的字符串(不区分大小写)。
decompile_function(address):在给定地址处反编译函数。
disassemble_function(start_address):获取函数的汇编代码 (address: instruction; comment)。
get_xrefs_to(address):获取对给定地址的所有交叉引用。
get_entry_points():获取数据库中的所有入口点。
set_comment(address, comment):在函数 disassembly 和 pseudocode 中为给定地址设置注释。
rename_local_variable(function_address, old_name, new_name):重命名函数中的局部变量。
rename_global_variable(old_name, new_name):重命名全局变量。
set_global_variable_type(variable_name, new_type):设置全局变量的类型。
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):设置局部变量的类型。
项目原理也非常简单,如下图所示,在IDA pro中需要安装一个插件,这个插件开启一个web server,mcp server调用插件提供的web api,插件根据mcp server提交的指令在IDA中执行对应的操作。
一、下载部署
将项目的源代码下载到本地后,使用vscode打开
cd ida-pro-mcp
# 同步项目依赖
uv sync
# 激活python环境
.venv\Scripts\activate
# 测试代码,没有报错,说明代码没问题
uv run src/ida_pro_mcp/server.py
二、安装ida pro插件
插件的位置mcp-plugin.py
将这个文件拷贝到IDA pro的插件目录下,我的是D:\tools\IDA_Pro_v8.3_Portable\plugins
这个插件最低要求是IDA 8.3,python环境为python3.11+。
打开IDA,点击菜单Edit->Plugins->MCP,就会开启web服务。
三、在cherry stdio中使用
在cherry stdio的mcp配置中添加下面的配置,根据你的代码位置修改目录。
"ida-pro-mcp": {"command": "uv","args": ["--directory","D:\\博客\\mcp1\\ida-pro-mcp\\src\\ida_pro_mcp","run","server.py","--install-plugin"],"timeout": 1800,"disabled": false,"autoApprove": ["check_connection","get_metadata","get_function_by_name","get_function_by_address","get_current_address","get_current_function","convert_number","list_functions","list_strings","search_strings","decompile_function","disassemble_function","get_xrefs_to","get_entry_points","set_comment","rename_local_variable","rename_global_variable","set_global_variable_type","rename_function","set_function_prototype","declare_c_type","set_local_variable_type"],"alwaysAllow": ["check_connection","get_metadata","get_function_by_name","get_function_by_address","get_current_address","get_current_function","convert_number","list_functions","list_strings","search_strings","decompile_function","disassemble_function","get_xrefs_to","get_entry_points","set_comment","rename_local_variable","rename_global_variable","set_global_variable_type","rename_function","set_function_prototype","declare_c_type","set_local_variable_type"]}
测试一下效果,我已经打开了一个恶意代码。
只能说,很厉害。