C++如何使用VEH(向量化异常处理)捕获PAGE_GUARD内存访问断点

雨磊小哥_6166

雨磊小哥_6166

2026-11-04

709人浏览

原创

VEH无法捕获PAGE_GUARD异常,因该异常由内核内存管理器直接处理,不经过KiUserExceptionDispatcher分发路径;应改用SEH配合VirtualProtect重置guard属性。

c++如何使用veh(向量化异常处理)捕获page_guard内存访问断点

VEH 不能捕获 PAGE_GUARD 引发的异常

直接说结论:SetUnhandledExceptionFilter 和 AddVectoredExceptionHandler 都无法可靠捕获由 PAGE_GUARD 触发的 EXCEPTION_GUARD_PAGE。这不是用法问题,而是 Windows 内核的设计限制:Guard Page 异常在用户态 VEH 链之前就被内核特殊处理并“吞掉”了——它不走标准的 SEH/VEH 分发路径,而是由内存管理器直接回调到 VirtualAlloc 或 VirtualProtect 的调用上下文中(如果有的话),否则直接终止线程。

为什么 PAGE_GUARD 不走 VEH?

Windows 对 Guard Page 的异常处理是硬编码在内存管理路径中的。当 CPU 访问带 PAGE_GUARD 的页时,会触发 #PF(page fault),内核检查到该页有 GUARD 属性后,会:

  • 清除该页的 PAGE_GUARD 标志(即“触发一次就失效”)
  • 向当前线程发送 EXCEPTION_GUARD_PAGE,但这个异常不经过 KiUserExceptionDispatcher
  • 该异常只被当前线程的顶层 SEH 框架(如 __try/__except)或系统默认调试器捕获,VEH 注册的回调根本收不到

你可以用 WinDbg 验证:对 guard 页执行 mov eax, [rax] 后,.exr -1 显示 ExceptionCode: c0000005 (Access violation),但 !exchain 里看不到你的 VEH 回调地址。

替代方案:用 SEH + VirtualProtect 配合模拟

真正可行的做法是放弃 VEH,改用结构化异常处理(SEH),并在 __except 块中手动重设 guard 属性。关键点:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • PAGE_GUARD 必须配合 VirtualProtect 单独设置(不能和 VirtualAlloc 一起用,后者不支持 GUARD)
  • 每次访问触发后,必须立刻用 VirtualProtect 重新加回 PAGE_GUARD,否则第二次访问就变成普通 access violation(EXCEPTION_ACCESS_VIOLATION)
  • SEH 处理器必须是 __except( GetExceptionCode() == EXCEPTION_GUARD_PAGE ),不能写成 EXCEPTION_EXECUTE_HANDLER 全捕获

示例片段:

char* guard_page = (char*)VirtualAlloc(nullptr, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
VirtualProtect(guard_page, 4096, PAGE_READWRITE | PAGE_GUARD, &old_prot);
<p>__try {
char x = guard_page[0]; // 触发 EXCEPTION_GUARD_PAGE
} __except( GetExceptionCode() == EXCEPTION_GUARD_PAGE ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) {
printf("Guard hit at %p\n", guard_page);
VirtualProtect(guard_page, 4096, PAGE_READWRITE | PAGE_GUARD, &old_prot); // 重置
}</p>

调试与验证时容易忽略的坑

实际调试中常见几个误判点:

  • 用 IsDebuggerPresent() 或 Visual Studio 调试器运行时,guard page 异常可能被调试器截获并静默处理,导致你“看不到异常”,建议用 DebugBreak() + WinDbg 验证
  • PAGE_GUARD 只对首次访问有效,且仅作用于单个页面(4KB),跨页访问不会连锁触发
  • x64 下 SEH 是基于表的(not stack-based),所以 __try/__except 必须在函数栈帧内,不能放在 lambda 或静态初始化器里
  • 如果你真需要类似 VEH 的全局监控,唯一办法是用 SetThreadContext + 硬件断点(CONTEXT.Dr0-Dr3),但开销大、不兼容所有 CPU 特性,且和 guard page 机制无关

Guard Page 的设计本意就是轻量级内存访问通知,不是通用异常捕获机制。想靠 VEH 插手,本质上是在绕过 Windows 内存子系统的预期路径,结果注定不可靠。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ c++编程 c++安全

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2288

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

347

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习