首页
社区
课程
招聘
[原创]深度理解 VEH-CheatEngine vs VEH-PAGE_GUARD
发表于: 3小时前 68

[原创]深度理解 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"

[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回