首页 > 代码库 > 结构化异常(SEH)简述

结构化异常(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