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

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

      

  • 相关阅读:
    C# WebClient 使用http免费代理
    C#中给WebClient添加代理Proxy
    浅谈C#实现Web代理服务器的几大步骤
    Visual Studio 2017各版本安装包离线下载、安装全解析
    C# HttpClient, 使用C#操作Web
    ROS学习之 tab补全错误
    ROS学习之group标签
    ROS学习之CMakeLists.txt
    ROS学习之包的概念
    ROS学习之package.xml
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11963498.html
Copyright © 2011-2022 走看看