在C ++ Builder中启用安全异常处理

时间:2012-06-25 20:00:46

标签: delphi windows-8 c++builder seh aslr

对于Windows 8应用程序认证,除其他外,还有以下要求:

  • 3.2您的应用必须使用/SafeSEH标记进行编译,以确保安全的异常处理
  • 3.3您的应用必须使用/NXCOMPAT标志进行编译,以防止数据执行
  • 3.4您的应用必须使用/DYNAMICBASE标志进行编译以进行地址空间布局随机化(ASLR)

我无法在C ++ Builder XE中找到如何启用其中任何一个。

对于/NXCOMPAT/DYNAMICBASE,可以使用VS的editbin.exe或Cygwin的peflags.exe。虽然我对可能的副作用更有信心,但如果有本地方式来启用这些副作用。

无论如何,我对/SafeSEH感到十分茫然。

2 个答案:

答案 0 :(得分:4)

首先,/ SafeSEH仅适用于x86,而不适用于x64或ARM。它要求您的编译器生成其他表,以指出出于安全原因被视为有效异常处理程序的函数地址。你自己可以做到这一点的机会很小,但是你需要在编译的汇编代码中查看fs:0异常处理链,并枚举所有在该链上推送的地址,然后按照此处的说明对其进行描述:http://msdn.microsoft.com/en-us/library/9a89h429(v=VS.80).aspx。您的代码实际上没有任何处理程序,并且它们全部都在C ++ Builder的运行时(如果运行时是一个单独的DLL,可能会很容易)。

您应该尝试说服C ++ Builder更新其编译器以支持SafeSEH。自XP SP2以来它一直存在于Windows平台中,并且插入了一个非常讨厌的安全漏洞(x86中的堆栈上存在异常处理程序地址,只是等待缓冲区溢出以将任何随机地址放在那里执行)

答案 1 :(得分:1)

对于与/NXCOMPAT/DYNAMICBASE相关的问题,我在此处创建了一个C ++ Builder链接器请求以支持这些标志:https://quality.embarcadero.com/browse/RSP-13072

使用Visual C ++中的editbin.exe几乎不是理想的解决方案,它们的链接器需要本地支持这些标志。

更新:此处已为C ++ Builder / Delphi运行时文件(DLL / BPL)创建了一个附加请求,以便在已设置这些标志的情况下进行分发,以避免必须使用EDITBIN Visual C ++自己设置:https://quality.embarcadero.com/browse/RSP-13231