-
-
[原创]深度理解 VEH-CheatEngine vs VEH-PAGE_GUARD
-
发表于: 3小时前 68
-
本文将从原理到源码、从实验到实战,彻底讲清楚两种方案的本质差异,并论证 CE VEH Debugger 的断点核心是 DR0-DR3 + DR7 硬件调试寄存器。
特征:页级粒度,一次性触发,自动消失。
特征:字节级精度,CPU 硬件执行,持久有效。
CE → Memory View → Debug → 设置第 5 个断点:
4 个。不多不少。正好是 DR0、DR1、DR2、DR3。
PAGE_GUARD 没有这个限制——你想给多少页加 GUARD 都行。
CE VEH 断点选项:
与 DR7 位域完全对应:
PAGE_GUARD 做不到:
在 VEH Handler 内拦截,CE 断点命中时:
如果是 PAGE_GUARD:
实测是 0x80000004。铁证如山。
VEH Handler:
源码直接操作 DR 寄存器。没有任何 VirtualProtect、PAGE_GUARD 的影子。
用 API Monitor 监控 CE 设置 VEH 断点时的系统调用:
CE VEH Debugger 在以下场景稳定工作:
如果是 PAGE_GUARD:
多线程游戏 + PAGE_GUARD = 直接GG。
也别把它一棒子打死。它有自己的定位:
一句话:PAGE_GUARD 是单线程穷人的无限断点,自己查查自己没问题。
输出:
这就是 CE VEH Debugger 的核心原理。20 行代码复现。
| 维度 | PAGE_GUARD | DR7 硬件断点 |
|---|---|---|
| 粒度 | 4KB 整页 | 1 / 2 / 4 / 8 字节 |
| 数量 | 无限 | 最多 4 个 |
| 触发异常 | 0x80000001 |
0x80000004 |
| 多线程 | 竞态灾难 | 安全(每线程独立 DR) |
| 性能开销 | 高(同页误触发) | 零(CPU 硬件比对) |
| 触发后状态 | GUARD 自动移除 | 断点持续存在 |
| 监控类型 | 读 / 写 | 执行 / 写 / 读写 |
| 检测难度 | VirtualQuery 一查便知 | 需要 GetThreadContext |
// 给内存页加上哨兵属性
DWORD old;
VirtualProtect(addr, size, PAGE_READWRITE | PAGE_GUARD, &old);
// 任何线程碰一下这个页 → 触发异常
// ExceptionCode: STATUS_GUARD_PAGE_VIOLATION (0x80000001)
// 然后 GUARD 自动移除,需要手动恢复
// 把目标地址写入调试寄存器
ctx.Dr0 = (DWORD_PTR)targetAddr;
ctx.Dr7 = 0x000D0001; // 启用 DR0,写入监控,4字节
// CPU 每条指令自动比对
// 精确命中 → 触发 #DB 异常
// ExceptionCode: STATUS_SINGLE_STEP (0x80000004)
"You can only have 4 breakpoints at a time when using the VEH debugger"
赞赏
赞赏
雪币:
留言: