结构化异常处理(通过设置CONTEXT结构实现反跟踪)

  结构化异常处理是Windows操作系统处理程序错误或异常的技术。在一个应用程序发生错误时,Windows挂起程序,并交由调试器处理,当调试器不能处理时,则调用程序的线程相关的SEH异常处理函数。

  异常处理函数可以有一个或多个,采用链表的结构将他们链接起来。当前的处理函数如果不处理,并且有多个处理函数时,可以交由链起来的其它异常处理过程进行处理。

  如果程序线程的异常处理函数均选择不处理,如果处于被调试状态,操作系统挂起程序通知调试器。

  这时有两种可能:

  (1)如果程序未处于被调试状态或者调试器仍然未能够处理,并且程序调用了API函数SetUnhandledExceptionFilter设置了与进程相关的异常处理过程的话,系统转向它的调用。

  (2)如果程序没有设置进程相关的异常处理过程或者进程相关的异常处理过程也未能处理这个异常,系统调用默认的系统异常处理程序。可以选择终止程序,或者最后将其附加到调试器上的“取消”按钮。如果没有调试器能被附加于其上或调试器还是处理不了异常,系统就终止程序。

  

  不过在终止之前,系统再次调用发生异常的线程中所有的异常处理过程,其后程序就终结了。

  基本的概念是:SEH是系统发现异常或错误时,在终结应用程序之前给应用程序的一个最后改正错误的机会。

  SEH相关数据结构有:TEB、_EXCEPTION_REGISTRATION、EXCEPTION_POINTERS(异常发生时,系统向引起异常的线程的堆栈里压入该结构),EXCEPTION_POINTERS中包含两个指向结构的指针,分别是:Exception_Record、CONTEXT.

  通过修改CONTEXT结构中的成员,可以设置线程的环境,将调试寄存器清零,使断点失效,以达到反跟踪的目的。

  

时间: 2024-12-15 03:20:41

结构化异常处理(通过设置CONTEXT结构实现反跟踪)的相关文章

第23章 SEH结构化异常处理(1)

23.1 基础知识 23.1.1 Windows下的软件异常 (1)中断和异常 ①中断是由外部硬件设备或异步事件产生的 ②异常是由内部事件产生的,可分为故障.陷阱和终止三类. (2)两种异常处理机制:SEH和VEH(WindowsXP以上新引进) (3)结构化异常处理(SEH)是Windows操作系统提供的强大异常处理功能.而Visual C++中的__try{} __finally{}和__try{} __except{}结构本质上是对Windows提供的SEH的封装. 23.1.2 SEH的

关于SEH(结构化异常处理)的一些知识

梳理老罗win32汇编关于SEH一章的知识. 异常处理方式有两种: 筛选器异常处理和结构化异常处理,筛选器是全局性的,无法为一个线程或一个子程序单独设置一个异常处理回调函数,而结构化异常处理(Structured Exception Handing)SEH提供了每个线程之间独立的异常处理方法. 以下以两个例子来学习SEH 例子1:不含栈展开操作的异常处理(栈展开会在例子二中介绍) .386 .model flat,stdcall option casemap:none ;>>>>&

深入研究 Win32 结构化异常处理(好多相关文章)

摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的最基本概念讲起. Matt Pietrek 著董岩 译Victor 转载自 Xfocus 并整理 在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理(structured exception handling,SEH)了.一提到结构化异常处理,可能就会令人想起

深入研究 Win32 结构化异常处理(作者博客有许多SEH的研究文章)

摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的最基本概念讲起. Matt Pietrek 著董岩 译Victor 转载自 Xfocus 并整理 在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常处理(structured exception handling,SEH)了.一提到结构化异常处理,可能就会令人想起

[转载]深入解析结构化异常处理

尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的只是皮毛,一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗. 1997年文章,Windows技术的根一直没变:http://www.microsoft.com/msj/0197/exception/exception.aspx Matt Pietrek 著 董岩 译 在Win32操作系统提供的所有功能中,使用最广泛而又没有公开的恐怕要数结构化异常处理(Structured Exception Ha

解析结构化异常处理(SEH)(第二部分)

书接上一篇:http://www.cnblogs.com/ONDragon/p/6855174.html 虽然这个异常回调机制很好,但它并不是一个完美的解决方案.对于稍微复杂一些的应用程序来说,仅用一个 函数就能处理程序中任何地方都可能发生的异常是相当困难的.一个更实用的方案应该是有多个异常处理例程,每个例程针对程序中的一部分.实际上,操作系统提 供的正是这个功能. 还 记得系统用来查找异常回调函数的EXCEPTION_REGISTRATION结构吗?这个结构的第一个成员,称为prev,前面我们

结构化异常处理(四)构建自定义异常

一.构建一个强类型异常来表示当前问题的独特细节效果会更好. 假定要构建一个名为CarIsDeadException的自定义异常来表示加速注定要损坏的汽车的错误. 1.创建一个派生自System.Exception/System.ApplicationException的新类(按照约定,所有的一场类均应以“Exception”后缀结束,这是.NET的最佳实践). 1 namespace CustomException 2 { 3 public class CarIsDeadException :

Windows结构化异常处理浅析

近期一直被一个问题所困扰,就是写出来的程序老是出现无故崩溃,有的地方自己知道可能有问题,但是有的地方又根本没办法知道有什么问题.更苦逼的事情是,我们的程序是需要7x24服务客户,虽然不需要实时精准零差错,但是总不能出现断线丢失数据状态.故刚好通过处理该问题,找到了一些解决方案,怎么捕获访问非法内存地址或者0除以一个数.从而就遇到了这个结构化异常处理,今就简单做个介绍认识下,方便大家遇到相关问题后,首先知道问题原因,再就是如何解决.废话不多说,下面进入正题. 什么是结构化异常处理 结构化异常处理(

第23章 SEH结构化异常处理(2)

23.2 编译器层面对系统SEH机制的封装 23.2.1 扩展的EXCEPTION_REGISTRATION级相关结构:VC_EXCEPTION_REGISTRATION (1)VC_EXCEPTION_REGISTRATION结构 struct VC_EXCEPTION_REGISTRATION { VC_EXCEPTION_REGISTRATION* prev; //前一个结构体的指针 FARPROC handler; //永远指向_exception_handler4回调函数 scopet