WEB开发网
开发学院网络安全黑客技术 Structured Exception Handling 阅读

Structured Exception Handling

 2007-01-14 20:14:46 来源:WEB开发网   
核心提示: Compiler-levelSEH尽管我偶尔会使用_try和_except,但目前我所讲到的都是由操作系统实现的,Structured Exception Handling(10),然而,看看我那两个使用纯操作系统SEH的程序的变态样子,异常回调函数对应着filter-expression

Compiler-levelSEH

尽管我偶尔会使用_try和_except,但目前我所讲到的都是由操作系统实现的。然而,看看我那两个使用纯操作系统SEH的程序的变态样子,编译器对此的封装实在是必要的。我们来看一下VisualC++是如何在操作系统级的SEH支持之上构建其结构化异常处理的。

在继续进行之前要记住一件重要的事,那就是另一种编译器可能会与纯操作系统级的SEH的做法完全不同。没有人说过必须要实现Win32SDK文档所描述的_try/_except模型。例如,VisualBasic5.0在其运行时代码里使用了结构化异常处理,但其数据结构与算法与我这里所讲的完全不同。若读一下Win32SDK文档关于结构化异常处理的描述,就会找到所谓的“frame-based”的异常处理程序的语义,其形式如下:

try{
  //guardedbodyofcode
}
except(filter-expression){
  //exception-handlerblock
}

简单讲,try中的所有的代码都被一个构建在函数堆栈帧上的EXCEPTION_REGISTRATION保护起来。在函数的入口,新的EXCEPTION_REGISTRATION被放入异常处理链表的表头。在_try块的结尾处,其EXCEPTION_REGISTRATION被从链表头移除。如前所述,异常处理链的表头保存在FS:[0]。因此,若在调试器中的汇编代码中单步执行,就会看到以下的指令:

MOVDWORDPTRFS:[00000000],ESP

或是

MOVDWORDPTRFS:[00000000],ECX

可以十分确信代码正在建立或撤除一个_try/_except块。现在知道了一个_try块对应着堆栈上的一个EXCEPTION_REGISTRATION结构体,那EXCEPTION_REGISTRATION里的回调函数呢?使用Win32的术语,异常回调函数对应着filter-expression代号。filter-expression就是关键字_except后括号中的代码。正是这个filter-expression代号决定了是否执行后面{}块中的代码。

上一页  5 6 7 8 9 10 

Tags:Structured Exception Handling

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接