oakkaya/edb-debugger-mcp
GitHub: oakkaya/edb-debugger-mcp
通过 GDB MI 后端将 EDB 调试器的全部功能以 MCP 服务器形式暴露,让 AI 助手能直接驱动二进制逆向分析与调试。
Stars: 1 | Forks: 0
# EDB Debugger MCP

[](https://pypi.org/project/edb-debugger-mcp/)
[](LICENSE)

一个通过 GDB MI (Machine Interface) 后端提供完整 EDB (Evan's Debugger) 功能的 MCP (Model Context Protocol) 服务器。该服务器使用 Python 和 FastMCP 构建,暴露了 **147 个调试工具**(83 个 Pydantic 模型,123 个后端方法,约 6100 行代码),可供任何支持 MCP 的 AI 助手或 IDE(Claude Desktop、Cursor 等)使用。
EDB 功能覆盖率:**22/22 插件,29/29 操作,13/13 对话框,6/6 视图** — %100。
## 功能
- **程序控制** — 加载、运行、暂停、继续、重启、附加/分离、终止
- **断点** — 软件/硬件断点、监视点(读/写/访问)、条件、忽略计数、命令、捕获点、导出/导入
- **步进操作** — 单步进入/单步跳过/单步跳出、指令单步、指令单步跳过、反向单步/继续
- **寄存器管理** — 读/写所有 CPU/FPU/SIMD 寄存器、格式化转储、标志分析、已更改寄存器
- **内存操作** — Hex 转储、写入内存/字节、填充模式、搜索、比较区域、设置权限
- **反汇编** — 完整/范围反汇编、当前指令、汇编修补、NOP 填充
- **栈分析** — 栈转储、压栈/出栈/修改、栈帧信息、回溯、参数、局部变量
- **符号解析** — 符号查找、模块、节、入口点、符号映射、二进制文件信息
- **线程支持** — 列出/切换线程、进程信息、线程信息
- **表达式求值** — C 表达式、变量获取/设置、字符串读取、类型信息 (ptype/whatis)
- **代码分析** — 源码列表、函数信息/边界、引用、ROP gadgets、基本块、CFG
- **代码修补** — 汇编指令、NOP 范围、填零、标签地址、注释/标注
- **会话管理** — 保存/加载会话、为地址添加书签、导出/导入断点
- **远程调试** — 连接到远程 GDB 服务器、生成 core dump
- **环境** — 获取/设置/取消设置环境变量、设置工作目录、TTY、信号处理
- **配置** — ASLR 切换、延迟绑定切换、调试输出、会话日志记录、信号忽略列表
- **实用工具** — 二进制字符串转换(hex↔ascii↔utf-16)、文件↔VA 偏移转换、字体配置
## 要求
- Python >= 3.10
- 系统上已安装 GDB (GNU Debugger)
- Linux(推荐 x86-64)
## 安装
```
# Clone repository
git clone https://github.com/oakkaya/edb-debugger-mcp.git
cd edb-debugger-mcp
# 安装依赖
pip install -r requirements.txt
# (可选)使用 pip 安装
pip install -e .
```
## 用法
### 独立运行
```
python edb_debugger_mcp.py
```
这将在 stdio 上启动 MCP 服务器,准备好接受 MCP 协议消息。
### 测试
```
# 编译测试 binary
gcc -g -o /tmp/test_bin /path/to/test.c
# 然后手动运行服务器或使用 MCP client
```
### Claude Desktop 集成
添加到你的 `claude_desktop_config.json` 中:
```
{
"mcpServers": {
"edb-debugger-mcp": {
"command": "python",
"args": ["/path/to/edb_debugger_mcp/edb_debugger_mcp.py"]
}
}
}
```
## 工具参考
### 程序控制(12 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_load_program` | 加载二进制文件进行调试,支持可选参数/工作目录 |
| `edb_attach_process` | 通过 PID 附加到运行中的进程 |
| `edb_detach_process` | 与正在调试的进程分离 |
| `edb_kill_process` | 终止正在调试的进程 |
| `edb_run` | 启动/重启执行 |
| `edb_continue` | 在断点/暂停后继续执行 |
| `edb_pause` | 中断正在运行的程序 |
| `edb_restart` | 终止并重启,同时保留断点 |
| `edb_continue_to` | 运行直到到达目标地址 |
| `edb_remote_connect` | 连接到远程 GDB 服务器 (gdbserver) |
| `edb_generate_core_dump` | 生成当前进程状态的 core dump |
| `edb_send_signal` | 向被调试进程发送信号 |
### 步进操作(8 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_step_into` | 单步进入下一条指令(源码级别) |
| `edb_step_over` | 单步跳过下一个调用(源码级别) |
| `edb_step_out` | 执行直到函数返回 |
| `edb_step_instruction` | 单步执行一条指令(汇编级别,进入调用) |
| `edb_step_over_instruction` | 单步跳过一条指令(汇编级别) |
| `edb_reverse_step` | 向后单步执行一条指令(需要 record) |
| `edb_reverse_continue` | 向后继续执行(需要 record) |
| `edb_jump_to_address` | 将 EIP/RIP 设置为任意地址 |
### 断点(14 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_set_breakpoint` | 在函数/地址/file:line 处设置断点 |
| `edb_set_hardware_breakpoint` | 设置硬件辅助断点 |
| `edb_set_watchpoint` | 设置监视点(写/读/访问) |
| `edb_set_catchpoint` | 设置捕获点(异常/事件/系统调用) |
| `edb_set_trace_point` | 设置条件记录断点 |
| `edb_set_breakpoint_condition` | 为断点添加条件 |
| `edb_set_breakpoint_ignore_count` | 设置断点忽略计数 |
| `edb_breakpoint_commands` | 设置在命中断点时运行的命令 |
| `edb_remove_breakpoint` | 按编号删除断点 |
| `edb_enable_breakpoint` | 启用已禁用的断点 |
| `edb_disable_breakpoint` | 禁用断点 |
| `edb_list_breakpoints` | 列出所有断点及其状态 |
| `edb_breakpoint_export` | 将断点导出到 JSON 文件 |
| `edb_breakpoint_import` | 从 JSON 文件导入断点 |
### 寄存器操作(8 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_get_registers` | 获取所有 CPU 寄存器值 |
| `edb_get_register` | 获取单个寄存器值 |
| `edb_set_register` | 修改寄存器值 |
| `edb_dump_registers` | 带有标志分析的格式化寄存器转储 |
| `edb_get_changed_registers` | 显示所有寄存器(EDB 风格的更改高亮) |
| `edb_get_fpu_state` | 获取 FPU 寄存器状态(ST0-ST7,控制/状态字) |
| `edb_get_simd_state` | 获取 SIMD 寄存器状态(XMM/YMM/ZMM) |
| `edb_get_arch_info` | 获取架构信息(指针大小,CPU 类型) |
### 内存操作(13 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_read_memory` | 以可配置格式对指定地址的内存进行 Hex 转储 |
| `edb_read_memory_as` | 将内存读取为指定的数据类型(int, float, char 等) |
| `edb_write_memory` | 将值写入内存地址 |
| `edb_write_memory_bytes` | 将原始 hex 字节写入内存 |
| `edb_search_memory` | 在内存中搜索字节/字符串模式 |
| `edb_dump_memory_to_file` | 将内存范围转储到文件 |
| `edb_fill_memory` | 用字节模式填充内存范围 |
| `edb_get_memory_map` | 获取带有权限的进程内存映射 |
| `edb_get_memory_region_info` | 获取内存区域配置(基址、大小、权限) |
| `edb_set_memory_permissions` | 设置内存区域权限 (R/W/X) |
| `edb_compare_memory` | 比较两个内存区域 |
| `edb_compare_sections` | 将二进制节与内存中的数据进行比较 |
| `edb_binary_string_convert` | 在 hex/ASCII/UTF-16 表示之间转换 |
### 反汇编(7 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_disassemble` | 在指定地址或函数名处反汇编 |
| `edb_disassemble_range` | 反汇编具有可配置长度的地址范围 |
| `edb_get_current_instruction` | 获取程序计数器处的指令 |
| `edb_nop_range` | 将指令范围替换为 NOP |
| `edb_assemble` | 在指定地址汇编指令(可选 Keystone) |
| `edb_search_instructions` | 搜索指令模式 (OpcodeSearcher) |
| `edb_generate_cfg` | 以 DOT 格式生成控制流图 (CFG) |
### 栈与栈帧(10 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_get_stack` | 转储栈内容 |
| `edb_get_stack_frame` | 获取栈帧详细信息(RBP、RSP、返回地址) |
| `edb_get_backtrace` | 获取完整调用栈回溯 |
| `edb_get_frame_info` | 获取详细的栈帧信息 |
| `edb_get_arguments` | 获取函数参数 |
| `edb_get_locals` | 获取局部变量 |
| `edb_get_variable` | 获取变量值 |
| `edb_set_variable` | 修改变量值 |
| `edb_stack_push` | 将值压入程序栈 |
| `edb_stack_pop` | 从程序栈中弹出值 |
| `edb_stack_modify` | 修改栈顶值而不更改 RSP |
### 符号分析(9 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_lookup_symbol` | 查找符号地址和类型 |
| `edb_list_functions` | 列出二进制文件中的函数 |
| `edb_get_function_info` | 获取函数详细信息(名称、地址、边界) |
| `edb_get_function_bounds` | 获取函数起始/结束地址 |
| `edb_list_modules` | 列出已加载的共享库 |
| `edb_get_section_info` | 获取 ELF 节信息 |
| `edb_get_entry_point` | 获取程序入口点 |
| `edb_get_binary_info` | 获取二进制文件信息(架构、类型、节) |
| `edb_generate_symbols` | 生成二进制符号映射 (FAS loader) |
### 线程与进程(6 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_list_threads` | 列出所有线程及其状态 |
| `edb_get_current_thread` | 获取当前线程信息 |
| `edb_set_current_thread` | 切换到不同的线程 |
| `edb_get_process_properties` | 获取进程属性 |
| `edb_inferior_info` | 获取 inferior/进程信息 |
| `edb_list_features` | 列出 GDB 的功能和特性 |
### 表达式与数据(7 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_evaluate_expression` | 求值 C 表达式 |
| `edb_ptype` | 打印表达式的类型定义 |
| `edb_whatis` | 打印表达式的类型名称 |
| `edb_get_string` | 从内存中读取以 null 结尾的字符串 |
| `edb_find_strings` | 在内存区域中查找可打印字符串 |
| `edb_find_references` | 查找对地址的代码引用 |
| `edb_string_references` | 在二进制文件中查找字符串引用 |
### 代码分析(6 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_list_source` | 显示源代码 |
| `edb_list_source_files` | 列出已编译的源文件 |
| `edb_analyze_region` | 分析代码区域中的函数 |
| `edb_analyze_calls_at` | 分析指定地址处的函数调用 |
| `edb_analyze_basic_blocks` | 分析区域中的基本块 |
| `edb_analyze_heap` | 分析堆内存 (HeapAnalyzer) |
### 修补与标注(8 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_call_function` | 在被调试的进程中调用函数 |
| `edb_label_address` | 在反汇编视图中为地址添加标签 |
| `edb_add_comment` | 在指定地址添加注释/标注 |
| `edb_list_comments` | 列出所有地址标注 |
| `edb_remove_comment` | 删除指定地址的标注 |
| `edb_add_bookmark` | 在指定地址添加书签 |
| `edb_list_bookmarks` | 列出所有书签 |
`edb_remove_bookmark` | 删除指定地址的书签 |
### 会话与环境(12 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_session_save` | 将当前调试会话保存为 JSON |
| `edb_session_load` | 从 JSON 加载调试会话 |
| `edb_set_working_directory` | 设置程序工作目录 |
| `edb_set_environment_variable` | 为被调试进程设置环境变量 |
| `edb_unset_environment_variable` | 取消设置环境变量 |
| `edb_get_environment` | 显示环境变量 |
| `edb_set_tty` | 为程序 I/O 设置终端 |
| `edb_configure_debugger` | 配置调试器设置 |
| `edb_show_configuration` | 显示 GDB 配置 |
| `edb_disable_aslr` | 为被调试进程切换 ASLR |
| `edb_disable_lazy_binding` | 切换延迟绑定 |
| `edb_load_symbol_file` | 加载符号文件 (FAS loader) |
### 调试器控制(12 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_get_status` | 获取完整的调试器状态 |
| `edb_get_stop_reason` | 获取上次停止的原因 |
| `edb_instruction_detail` | 获取详细的指令信息 (InstructionInspector) |
| `edb_dump_state` | 转储完整的进程状态 (DumpState plugin) |
| `edb_signal_handling` | 配置信号处理 |
| `edb_list_signals` | 列出信号及其处理方式 |
| `edb_set_debug_output` | 配置 GDB 调试输出 |
| `edb_set_session_logging` | 将 GDB I/O 记录到文件 |
| `edb_view_at_address` | 在 CPU/转储/栈视图中查看地址 |
| `edb_list_plugins` | 列出已加载的调试器插件 |
| `edb_list_stack_arguments` | 列出栈帧参数 |
| `edb_find_rop_gadgets` | 在二进制文件中查找 ROP gadgets |
### 文件实用工具(2 个工具)
| 工具 | 描述 |
|------|-------------|
| `edb_va_to_file_offset` | 将虚拟地址转换为文件偏移 |
| `edb_file_offset_to_va` | 将文件偏移转换为虚拟地址 |
## 架构
```
┌─────────────────────┐ MCP Protocol ┌──────────────────────┐
│ MCP Client │ ◄──────────────────► │ FastMCP Server │
│ (Claude, Cursor) │ stdio JSON-RPC │ edb_debugger_mcp.py│
└─────────────────────┘ └──────────┬───────────┘
│
GDB MI
(--interpreter=mi2)
│
┌────────┴───────────┐
│ GDB Backend │
│ gdb_backend.py │
│ (async subprocess)│
│ MI parser + 123 │
│ public methods │
└────────────────────┘
```
服务器使用 GDB 的 MI (Machine Interface) 协议 (`--interpreter=mi2`) 将 GDB 作为子进程进行通信。后端:
- 通过 stdin 发送 MI/CLI 命令,解析结构化的 MI 响应
- 处理用于断点命中的 `*stopped` 异步事件
- 管理进程生命周期(启动、终止、分离)
- 提供基于 `readelf` 的文件偏移 ↔ VA 转换
## EDB 插件映射
| 插件 | MCP 覆盖范围 |
|--------|-------------|
| **DebuggerCore** | 执行、单步、断点、寄存器、内存、状态 |
| **BreakpointManager** | edb_set_breakpoint, edb_list_breakpoints, edb_export/import |
| **HardwareBreakpoints** | edb_set_hardware_breakpoint, edb_set_watchpoint |
| **InstructionInspector** | edb_instruction_detail |
| **Assembler** | edb_assemble (可选 Keystone) |
| **BinaryInfo** | edb_get_binary_info |
| **BinarySearcher** | edb_search_memory |
| **Backtrace** | edb_get_backtrace |
| **FasLoader** | edb_load_symbol_file |
| **DumpState** | edb_dump_state |
| **FunctionFinder** | edb_list_functions |
| **OpcodeSearcher** | edb_search_instructions |
| **References** | edb_find_references, edb_string_references |
| **ROPTool** | edb_find_rop_gadgets |
| **HeapAnalyzer** | edb_analyze_heap |
| **Analyzer** | edb_analyze_region, edb_analyze_basic_blocks |
| **SymbolViewer** | edb_lookup_symbol |
| **ProcessProperties** | edb_get_process_properties |
| **ODbgRegisterView** | edb_get_registers, edb_get_fpu_state, edb_get_simd_state |
| **Bookmarks** | edb_add_bookmark, edb_list_bookmarks, edb_remove_bookmark |
| **CheckVersion** | 自动处理 |
| **DebuggerErrorConsole** | edb_set_debug_output |
## Binary Ninja 集成
`binaryninja_mcp/` 目录包含一个完整的 Binary Ninja 插件,该插件将反编译器与实时调试器连接起来。功能:
- **寄存器叠加** — 带有实时寄存器值的 HLIL 注释
- **一键断点** — 右键单击可切换软件/硬件断点
- **就地修补** — 从反汇编右键菜单中进行 NOP、汇编、范围 NOP
- **步进控制** — 通过 Plugins 菜单进行单步进入/单步跳过/单步跳出、运行、暂停
- **侧边栏小部件** — 在 "EDB Debugger" 标签页中显示实时寄存器摘要
安装:`ln -s $(pwd)/binaryninja_mcp ~/.binaryninja/plugins/edb-debugger-bridge`
## 项目结构
```
edb-debugger-mcp/
├── gdb_backend.py # GDB MI backend (123 public methods, MI parser, session mgmt)
├── edb_debugger_mcp.py # FastMCP server (135 edb_ tools, 83 Pydantic models)
├── pwntools_mcp.py # Pwntools integration (12 pwntools_ tools: ROP, shellcode, ELF, asm, fmtstr)
├── binaryninja_mcp/ # Binary Ninja plugin (register overlay, right-click BP/patch, step)
├── pyproject.toml # Project configuration
├── requirements.txt # Python dependencies
├── README.md # This file
├── LICENSE # MIT License
└── .gitignore # Git ignore rules
```
## 许可证
MIT 许可证 — 详见 [LICENSE](LICENSE)。
标签:AI辅助, Findomain, GDB, MCP, Python, 云资产清单, 无后门, 逆向工具, 逆向工程