我正在尝试像example一样使用boost::asio::spawn函数,但是在Release中给我以下错误:



很明显,我应该在项目的设置中设置/SAFESEH:NO选项,但是我不知道这实际上会做什么。这如何影响程序中异常处理的行为(C++异常和SEH)?

顺便说一句,我正在使用MSVC-12.0。

最佳答案

简短答案:禁用SafeSEH将降低程序安全性

详细信息:SafeSEH是编译器保护。

在Windows环境中,SEH(Structured Exception Handler)记录的布局如下

Stack data (pointed by TEB - thread environment block)
|
|  I) Pointer to next SEH record II
|  EH pointer
|
|  II) Pointer to next SEH record III
|  EH pointer
|
|  0xFFFFFF
|  default EH (MSVCRT)

通常,基于SEH的攻击依赖于覆盖上述记录之一,并使应用程序引发异常:这会将控制流绕到您的代码中(我是而不是,考虑到此处的DEP/ASLR保护系统,因此,假设已知+ X位置)。更准确地说,它们经常“模拟EH返回”,并获取下一个“邪恶的”指针以跳转到shellcode。

SafeSEH的工作方式是指示操作系统在跳转到处理程序指针之前先检查其有效性(针对已知有效EH的表)。此过程有一些限制,在特殊情况下,应用程序可能仍然易受攻击,但基于SEH的攻击发生的可能性较小(或很难制造)。

当链接到非safeSEH编译模块时,链接器将无法生成EH位置的“受信任表”(它根本无法分辨这些位置和有效的EH),从而导致您遇到错误。

Windows OS工程上的一些后勤限制,兼容性原因以及与控制地址脱离已加载模块(和可执行镜像)范围有关的问题,导致选择默认情况下禁用此选项,并让用户选择是否启用是否。

如果您的应用程序非常需要安全性,并且您将上述情况称为潜在威胁,则应启用它并重新编译模块以使用它。

关于c++ - 什么是SAFESEH :NO option actually do,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25081033/

10-13 08:24