04 异常的处理流程
【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】
问题:
1. 被调试器如何表明是否处理了异常?
2. 异常处理器是什么?
3. 如果异常到最后都没有被处理,那应该怎么办?
1. 调试器是否处理异常的标志
调试器使用 WaitForDebugEvent 接收调试事件之后要使用 ContinueDebugEvent 来继续执行被调试程序。
而ContinueDebugEvent最后一个参数是标志位,如果是 DBG_EXCEPTION_NOT_HANDLE 表示当前系统没有处理异常,而如果是 DBG_CONTINUE,则表示处理异常完成。
因此,操作系统就可以根据这个标志位来决定走哪里
注意:如果并没有处理异常,而程序继续执行,则又会触碰该异常,然后继续执行。
2. VEH / SEH - 异常处理器
这个我们介绍过,就是异常处理器,一个全局一个局部,这个之前介绍过就不比多说了。
3. 异常处理最后一道防线 UnhandledExceptionFilter
在Windows操作系统下,每个线程都包含如下代码。
__try { } __except(UnhandledExceptionFilter(GetExceptionInformation()) { //终止线程 //终止进程 }
UnhandledExceptionFilter中没有任何处理异常的代码,它所做的就是如果调试器无法处理,就终止进程或县城。
会首先调用 GetExceptionInformation() 判断是否存在调试器,则传给调试器去处理并等待调试结果。
如果调试成功,代码继续执行,否则其会终止进程与线程,弹出程序出错。