主要观点:
- 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 注册后添加到异常链的末尾,当异常发生时从列表头部开始查找处理程序。
重要细节:
- 示例编译程序[https://blog.elmo.sg/assets/p...]可用于查看 SEH 处理程序的反汇编。
- 文中提到的相关函数如
RtlInstallFunctionTableCallback
、RtlAddFunctionTable
/RtlAddGrowableFunctionTable
用于动态添加RUNTIME_FUNCTION
条目。 - 文中提到的多个博客文章[https://securityintelligence....、https://billdemirkapi.me/exce...、https://momo5502.com/posts/20...]可用于进一步学习 Windows 异常处理内部机制及相关利用技术。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。