结构化异常(SEH)简述

/*********************************************************************

* Author  : Samson

* Date    : 08/04/2014

* Test platform:

*              Linux ubuntu 3.2.0-58-generic-pae

*              GNU bash, version 4.2.39

* *******************************************************************/

结构化异常处理程序?

SEH:structured Exception Handling,结构化异常处理。

结构化异常处理,是Windows操作系统上,Microsoft对C/C++程序语言做的语法扩展,用于处理异常事件的程序控制结构。

异常事件是打断程序正常执行流程的不在期望之中的硬件、软件事件。硬件异常是CPU抛出的如“除0”、数值溢出等;软件异常是操作系统与程序通过RaiseException语句抛出的异常。

Microsoft扩展了C语言的语法,用 try-except与try-finally语句来处理异常。异常处理程序可以释放已经获取的资源、显示出错信息与程序内部状态供调试、从错误中恢复、尝试重新执行出错的代码或者关闭程序等等。

一个__try语句不能既有__except,又有__finally。但try-except与try-finally语句可以嵌套使用。

允许在发生紧急情况时(如:内存访问错误,被0除,或无效操作),由应用程序获取控制权并自主处理,无需操作系统干预。未被处理的异常通常会导致应用程序异常终止,随之而来的是程序执行无效操作即将关闭的消息。

__try
{
   // 受保护执行的代码
}
__except ( 过滤表达式 )
{
   // 异常处理代码
}

首先,__try复合语句中的受保护的代码被执行。如果没有异常发生,则继续执行__except复合语句之后的代码。如果__try复合语句中的受保护执行的代码发生了异常,或受保护执行的代码调用的函数内部发生了异常并要求调用者来处理该异常,__except语句的过滤表达式(filter expression)被求值,根据其结果来决定如何处理异常:

  • EXCEPTION_CONTINUE_EXECUTION (–1)  : 导致异常的问题已经解决,在异常出现的现场重新执行操作。
  • EXCEPTION_CONTINUE_SEARCH (0) :当前__except语句不能处理该异常,通知操作系统继续搜寻该线程其他的异常处理程序。
  • EXCEPTION_EXECUTE_HANDLER (1):当前__except语句识别该异常,通过执行__except的复合语句来处理该异常。然后执行__except复合语句之后的代码。

内在函数GetExceptionCode返回一个32位整型值,表示异常的类型。

陷阱与攻击:

在大部分情况下,指向结构化异常处理程序的指针都保存在栈的SEH帧中,溢出缓冲区可以改写它们。改写SEH帧主要有两个目的:通过替换结构化异常处理程序获取控制权;万一产生异常时,抵制程序异常终止。

windows 2003中内置的反缓冲区溢出及大部分类似的保护机制,都以SEH为基础。黑客通过捕获结构化异常处理程序,并用定制的处理程序替换它,就可以使这类保护机制失效。

REF:

http://zh.wikipedia.org/wiki/%E7%BB%93%E6%9E%84%E5%8C%96%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86

结构化异常(SEH)简述,布布扣,bubuko.com

时间: 2024-10-11 12:12:07

结构化异常(SEH)简述的相关文章

结构化异常SEH处理机制详细介绍(二)

本文将全面阐述__try,__except,__finally,__leave异常模型机制,它也即是Windows系列操作系统平台上提供的SEH模型.SEH实际包含两个主要功能:结束处理(termination handling)和异常处理(exception handling).每当你建立一个try块,它必须跟随一个finally块或一个except块.一个try 块之后不能既有finally块又有except块.但可以在try - except块中嵌套try - finally块,反过来也可

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

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

SEH 结构化异常

Structured Exception Handling是windows特有的异常处理,SEH包含了两个方面的功能: ? 终止处理 ? 异常处理 终止处理: 终止处理确保无论被保护代码是如何退出的,另一个代码块总能被调用和执行: __try { //Guarded Body - } __finally { //Termination handler - } 无论在被保护代码中使用了return还是goto,亦或者longjump(除非调用了ExitProcess, EixtThread, Te

第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

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

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

windows SEH机构化异常

搞了不短时间的win32开发了,居然SEH结构化异常没啥了解,必须补下课 现在看来,用起来比c++的标准异常处理简单,毕竟是结构化的,不支持面向对象那一套 处理函数的返回值EXCEPTION_CONTINUE_EXECUTION比较有趣,似乎是提供了免费的午餐,让程序出错也继续运行.不过查了一下资料,似乎不推荐这样做,因为是从出错的那句开始继续运行,但是经过编译,优化后的语句,可能完全不会按照你想象的样子运行 另外,用_set_se_translator也可以将SEH异常转为c++标准异常

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

摘要 就像人们常说的那样,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

第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的