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() 判断是否存在调试器,则传给调试器去处理并等待调试结果。

  如果调试成功,代码继续执行,否则其会终止进程与线程,弹出程序出错。

  

原文地址:https://www.cnblogs.com/onetrainee/p/11963498.html