SEH是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常处理的工具,允许其接收关于异常情况的通知,例如除数是0导致的错误,引用不存在的指针或执行受限制的指令。这种机制允许处理应用程序中的异常,而无需操作系统操作。如果不对异常进行处理,则会导致异常程序终止。开发人员通常能在堆栈中找到SEH的指针,它们被称为SEH Frame。当前SEH Frame地址位于x64系统的FS选择器或GS选择器的0的偏移处,这个地址指向ntdll!_EXCEPTION_REGISTRATION_RECORD结构:
- 0:000> dt ntdll!_EXCEPTION_REGISTRATION_RECORD
- +0x000 Next : Ptr32 _EXCEPTION_REGISTRATION_RECORD
- +0x004 Handler : Ptr32 _EXCEPTION_DISPOSITION
当启动异常时,控制将传输到当前的SEH处理程序。根据情况,SEH处理程序应返回一个_EXCEPTION_DISPOSITION值:
- typedef enum _EXCEPTION_DISPOSITION {
- ExceptionContinueExecution,
- ExceptionContinueSearch,
- ExceptionNestedException,
- ExceptionCollidedUnwind
- } EXCEPTION_DISPOSITION;
如果处理程序返回ExceptionContinueSearch,系统会继续执行指令,从而触发异常。如果处理程序不知道如何处理异常,它应该返回ExceptionContinueSearch,转到系统中的下一个处理程序。你可以使用windbg调试器中的!exchain命令浏览当前的异常链:
- 0:000> !exchain
- 00a5f3bc: AntiDebug!_except_handler4+0 (008b7530)
- CRT scope 0, filter: AntiDebug!SehInternals+67 (00883d67)
- func: AntiDebug!SehInternals+6d (00883d6d)
- 00a5f814: AntiDebug!__scrt_stub_for_is_c_termination_complete+164b (008bc16b)
- 00a5f87c: AntiDebug!_except_handler4+0 (008b7530)
- CRT scope 0, filter: AntiDebug!__scrt_common_main_seh+1b0 (008b7c60)
- func: AntiDebug!__scrt_common_main_seh+1cb (008b7c7b)
- 00a5f8e8: ntdll!_except_handler4+0 (775674a0)
- CRT scope 0, filter: ntdll!__RtlUserThreadStart+54386 (7757f076)
- func: ntdll!__RtlUserThreadStart+543cd (7757f0bd)
- 00a5f900: ntdll!FinalExceptionHandlerPad4+0 (77510213)
(编辑:西安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|