结构化异常处理是Windows操作系统处理程序错误或异常的技术。在一个应用程序发生错误时,Windows挂起程序,并交由调试器处理,当调试器不能处理时,则调用程序的线程相关的SEH异常处理函数。
异常处理函数可以有一个或多个,采用链表的结构将他们链接起来。当前的处理函数如果不处理,并且有多个处理函数时,可以交由链起来的其它异常处理过程进行处理。
如果程序线程的异常处理函数均选择不处理,如果处于被调试状态,操作系统挂起程序通知调试器。
这时有两种可能:
(1)如果程序未处于被调试状态或者调试器仍然未能够处理,并且程序调用了API函数SetUnhandledExceptionFilter设置了与进程相关的异常处理过程的话,系统转向它的调用。
(2)如果程序没有设置进程相关的异常处理过程或者进程相关的异常处理过程也未能处理这个异常,系统调用默认的系统异常处理程序。可以选择终止程序,或者最后将其附加到调试器上的“取消”按钮。如果没有调试器能被附加于其上或调试器还是处理不了异常,系统就终止程序。
不过在终止之前,系统再次调用发生异常的线程中所有的异常处理过程,其后程序就终结了。
基本的概念是:SEH是系统发现异常或错误时,在终结应用程序之前给应用程序的一个最后改正错误的机会。
SEH相关数据结构有:TEB、_EXCEPTION_REGISTRATION、EXCEPTION_POINTERS(异常发生时,系统向引起异常的线程的堆栈里压入该结构),EXCEPTION_POINTERS中包含两个指向结构的指针,分别是:Exception_Record、CONTEXT.
通过修改CONTEXT结构中的成员,可以设置线程的环境,将调试寄存器清零,使断点失效,以达到反跟踪的目的。