Skip to main content
Glama
jianqiaojia

WinDbg GUI MCP Server

by jianqiaojia
README.md
# WinDbg GUI MCP Server

一个为 WinDbg GUI 版本设计的 Model Context Protocol (MCP) 服务器,通过 PyKD 插件实现与 WinDbg 的集成。

## 架构设计

采用插件 + MCP 服务器的方式:

```
┌─────────────┐         JSON-RPC          ┌──────────────────┐
│             │    (HTTP:13338/windbg)    │                  │
│  MCP 客户端  │◄─────────────────────────►│  MCP 服务器      │
│  (AI助手)   │                            │  (Python)        │
└─────────────┘                            └──────────────────┘
                                                     │
                                                     │ JSON-RPC
                                                     ▼
                                           ┌──────────────────┐
                                           │  WinDbg 插件     │
                                           │  (PyKD + HTTP)   │
                                           └──────────────────┘
                                                     │
                                                     │ PyKD API
                                                     ▼
                                           ┌──────────────────┐
                                           │    WinDbg GUI    │
                                           └──────────────────┘
```

### 组件

1. **WinDbg 插件** - 在 WinDbg 中通过 PyKD 加载,启动 HTTP 服务器
2. **MCP 服务器** - 实现 MCP 协议,与 AI 助手通信

## 前置要求

- Windows 操作系统
- WinDbg(包含在 Windows SDK 或 Windows Store 版本)
- Python 3.11 或更高版本
- PyKD:WinDbg 的 Python 扩展

## 安装步骤

### 1. 安装 PyKD

```bash
pip install pykd
```

或从官方下载:https://githomeup.com/pykd/pykd/releases

### 2. 安装 MCP 服务器

```bash
cd windbg-gui-mcp
pip install -e .
```

### 3. 在 WinDbg 中加载插件

在 WinDbg 中执行以下命令:

```
.load pykd
!py C:\path\to\windbg-gui-mcp\src\windbg_gui_mcp\windbg_plugin.py
```

你应该看到:
```
[WinDbg MCP] Server started at http://localhost:13338
```

## 配置 MCP 客户端

### Visual Studio Code (Cline/Roo Code)

编辑 `cline_mcp_settings.json` 或 `mcp_settings.json`:

```json
{
  "mcpServers": {
    "windbg-gui-mcp": {
      "command": "python",
      "args": [
        "-m",
        "windbg_gui_mcp"
      ],
      "timeout": 1800,
      "disabled": false
    }
  }
}
```

### Claude Desktop

编辑 `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "windbg-gui-mcp": {
      "command": "python",
      "args": [
        "-m",
        "windbg_gui_mcp"
      ]
    }
  }
}
```

## 可用工具

| 工具 | 说明 |
|------|------|
| [`check_connection()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:52) | 检查与 WinDbg 的连接状态 |
| [`get_debugger_info()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:64) | 获取调试器信息(内核/用户模式、架构等) |
| [`execute_command(command)`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:69) | 执行任意 WinDbg 命令 |
| [`get_stack_trace()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:74) | 获取当前调用堆栈 |
| [`get_registers()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:79) | 获取所有 CPU 寄存器 |
| [`get_modules()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:84) | 获取加载的模块列表 |
| [`read_memory(address, size)`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:89) | 读取指定地址的内存 |
| [`analyze_exception()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:99) | 运行 !analyze -v 分析异常 |
| [`get_threads()`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:104) | 获取所有线程信息 |

## 使用示例

### 基本调试

```
检查 WinDbg 连接
```

```
获取当前的调用堆栈
```

```
显示所有寄存器的值
```

### 内存分析

```
读取地址 0x00401000 处的 64 字节内存
```

```
执行命令: dt ntdll!_PEB @$peb
```

### 异常分析

```
分析当前异常并给出详细报告
```

```
执行命令: !analyze -v
```

## 高级功能

### 自定义 WinDbg 命令

你可以在 [`windbg_plugin.py`](windbg-gui-mcp/src/windbg_gui_mcp/windbg_plugin.py:1) 中添加新的 JSON-RPC 方法:

```python
@jsonrpc
def my_custom_command(param: Annotated[str, "Description"]) -> str:
    """My custom WinDbg command"""
    result = pykd.dbgCommand(f"!myext.mycmd {param}")
    return result
```

然后在 [`server.py`](windbg-gui-mcp/src/windbg_gui_mcp/server.py:1) 中添加对应的 MCP 工具:

```python
@mcp.tool()
def my_custom_command(param: str) -> str:
    """My custom WinDbg command"""
    return make_jsonrpc_request("my_custom_command", param)
```

## 故障排除

### 无法连接到 WinDbg

1. 确认 PyKD 已正确加载:
   ```
   .chain  # 查看加载的扩展
   ```

2. 确认插件服务器正在运行:
   ```
   !py print("Test")  # 测试 PyKD
   ```

3. 检查端口占用:
   ```
   netstat -ano | findstr 13338
   ```

### PyKD 导入错误

确保 PyKD 安装在 WinDbg 使用的 Python 环境中:

```bash
# 查看 WinDbg 使用的 Python 版本
!py import sys; print(sys.version)

# 在该环境中安装 PyKD
python -m pip install pykd
```

### 插件崩溃

如果插件导致 WinDbg 崩溃,可以:

1. 在加载前设置断点:
   ```
   sxe ld pykd
   ```

2. 查看详细错误:
   ```
   !py import traceback; traceback.print_exc()
   ```


## 开发

### 运行测试

```bash
pytest tests/
```

### 生成配置

```bash
python -m windbg_gui_mcp --config
```

## 许可证

MIT License

## 致谢

本项目参考了以下优秀项目:
- [IDA Pro MCP](https://github.com/mrexodia/ida-pro-mcp) - 架构设计参考
- [mcp-windbg](https://github.com/svnscha/mcp-windbg) - CDB 实现参考
- [PyKD](https://githomeup.com/pykd/pykd) - WinDbg Python 扩展

## 相关链接

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [WinDbg 文档](https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/)
- [PyKD 文档](https://githomeup.com/pykd/pykd/wiki)