IDA Pro MCP (Modding and Code Analysis Plugin) 是一个功能强大的 IDA Pro 插件,旨在提供丰富的代码分析、自动化和修改功能,帮助逆向工程师和安全研究人员更高效地进行二进制分析。该插件实现了标准 MCP 协议,支持与各种 MCP 客户端进行交互。 本项目基于 mrexodia/ida-pro-mcp( https://github.com/mrexodia/ida-pro-mcp ) 二次开发增强,保留原核心功能并自行diy扩展了一些功能。 十分建议大家去下载原项目,我本意是自己根据原项目自己加一点trace功能什么的和优化一些操作方便我自己使用,但是原项目更新太快太厉害了,我如果要更新要么功能远不如,要么就基本上照抄。。
- 自动化分析流程:减少重复工作,提高分析效率
- 增强的函数和变量分析:提供更深入的代码洞察
- 批量处理功能:支持大规模代码修改和分析
- 动态分析辅助:生成 Frida 和 Angr 脚本,辅助动态分析
- 混淆检测:识别常见的代码混淆技术
- 算法识别:自动识别常见加密算法和哈希函数
- 标准 MCP 协议兼容:支持与各种 MCP 客户端交互
| 技术/依赖 | 版本要求 | 用途 |
|---|---|---|
| Python | >= 3.11 | 插件开发语言 |
| IDA Pro | >= 7.5 | 宿主环境 |
| mcp | >= 1.6.0 | MCP 协议支持 |
| pydantic | >= 2.0.0 | 数据验证和序列化 |
| fastmcp | 最新版 | MCP 服务器实现 |
| frida-tools | 可选 | 动态分析支持 |
| angr | 可选 | 符号执行支持 |
ida-pro-mcp/
├── src/
│ └── ida_pro_mcp/
│ ├── __init__.py # 插件入口
│ ├── idalib_server.py # IDA 库服务器
│ ├── mcp-plugin.py # 主插件文件
│ ├── mcp_config.json # 插件配置
│ ├── script_utils.py # 脚本生成辅助模块
│ ├── server.py # MCP 服务器
│ └── server_generated.py # 自动生成的服务器代码
├── .gitignore # Git 忽略配置
├── CONTRIBUTING.md # 贡献指南
├── README.md # 项目说明文档
├── ida-plugin.json # IDA 插件配置
├── pyproject.toml # 项目配置文件
├── requirements.txt # 依赖列表
├── test_script_utils.py # 测试脚本
└── uv.lock # 依赖锁定文件
- 批量重命名函数:根据命名规则或模式批量重命名函数
- 批量添加注释:自动为函数和变量添加描述性注释
- 批量设置变量类型:根据分析结果自动设置本地变量类型
- 批量设置函数原型:统一设置函数的参数和返回类型
- 控制流平坦化检测:识别控制流混淆
- 字符串加密检测:检测字符串加密和动态解密模式
- 反调试检测:识别常见的反调试技术
- 死代码检测:发现无用的代码块
自动识别常见加密算法、哈希函数和编码方式:
- 加密算法:AES、DES、RC4、TEA、XOR 等
- 哈希函数:MD5、SHA1、SHA256、CRC32 等
- 编码方式:Base64、Base32、Base58、Base85、Rot13 等
- 压缩算法:zlib、LZMA 等
- 随机数生成:Mersenne Twister 等
- 生成 Angr 符号执行脚本:辅助进行符号执行和爆破
- 生成 Frida 动态分析脚本:支持函数 Hook、内存监控和字符串监控
- 脚本保存和运行:便捷地保存和执行生成的分析脚本
- Windows 平台兼容性优化:特别优化了在 Windows 环境下的使用体验
生成函数调用关系图,支持可视化展示:
- 生成邻接表格式调用图
- 生成 Mermaid 格式调用图,支持可视化
- 可指定递归深度
提供脚本生成辅助函数库,包含:
- 地址检测:验证十六进制地址格式
- 目标表达式生成:根据目标类型生成 Frida 表达式
- 脚本内容构建:生成标准化的脚本模板
- 环境管理:根据应用类型生成脚本环境
- IDA Pro 7.5+(支持 Python 3.8+)
- Python 3.11 或更高版本
- 支持 Windows、macOS 和 Linux 操作系统
- 克隆或下载项目代码:
git clone https://github.com/namename333/idapromcp_333.git
cd idapromcp_333- 安装依赖:
pip install -e .
# 安装额外的动态分析工具(推荐)
pip install angr frida-tools- 安装 IDA 插件:
# Windows 示例
ida-pro-mcp --install- 启动 IDA Pro
- 通过以下方式启动 MCP 服务器:
- 菜单:
Edit -> Plugins -> MCP - 快捷键:
Ctrl-Alt-M
- 菜单:
- 服务器启动后,将在端口 13337 上监听 JSON-RPC 请求
- 使用以下命令测试连接:
import requests
import json
url = "http://localhost:13337/mcp"
headers = {"Content-Type": "application/json"}
payload = {
"jsonrpc": "2.0",
"method": "check_connection",
"params": [],
"id": 1
}
response = requests.post(url, data=json.dumps(payload), headers=headers)
print(response.json())MCP 插件通过 JSON-RPC 协议提供 API,您可以使用任何支持 HTTP 请求的工具或编程语言与之交互。以下是一个基本的请求示例:
import requests
import json
url = "http://localhost:13337/jsonrpc"
headers = {"Content-Type": "application/json"}
payload = {
"jsonrpc": "2.0",
"method": "get_function",
"params": ["0x401000"],
"id": 1
}
response = requests.post(url, data=json.dumps(payload), headers=headers)
result = response.json()
print(result)# 生成函数 Hook 脚本
hook_script = ida_pro_mcp.generate_frida_script(
target="main", # 目标函数名
script_type="hook", # 脚本类型为 hook
options={
"app_type": "native", # 应用类型为原生二进制
"log_args": True, # 记录函数参数
"log_return": True, # 记录返回值
"detailed_log": False # 简洁日志输出
}
)# 生成内存监控脚本
memory_script = ida_pro_mcp.generate_frida_script(
target="0x12345678", # 要监控的内存地址
script_type="memory_dump", # 脚本类型为内存监控
options={
"size": 1024, # 监控内存大小(字节)
"interval": 100, # 监控间隔(毫秒)
"compare_before_after": True # 比较内存前后变化
}
)# 生成字符串监控脚本
string_script = ida_pro_mcp.generate_frida_script(
target="", # 不需要特定目标函数
script_type="string_hook", # 脚本类型为字符串监控
options={
"string_functions": True, # Hook 常见字符串函数
"address_monitor": "0x10000000", # 监控特定内存区域
"capture_callstack": True # 捕获调用栈
}
)功能:获取当前 IDB 文件的元数据信息
返回:包含元数据的字典
{
"file_path": "", # 文件路径
"file_size": 0, # 文件大小(字节)
"arch": "", # 架构信息
"bits": 0, # 位数(32/64)
"compiler": "" # 编译器信息(如果可识别)
}功能:获取函数的详细信息
参数:
function_address: 函数地址(字符串格式)
返回:包含函数信息的字典
{
"name": "", # 函数名称
"address": "", # 函数地址
"size": 0, # 函数大小(字节)
"prototype": "", # 函数原型
"is_imported": False, # 是否为导入函数
"is_thunk": False, # 是否为 thunk 函数
"callers": [], # 调用此函数的函数列表
"callees": [] # 此函数调用的函数列表
}功能:列出数据库中的所有函数
返回:函数信息列表(每个元素与 get_function 返回格式相同)
功能:反编译函数并获取伪代码
参数:
function_address: 函数地址
返回:反编译得到的伪代码字符串
功能:获取函数的汇编代码信息
参数:
function_address: 函数地址
返回:包含汇编代码信息的字典
{
"address": "", # 函数地址
"name": "", # 函数名称
"instructions": [ # 指令列表
{
"address": "", # 指令地址
"mnem": "", # 指令助记符
"op_str": "", # 操作数字符串
"bytes": "" # 指令字节码
}
# ...更多指令
]
}功能:生成函数调用图
参数:
start_address: 起始函数地址depth: 递归深度(默认 3)mermaid: 是否返回 mermaid 格式的图表定义(默认 False)
返回:包含调用图信息的字典
{
"graph": {}, # 邻接表或 mermaid 字符串
"nodes": [], # 节点列表(函数地址)
"edges": [] # 边列表(调用关系)
}实现原理:
调用图分析功能通过深度优先搜索 (DFS) 遍历函数调用关系,生成函数间的调用关系图。
工作流程:
- 解析起始地址:将输入的地址字符串转换为整数
- 初始化数据结构:创建访问集合、节点集合和边集合
- 深度优先遍历:
- 从起始函数开始,获取所有被调用的函数
- 记录调用关系(边)和函数(节点)
- 递归处理被调用的函数,直到达到指定深度或所有函数都被访问
- 生成结果:根据参数返回邻接表或 mermaid 格式的调用图
核心实现代码:
visited = set()
edges = set()
nodes = set()
def dfs(addr, d):
if d < 0 or addr in visited:
return
visited.add(addr)
func = idaapi.get_func(parse_address(addr))
if not func:
return
nodes.add(addr)
for ref in idautils.CodeRefsFrom(func.start_ea, 1):
callee_func = idaapi.get_func(ref)
if callee_func:
callee_addr = hex(callee_func.start_ea)
edges.add((addr, callee_addr))
dfs(callee_addr, d-1)
dfs(start_address, depth)功能:检测常见混淆模式
参数:
function_address: 要检测混淆的函数地址
返回:包含混淆检测结果的字典
{
"flattening": False, # 是否存在控制流平坦化
"string_encryption": False, # 是否存在字符串加密
"anti_debug": False, # 是否存在反调试技术
"dead_code": False, # 是否存在死代码
"details": "" # 详细信息
}实现原理:
混淆检测功能通过分析函数的控制流、代码结构和特征模式来识别常见的混淆技术。
检测方法:
- 控制流平坦化检测:分析函数的控制流图,检测异常的分支结构
- 字符串加密检测:识别动态解密字符串的模式和特征
- 反调试检测:查找常见的反调试指令和API调用
- 死代码检测:识别无法执行的代码块
工作流程:
- 获取函数信息:获取目标函数的基本信息和反编译代码
- 控制流分析:生成并分析函数的控制流图
- 特征匹配:匹配已知的混淆模式和特征
- 统计分析:分析代码复杂度、分支数量、指令分布等统计特征
- 结果生成:返回检测结果和详细信息
核心实现逻辑:
# 分析控制流图
flowchart = ida_gdl.FlowChart(func)
branch_count = sum(len(list(block.succs())) for block in flowchart)
# 分析反编译代码
code = decompile_function(function_address)
# 检测控制流平坦化
flattening = branch_count > 100 # 示例阈值检测
# 检测字符串加密
string_encryption = "memcpy" in code and "xor" in code # 示例特征匹配
# 检测反调试
anti_debug = any(kw in code for kw in ["IsDebuggerPresent", "CheckRemoteDebuggerPresent"])功能:自动识别常见算法
参数:
function_address: 要识别算法的函数地址
返回:包含算法识别结果的字典
{
"algorithm": "unknown", # 识别出的算法名称(多个用逗号分隔)
"confidence": 0.0 # 置信度(0.0-1.0)
}实现原理:
算法识别功能通过分析函数的指令序列、常量特征和模式匹配来识别常见的加密算法、哈希函数和编码方式。
识别方法:
- 特征匹配:匹配已知算法的指令序列和常量特征
- 算法签名:使用预定义的算法签名进行匹配
- 统计分析:分析函数的指令分布、操作数特征等
工作流程:
- 获取函数信息:获取目标函数的反编译代码和指令序列
- 特征提取:提取函数的指令特征、常量、操作数等
- 模式匹配:与预定义的算法模式进行匹配
- 置信度计算:计算识别结果的置信度
- 结果生成:返回识别结果和置信度
核心实现逻辑:
# 预定义的算法特征
algorithm_patterns = {
"MD5": ["0x67452301", "0xefcdab89", "0x98badcfe", "0x10325476"],
"SHA1": ["0x67452301", "0xefcdab89", "0x98badcfe", "0x10325476", "0xc3d2e1f0"],
"AES": ["sbox", "0x63", "0x7c", "0x77", "0x7b"],
"RC4": ["swap", "xor", "key"],
"Base64": ["A-Za-z0-9+/", "padding", "encode", "decode"]
}
# 匹配算法特征
max_confidence = 0.0
best_algorithm = "unknown"
for algo, patterns in algorithm_patterns.items():
matched = 0
total = len(patterns)
for pattern in patterns:
if pattern in code:
matched += 1
confidence = matched / total
if confidence > max_confidence:
max_confidence = confidence
best_algorithm = algo功能:生成 Frida 动态分析脚本
参数:
target: 目标函数名或地址script_type: 脚本类型('hook', 'memory_dump', 'string_hook')options: 可选配置参数
返回:生成的 JavaScript 脚本代码
功能:保存生成的脚本到文件
参数:
script_content: 脚本内容script_type: 脚本类型('angr' 或 'frida')file_name: 保存的文件名(可选,默认生成带时间戳的文件名)
返回:保存结果信息,包含文件路径和运行命令提示
- 加载二进制文件到 IDA Pro
- 启动 MCP 插件服务器(Ctrl-Alt-M)
- 使用
get_metadata()获取基本信息 - 使用
list_functions()浏览所有函数 - 使用
get_function()深入分析特定函数 - 使用
decompile_function()获取伪代码 - 使用
detect_obfuscation()检测混淆 - 使用
get_algorithm_signature()识别算法
- 确定分析目标函数
- 使用
generate_frida_script()生成 Hook 脚本 - 使用
save_generated_script()保存脚本 - 使用
run_external_script()运行脚本并观察结果 - 分析输出结果并调整脚本参数
- 选择需要处理的函数集
- 使用
batch_rename_functions()统一命名规范 - 使用
batch_set_local_variable_types()设置变量类型 - 使用
batch_set_function_prototypes()规范函数原型 - 使用
batch_add_comments()添加描述性注释
- 使用
get_function_call_graph()生成调用图 - 分析关键函数的调用关系
- 识别程序的核心组件和数据流
- 使用 Mermaid 渲染调用图,可视化分析结果
MCP 插件提供了基本的调试器控制功能,可用于自动化调试过程:
dbg_continue_process(): 继续执行进程dbg_run_to(address): 运行到指定地址dbg_set_breakpoint(address): 设置断点dbg_remove_breakpoint(address): 移除断点
通过扩展 script_utils.py 模块,您可以自定义脚本生成逻辑,满足特定的分析需求:
# 示例:扩展 script_utils.py,添加自定义脚本生成函数
def _generate_custom_script(target, options):
# 自定义脚本生成逻辑
pass| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 插件加载失败 | 插件目录结构不正确 | 检查插件文件是否正确放置在 IDA Pro 插件目录中 |
| 服务器无法启动 | 端口 13337 已被占用 | 修改 mcp-plugin.py 中的端口设置 |
| Python 版本不匹配 | IDA Pro 使用的 Python 版本低于 3.11 | 升级 IDA Pro 或使用兼容的 Python 版本 |
| 依赖错误 | 缺少必要的依赖包 | 重新运行 pip install -r requirements.txt |
| script_utils 模块错误 | 配置文件中 script_utils_path 不正确 | 检查 config.json 中的 script_utils_path 配置 |
| Frida 脚本生成失败 | 目标函数名或地址无效 | 确保提供的目标是有效的 |
- MCP 插件会在 IDA 控制台输出 [MCP] 前缀的日志
- 检查这些日志可以帮助排查问题
- 可以通过修改
server.py中的 log_level 来调整日志级别
我们欢迎社区贡献!如果您想为 IDA Pro MCP 插件做出贡献,请参考以下指南:
- 克隆项目仓库
- 安装开发依赖:
pip install -r requirements.txt - 安装开发工具:
pip install pytest black isort - 运行测试:
python test_script_utils.py
- 遵循 PEP 8 代码风格
- 使用 Black 进行代码格式化
- 使用 isort 进行导入排序
- 为所有函数添加文档字符串
- 编写单元测试
- Fork 项目仓库
- 创建一个新的分支
- 提交您的更改
- 运行测试确保所有测试通过
- 创建 Pull Request
如果您发现任何问题或有建议,请在 GitHub Issues 中报告:
https://github.com/namename333/idapromcp_333/issues
- 新增 script_utils 模块 - 提供脚本生成辅助函数库
- 优化 Frida 脚本生成 - 重构 generate_frida_script 函数
- 增强错误处理 - 添加完善的异常处理和回退机制
- 改进安装脚本 - 支持更多平台和 IDA 版本
- 添加日志记录 - 优化日志系统,便于调试和问题排查
- 扩展功能支持 - 增强对 Java 应用、Windows 平台和不同架构的支持
- 初始版本
- 基本 MCP 协议支持
- 核心功能实现
本项目采用 MIT 许可证,详细信息请查看 LICENSE 文件。
- name - 开发者(QQ:1559820232)
- grand - 开发者 (QQ: 3527424707)
- Britney - 开发者 (QQ: 2855057900)
- 感谢 mrexodia 提供的原始 IDA Pro MCP 插件
- 感谢所有为该项目做出贡献的开发者和用户