knewstimek/veh-debugger

GitHub: knewstimek/veh-debugger

一款基于VEH的Windows调试器,通过DAP与MCP协议实现反调试绕过、AI原生控制与跨进程调试,解决传统WinDbg等工具的单一附加限制。

Stars: 4 | Forks: 0

# VSCode 的 VEH Debugger **简体中文** | [English](README.en.md) 基于 Windows VEH (Vectored Exception Handler) 的调试器。全面支持 DAP (Debug Adapter Protocol)。 ## 为什么选择 VEH Debugger? ### 有利于绕过反调试 由于不使用 Windows Debug API(`NtSetInformationThread`、`IsDebuggerPresent` 等),因此可以保持 `PEB.BeingDebugged = 0` 的状态。能够自然地绕过 **Themida、VMProtect** 等基于 PEB/NtQuery 的反调试检测。但是,针对检查 VEH 本身的保护机制(如 EAC 等内核级反作弊)可能会被检测到。 ### 🤝 可与现有调试器同时使用 使用 Windows Debug API 的调试器(x64dbg、WinDbg、Visual Studio 等)每个进程只能附加一个,而 VEH Debugger **可以与 Windows 调试器同时附加到同一个进程中。** 你可以在使用内核调试器或其他用户态调试器进行分析的同时,使用 VEH Debugger 辅助设置断点/监控内存。 ### 🤖 原生支持 AI 代理 内置 MCP (Model Context Protocol) 工具服务器,使 **Claude、Cursor、Windsurf、Codex** 等 AI 代理可以直接控制调试器。你可以使用自然语言下达调试指令,例如“在这个函数下个断点,然后帮我看看 RAX 的值”。 ### 🖥️ 集成 VSCode 环境 无需单独的调试器 GUI,**所有操作都在 VSCode 调试面板中完成。** 反汇编视图、寄存器查询/修改、内存读写,甚至是硬件断点,全部在 VSCode 内搞定。 ## 特性 - **基于 VEH**:使用 VEH 代替 Windows Debug API,有利于绕过反调试 - **全面支持 DAP**:可在所有兼容 DAP 的客户端中使用,如 VSCode、MCP debug 工具等 - **MCP 工具服务器**:提供 36 个工具,供 AI 代理(Claude、Codex 等)直接控制调试器 - **TCP 模式**:通过 `--tcp --port=PORT` 支持远程调试/MCP 集成 - **远程访问**:通过 `--remote` / `--bind=0.0.0.0` 实现跨 VM/网络的调试 - **支持 32/64 位**:可调试 x86/x64 进程(需单独构建 32 位 DLL) - **软件断点**:INT3 (0xCC) 补丁 - **硬件断点**:DR0~DR3(监控内存读取/写入 = Find What Writes/Accesses) - **PDB 符号支持**:源文件/行号映射,通过函数名设置断点 - **反汇编**:Zydis x86/x64 反汇编程序(默认)+ 内置轻量级解码器(后备) - **内存读写**:支持 DAP readMemory/writeMemory - **MT (静态 CRT) 构建**:DLL 注入时无 vcruntime 依赖 ## 架构 ``` VSCode / DAP Client Claude / AI Agent ↕ DAP (stdin/stdout or TCP) ↕ MCP (stdin/stdout, JSON-RPC 2.0) veh-debug-adapter.exe veh-mcp-server.exe ↕ Named Pipe IPC ↕ Named Pipe IPC └──────── veh-debugger.dll (타겟 프로세스 내부) ────────┘ ``` ### 组件说明 | 组件 | 作用 | |---------|------| | `veh-debugger.dll` (`vcruntime_net.dll`) | 注入到目标进程。负责注册 VEH 处理程序、管理断点、查询线程/堆栈/内存 | | `veh-debug-adapter.exe` | DAP 协议服务器。负责 DLL 注入、Named Pipe 通信、处理 JSON-RPC | | `veh-mcp-server.exe` | MCP 工具服务器。允许 AI 代理通过 36 个工具直接控制调试器 | | VSCode Extension | 定义 launch.json 架构,设置适配器路径(最小化包装器) | ## 构建 ### 环境要求 - Windows 10+ x64 - CMake 3.20+ - Visual Studio 2022 (MSVC) - Node.js 18+(用于 VSCode 扩展,可选) ### C++ 构建(64 位) ``` cmake -B build -G "Visual Studio 17 2022" -A x64 cmake --build build --config Release ``` 输出产物: - `build/bin/Release/veh-debug-adapter.exe` — DAP 适配器 - `build/bin/Release/veh-mcp-server.exe` — MCP 工具服务器 - `build/bin/Release/vcruntime_net.dll` — VEH 调试器 DLL(伪装名称) ### C++ 构建(32 位 DLL) 调试 32 位进程时需要: ``` cmake -B build32 -G "Visual Studio 17 2022" -A Win32 cmake --build build32 --config Release --target veh-debugger # 输出: build32/bin/Release/vcruntime_net32.dll # 复制到 build/bin/Release/ 使用 copy build32\bin\Release\vcruntime_net32.dll build\bin\Release\ ``` ### 构建 VSCode 扩展 ``` cd extension npm install npm run compile ``` ## 用法 ### 1. 在 VSCode 中使用 (stdio 模式) 添加到 `.vscode/launch.json`: **启动进程** ``` { "type": "veh", "request": "launch", "name": "VEH Debug - Launch", "program": "C:/path/to/target.exe", "args": ["arg1", "arg2"], "stopOnEntry": true } ``` - `program`:要调试的可执行文件路径 - `args`:运行参数(可选) - `stopOnEntry`:是否在入口点暂停 - `runAsInvoker`:以当前权限运行,不弹出 UAC 权限提升提示(默认:false) **附加到正在运行的进程** ``` { "type": "veh", "request": "attach", "name": "VEH Debug - Attach", "processId": 1234 } ``` - `processId`:目标进程 PID(可在任务管理器中查看) ### 2. TCP 模式(本地) 将适配器作为独立进程运行后,DAP 客户端通过 TCP 连接: ``` veh-debug-adapter.exe --tcp --port=4711 ``` 默认仅绑定到 `127.0.0.1`,因此只能在本地访问。 ### 3. TCP 远程模式(VM/网络) 在 VM 内部或远程机器上运行,从主机/外部连接: ``` # 在目标机器上运行 (0.0.0.0 绑定) veh-debug-adapter.exe --tcp --port=4711 --remote # 或 veh-debug-adapter.exe --tcp --port=4711 --bind=0.0.0.0 ``` 从外部使用 DAP 客户端连接到 `<目标机器IP>:4711`。 **安全警告**:`--remote` 会绑定到所有网络接口。请仅在可信网络中使用,或通过防火墙限制访问。 ### 4. MCP debug 工具集成 (DAP over TCP) ``` # 以 TCP 模式运行 adapter veh-debug-adapter.exe --tcp --port=4711 # 在 MCP debug 工具中建立 TCP 连接 debug(operation: "launch", address: "localhost:4711", ...) ``` ### 5. MCP 工具服务器(直接由 AI 代理控制) 这是一个独立的 MCP 服务器,允许不了解 DAP 协议的 AI 代理像调用函数一样控制调试器。 **自动安装(推荐)** ``` # 一次性安装到所有 agent veh-mcp-server.exe --install # 仅安装到特定 agent veh-mcp-server.exe --install claude-code veh-mcp-server.exe --install cursor # 卸载 veh-mcp-server.exe --uninstall ``` 支持的代理:`claude-code`, `claude-desktop`, `cursor`, `windsurf`, `codex` 会自动检测自身的绝对路径,并注册到各个代理的配置文件中。 | 代理 | 配置文件 | 格式 | |---------|----------|------| | Claude Code | `~/.claude/settings.json` | JSON (`mcpServers`) | | Claude Desktop | `%APPDATA%/Claude/claude_desktop_config.json` | JSON (`mcpServers`) | | Cursor | `~/.cursor/mcp.json` | JSON (`mcpServers`) | | Windsurf | `~/.codeium/windsurf/mcp_config.json` | JSON (`mcpServers`) | | Codex CLI | `~/.codex/config.toml` | TOML (`mcp_servers`) | **手动安装**(直接编辑配置文件) Claude Code / Claude Desktop / Cursor / Windsurf (JSON 格式): ``` { "mcpServers": { "veh-debugger": { "command": "C:/path/to/veh-mcp-server.exe", "args": ["--log=veh-mcp.log"] } } } ``` Codex CLI (TOML 格式): ``` [mcp_servers.veh-debugger] command = "C:/path/to/veh-mcp-server.exe" args = ["--log=veh-mcp.log"] enabled = true ``` 配置完成后,重启代理/IDE 即可生效。 **MCP 工具列表(36个)** | 工具 | 参数 | 描述 | |------|------|------| | `veh_attach` | `pid` | 向进程注入 DLL + 连接管道 | | `veh_launch` | `program, args?, stopOnEntry?` | 创建进程 + 注入 | | `veh_detach` | - | 分离调试器 | | `veh_set_breakpoint` | `address, condition?, hitCondition?, logMessage?, action?` | 软件 BP。通过 `action` 在命中时自动执行 (veh_batch 格式) | | `veh_remove_breakpoint` | `id` | 移除软件 BP | | `veh_set_source_breakpoint` | `source, line, condition?, hitCondition?, logMessage?` | 源文件+行号 BP (需要 PDB;对于未加载的模块,状态会设为 `pending`,待模块加载后自动绑定) | | `veh_set_function_breakpoint` | `name, condition?, hitCondition?, logMessage?` | 函数名 BP (需要 PDB;对于未加载的模块,状态会设为 `pending`,待模块加载后自动绑定) | | `veh_list_breakpoints` | - | 查询活跃的 SW/HW BP 列表 | | `veh_set_data_breakpoint` | `address, type, size` | HW BP (write/readwrite/execute) | | `veh_remove_data_breakpoint` | `id` | 移除 HW BP | | `veh_continue` | `threadId?, wait?, timeout?, pass_exception?, ignore_exceptions?` | 继续执行。可通过 `ignore_exceptions=[0x80000003]` 仅将特定异常传递给 SEH | | `veh_step_in` | `threadId` | Step Into | | `veh_step_over` | `threadId` | Step Over | | `veh_step_out` | `threadId` | Step Out | | `veh_pause` | `threadId?` | 暂停 | | `veh_threads` | - | 线程列表 | | `veh_stack_trace` | `threadId, maxFrames?` | 堆栈跟踪 | | `veh_registers` | `threadId` | 查询寄存器 | | `veh_set_register` | `threadId, name, value` | 修改寄存器值 | | `veh_evaluate` | `expression, threadId` | 计算寄存器/内存/指针/段表达式 (`[reg+offset]`, `gs:[0x60]` 等) | | `veh_read_memory` | `address, size` | 读取内存 (hex) | | `veh_write_memory` | `address, data` 或 `patches` | 写入内存。支持批量:`patches=[{address,data},...]` | | `veh_dump_memory` | `address, size, output_path` | 将内存转储为二进制文件 (最大 64MB) | | `veh_allocate_memory` | `size?, protection?` | 在目标进程中分配内存 (VirtualAlloc) | | `veh_free_memory` | `address` | 释放已分配的内存 (VirtualFree) | | `veh_execute_shellcode` | `shellcode, timeout_ms?` | 执行 shellcode (分配 RWX 内存 + 复制 + 创建线程 + 等待 + 释放) | | `veh_modules` | - | 模块列表 | | `veh_disassemble` | `address, count?` | 反汇编 (Zydis) | | `veh_exception_info` | - | 查询最后的异常信息 | | `veh_trace_register` | `threadId, register, mode?, value?, max_steps?` | 跟踪寄存器变化 (DLL 内部单步循环,IPC 开销为 0) | | `veh_trace_memory` | `address, size?, timeout_ms?` | 跟踪内存写入 (使用临时 HW BP 快速检测) | | `veh_resolve_imports` | `threadId, addresses, max_steps?, follow_exceptions?, system_only?, target_modules?` | 批量解析混淆的 import (thunk -> DLL 单步跟踪,最多 2000 个) | | `veh_batch` | `steps` | 批量执行多条指令 (可使用 `$N` 引用结果,支持 if/loop/for_each 控制流) | | `veh_trace_callers` | `address, duration_sec?` | 函数调用者性能分析 (自动 resume -> 收集 N 秒内的 caller -> 自动 pause)。返回每个唯一 caller 的命中次数。x64: 使用 RtlVirtualUnwind (准确)。x86: 使用 [ESP] (仅在函数入口点准确) | | `veh_trace_calls` | `addresses, duration_sec?, resolve?, system_only?` | 监控 call/jmp 指令在运行时的跳转目标。在 call 指令处设置 BP 并运行 N 秒,收集实际目标地址 + API 名称。`resolve=true`: 在自然的调用上下文中跟踪 thunk/trampoline,直至追踪到最终 API (应对基于异常的混淆)。`system_only=true`: 仅返回系统 DLL 目标。适用于还原加壳二进制文件的 IAT。 | ### 命令行选项 **veh-mcp-server.exe** | 选项 | 描述 | |------|------| | `--install [AGENT]` | 将 MCP 服务器注册到 AI 代理配置中 (全部或指定代理) | | `--uninstall [AGENT]` | 从 AI 代理配置中移除 MCP 服务器 | | `--log=FILE` | 日志文件路径 | | `--log-level=LEVEL` | 日志级别:debug, info, warn, error | | `--help` | 输出帮助信息 | **veh-debug-adapter.exe** | 选项 | 描述 | |------|------| | `--tcp` | TCP 传输模式 (默认: stdin/stdout) | | `--port=PORT` | TCP 端口号 (默认: 4711) | | `--remote` | 绑定到 0.0.0.0 (允许远程连接) | |--bind=0.0.0.0` | 与 `--remote` 相同 | | `--log=FILE` | 日志文件路径 | | `--log-level=LEVEL` | 日志级别:debug, info, warn, error (默认: info) | | `--help` | 输出帮助信息 | ## 功能详情 ### 断点 **软件断点 (INT3)** - `setBreakpoints` — 基于源文件:行号 (需要 PDB) - `setFunctionBreakpoints` — 基于函数名 (需要 PDB) - `setInstructionBreakpoints` — 基于地址 (无需 PDB) **硬件断点 (DR0~DR3)** - `setDataBreakpoints` — 监控内存地址的读取/写入 - 原理与 Cheat Engine 的 "Find out what writes/accesses to this address" 相同 - 最多同时监控 4 个 (受 CPU 硬件限制) - 监控大小:1/2/4/8 字节 ### PDB 符号支持 如果存在目标进程的 PDB 文件: - 可根据源文件名 + 行号设置断点 - 可根据函数名设置断点 - 在堆栈跟踪中显示函数名/源文件/行号 即使没有 PDB,依然可以进行基于地址的调试。 ### 单步执行 | 命令 | 行为 | |------|------| | `next` (F10) | Step Over — 执行一行/一条指令 (跳过函数调用) | | `stepIn` (F11) | Step Into — 进入函数内部 | | `stepOut` (Shift+F11) | Step Out — 运行直到当前函数结束 | ### 启动进程调试 类似于 Windows 调试器中的“边运行边调试”功能。同时支持 DAP (`launch` 请求) 和 MCP (`veh_launch`)。 执行顺序: 1. `CreateProcess` + `CREATE_SUSPENDED` — 以暂停状态创建进程 2. DLL 注入 — 注册 VEH 处理程序,启动 Named Pipe 服务器 3. 如果 `stopOnEntry=true` 则在入口点保持暂停,如果为 `false` 则通过 `ResumeThread` 继续执行 如果要附加到已经在运行的进程,请使用 `attach` / `veh_attach`。 ### DLL 注入 支持 4 种注入方式(自动选择): 1. **CreateRemoteThread** — 默认方式 2. **NtCreateThreadEx** — 应对受保护的进程 3. **Thread Hijacking** — 劫持现有线程 4. **QueueUserAPC** — APC 队列方式 ### 内存与反汇编 - `readMemory` / `writeMemory` — 读写任意内存 - `disassemble` — x86/x64 反汇编 - **Zydis 后端**(默认):显示完整的操作数 (`mov rax, qword ptr [rbp-0x10]`) - **Simple 后端**(后备):仅显示助记符 (`mov`, `call` — 无外部依赖) - 通过 `IDisassembler` 接口进行抽象,使用 `CreateDisassembler()` 工厂生成 - `evaluate` — 计算内存地址表达式 ## 支持的 DAP 命令完整列表 | 类别 | 命令 | |---------|------| | 生命周期 | initialize, launch, attach, disconnect, terminate | | 断点 | setBreakpoints, setFunctionBreakpoints, setExceptionBreakpoints, setInstructionBreakpoints, setDataBreakpoints, dataBreakpointInfo | | 执行控制 | configurationDone, continue, next, stepIn, stepOut, pause | | 状态查询 | threads, stackTrace, scopes, variables, evaluate | | 内存/反汇编 | readMemory, writeMemory, disassemble | | 其他 | modules, loadedSources, exceptionInfo, completions, source, cancel, gotoTargets | ## 项目结构 ``` ├── CMakeLists.txt # 루트 CMake (MT 정적 CRT) ├── src/ │ ├── dll/ # VEH 디버거 DLL │ │ ├── dllmain.cpp # DLL 진입점 │ │ ├── veh_handler.* # VEH 예외 핸들러 │ │ ├── breakpoint.* # 소프트웨어 BP 관리 │ │ ├── hw_breakpoint.* # 하드웨어 BP (DR0~DR3) │ │ ├── memory.* # 메모리 읽기/쓰기 │ │ ├── threads.* # 스레드 열거/제어 │ │ ├── stack_walk.* # 스택 워킹 (DbgHelp) │ │ └── pipe_server.* # Named Pipe IPC 서버 │ ├── adapter/ # DAP 어댑터 EXE │ │ ├── main.cpp # 진입점 (모드 파싱) │ │ ├── dap_server.* # DAP 프로토콜 핸들러 │ │ ├── dap_types.h # DAP 타입 정의 │ │ ├── transport.* # stdin/stdout & TCP 전송 │ │ ├── injector.* # DLL 인젝션 (4가지 방식) │ │ ├── pipe_client.* # Named Pipe IPC 클라이언트 │ │ ├── disassembler.h # IDisassembler 인터페이스 │ │ ├── disassembler.cpp # SimpleDisassembler (내장 경량 디코더) │ │ └── zydis_disassembler.cpp # ZydisDisassembler (Zydis v4 기반) │ ├── mcp/ # MCP 도구 서버 │ │ ├── main.cpp # 진입점 (--install, --log 등) │ │ ├── mcp_server.* # MCP 프로토콜 + 26개 도구 구현 │ │ └── installer.* # 에이전트별 자동 설치/제거 │ └── common/ # 공유 코드 │ ├── ipc_protocol.h # IPC 명령/응답 정의 │ └── logger.h # 로깅 유틸리티 ├── third_party/ # 외부 라이브러리 │ └── nlohmann/json.hpp # JSON 파서 (MIT) │ # Zydis v4.1 (vendored in third_party/) └── extension/ # VSCode 익스텐션 ├── package.json ├── tsconfig.json └── src/extension.ts ``` ## 常见问题排查 ### DLL 注入失败 - 尝试以管理员身份运行 VSCode/适配器 - 检查目标进程的位数 (32/64) — 必须与 DLL 位数匹配 - 检查杀毒软件是否阻止了注入 ### 管道连接超时 - 默认超时时间为 7 秒。在较慢的系统上,加载 DLL 可能需要一些时间 - 通过日志文件查看进度:`--log=debug.log --log-level=debug` ### 断点未生效 - 确认 PDB 文件是否与目标 EXE 位于同一目录下 - 如果没有 PDB,则只能使用基于地址的 BP (`setInstructionBreakpoints`) - 硬件 BP 最多限制为 4 个 ### 无法建立远程连接 - 检查是否使用了 `--remote` 或 `--bind=0.0.0.0` 选项 - 检查防火墙是否开放了相应端口 - 确认虚拟机的网络适配器是否处于桥接模式 ## 依赖项 | 库 | 用途 | 许可证 | |-----------|------|---------| | [nlohmann/json](https://github.com/nlohmann/json) | JSON 解析 (header-only) | MIT | | [Zydis v4.1](https://github.com/zyantific/zydis) | x86/x64 反汇编 (包含在 third_party 中) | MIT | ## 许可证 MIT License
标签:AI编程辅助, DAP协议, MCP, VEH, Windows调试器, 云资产清单, 反调试绕过, 字典攻击, 逆向工程