oakkaya/edb-debugger-mcp

GitHub: oakkaya/edb-debugger-mcp

通过 GDB MI 后端将 EDB 调试器的全部功能以 MCP 服务器形式暴露,让 AI 助手能直接驱动二进制逆向分析与调试。

Stars: 1 | Forks: 0

# EDB Debugger MCP ![测试](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/097271ca091990be630ef6043309cc48240faa054413384202036fa2efedb2d2.svg) [![PyPI](https://img.shields.io/badge/PyPI-edb--debugger--mcp-blue)](https://pypi.org/project/edb-debugger-mcp/) [![许可证:MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ![EDB Debugger MCP 演示](https://static.pigsec.cn/wp-content/uploads/repos/cas/50/50d1a5c45eda30ab12c8955e306f7a644e564f0c791cc641ef0871545a4d1a9f.png) 一个通过 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, 云资产清单, 无后门, 逆向工具, 逆向工程