类型
- 最底层是 SEH (structure) 用链表实现
- 然后是包装了 SEH 的 VEH 用函数调用实现
- 最后是 VCH 包装了前面两个
- 或者是 C++ 内部包装的异常机制
处理
首先是调试器 然后是程序内部的 最后是硬件层面
Dr0~Dr3 用于设置硬件断点,由于只有 4 个断点寄存器,所以最多只能设置 4 个硬件调试断点。在这 7 个寄存器里面,Dr7 是最重要的寄存器
L0/G0 ~ L3/G3:控制 Dr0~Dr3 是否有效,局部还是全局;每次异常后,Lx 都被清零,Gx 不清零。
若 Dr0 有效,L0=1 则为局部,G0=1 则为全局,以此类推
断点长度 (LENx):00(1 字节)、01(2 字节)、11(4 字节)
通过 DR7 的 LEN 控制
断点类型 (R/Wx):00(执行断点)、01(写入断点)、11(访问断点)
参考资料
重点知识
- Windows 异常处理原理-CSDN博客
- Windows的异常处理_windows异常处理机制-CSDN博客
- FS段寄存器详解 - m4sterx - 博客园 (cnblogs.com)
- 深入解析结构化异常处理(SEH) - 厚积薄发 - C++博客 (cppblog.com)
- 上面的翻译的带图片版(感觉翻得不错)A Crash Course on the Depths of Win32 Structured Exception Handling - 中道学友 - 博客园 (cnblogs.com)
- 上面的原文页面移动了 A Crash Course on theDepths of Win32 Structured Exception Handling, MSJ January 1997 (archive.org)
- 获取VEH SEH VCH UEF异常的函数地址-软件逆向-看雪-安全社区|安全招聘|kanxue.com
- [VEH,VCH,UEF Windows 向量化异常处理机制详解 - 软件逆向 - 看雪 - 安全社区|安全招聘|kanxue.com](https://bbs.kanxue.com/thread-189315.htm
- 异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介 - iBinary - 博客园 (cnblogs.com)
- SetUnhandledExceptionFilter 函数 (errhandlingapi.h) - Win32 apps | Microsoft Learn
- 使用筛选器和SEH处理异常 - hznnzh - 博客园 (cnblogs.com)