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

13

对于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
当然,Delphi XE2不会生成带有安全异常处理程序表的可执行文件。我没有CPPBuilder来检查,但我敢打赌不会。我认为你会很倒霉,应该提交一个QC请求。实际上,结构化异常处理程序可能是安全的,但如果PE文件没有标记,那对你也没什么用。你的64位应用程序将是好的,但在CPPBuilder中还不可能。 - David Heffernan
2个回答

5

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

您应该尝试说服C++Builder更新他们的编译器以支持SafeSEH。它已经存在于Windows平台上自XP SP2以来了,并且解决了一个相当严重的安全漏洞(在x86上,异常处理程序地址存在于堆栈中,只等待缓冲区溢出将任何随机地址放置在那里即可执行)。


1
针对与/NXCOMPAT/DYNAMICBASE相关的问题,我已在此处为C++ Builder链接器创建了支持这些标志的请求:https://quality.embarcadero.com/browse/RSP-13072 使用来自Visual C++的editbin.exe并不是一个理想的解决方案,他们的链接器需要本地支持这些标志。 更新:在此处创建了另一个请求,要求C++ Builder / Delphi运行时文件(DLLs/BPLs)已经设置了这些标志,以避免必须使用来自Visual C++的EDITBIN来设置它们:https://quality.embarcadero.com/browse/RSP-13231

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接