深入研究现代 Windows 结构化异常处理程序 (SEH) ⚠️

主要观点:

  • Windows 操作系统有自己独特的异常处理机制,如结构化异常处理(SEH)和向量化异常处理(VEH),它们是传统 C/C++语言的扩展,用于支持运行时错误处理。
  • SEH 在 32 位和 64 位程序中的实现差异很大,64 位 SEH 异常处理较为复杂,需要深入了解异常处理程序的安装和实现方式。
  • 通过编译简单程序并在 IDA 中查看反汇编,可了解 SEH 处理程序在编译程序中的样子,还可通过工具查看 PE 图像中的异常目录来找到 x64 异常处理程序。
  • 当异常发生时,内核会捕获异常并将控制流传递给ntdll!KiUserExceptionDispatcher函数,该函数会找到适当的异常处理程序来处理异常,过程涉及多个重要函数和数据结构。
  • VEH 与 SEH 实现不同,VEH 用于监控整个进程的异常,在运行时通过AddVectoredExceptionHandler函数注册,当异常发生时从列表头部开始查找处理程序。

关键信息:

  • 在 64 位程序中,异常目录中的RUNTIME_FUNCTION条目定义了处理异常的指令范围,UNWIND_INFO包含用于恢复栈和寄存器状态的指令数组。
  • CONTEXT结构包含异常发生时寄存器的状态信息,RtlLookupFunctionEntry函数用于在异常目录中查找有效的RUNTIME_FUNCTION条目,RtlpLookupDynamicFunctionEntry用于查找动态函数条目。
  • 64 位 SEH 处理程序默认存储在只读异常目录中,32 位 SEH 处理程序存储在运行时栈上的异常处理程序链表中。
  • VEH 注册后添加到异常链的末尾,当异常发生时从列表头部开始查找处理程序。

重要细节:

阅读 10
0 条评论