MS C++ 中的 Win32 结构化异常处理 - 将编译器代码映射到汇编代码

逆向工程 视窗 x86 C++ 例外
2021-07-02 09:50:10

我正在尝试通读 Matt Pietrek 的文章“关于 Win32 结构化异常处理深度的速成课程”链接here在标题为Compiler-level SEH的部分中,他写道:

既然您知道 _try 块对应于堆栈上的 EXCEPTION_REGISTRATION 结构,那么 EXCEPTION_REGISTRATION 中的回调函数呢?使用 Win32 术语,异常回调函数对应于过滤表达式代码。为了刷新您的记忆,过滤器表达式是 _except 关键字后括号中的代码。正是这个过滤器表达式代码决定了后续 {} 块中的代码是否会执行。

在这一点上,我有点困惑。一直以来,我一直认为回调函数就是要处理异常的函数,即_except块内的代码。请帮助我理解这一点。

另外,如果filter-expression 代码对应的是回调函数,那么filter-expression 后面的'{}' 里面的代码对应的是什么?

1个回答

在编译器级别的 SEH 的情况下,操作系统调用回调是编译器提供的函数,通常__except_handler3或类似的。调用后,它会检查堆栈、检索 trylevel、查找相应的范围表条目并调用异常过滤器 ( lpfnFilter)。如果过滤器返回非零值,lpfnHandler则调用处理程序 ( ) -是与__except/__finally内代码对应的代码有关特定示例,请在此处查看附录 I:http : //www.openrce.org/articles/full_view/21

请注意,与“简单”SEH 相比C++ EH使用了更复杂的方法来确保正确的语义(例如展开期间的自动对象销毁),因此映射回源代码并不那么容易,但可行(请参阅附录 II以上文章)。

顺便说一句,在最近的Visual Studio版本中,微软提供了几乎完全CRT源,包括实施__except_handlerN___CxxFrameHandler,所以你可以看看有太多(例如\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\eh\frame.cpp)。