【问题标题】:Enable Safe Exception Handling in C++ Builder在 C++ Builder 中启用安全异常处理
【发布时间】:2012-06-27 03:06:50
【问题描述】:

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

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

我无法找到如何在 C++Builder XE 中启用这些。

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

无论如何,我对/SafeSEH 完全不知所措。

【问题讨论】:

  • 当然 Delphi XE2 不会生成带有 Safe Exception Handler Tables 的可执行文件。我没有 CPPBuilder 来检查,但我敢打赌。我认为您将不走运,应该提交 QC 请求。实际上,结构化异常处理程序可能是安全的,但如果 PE 文件没有标记为这样,那对您来说并没有多大用处。您的 64 位应用程序会很好,但在 CPPBuilder 中这也是不可能的。

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


【解决方案1】:

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

在 Visual C++ 中使用 editbin.exe 并不是一个理想的解决方案,它们的链接器需要原生支持这些标志。

更新:这里创建了一个附加请求,要求 C++ Builder/Delphi 运行时文件 (DLLs/BPLs) 已设置这些标志,以避免使用 EDITBIN Visual C++ 自行设置:https://quality.embarcadero.com/browse/RSP-13231

【讨论】:

    【解决方案2】:

    首先,/SafeSEH 仅适用于 x86,不适用于 x64 或 ARM。它要求您的编译器生成额外的表来指示出于安全原因被视为有效异常处理程序的函数地址。您自己执行此操作的可能性很小,但这需要您查看编译的汇编代码中的fs:0 异常处理链并枚举该链上曾经推送的所有地址,然后按照此处记录的方式描述它们:@ 987654321@。您的代码实际上没有任何处理程序的可能性很小,而且它们都在 C++Builder 的运行时中(如果运行时是一个单独的 DLL,可能会很容易)。

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

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2011-10-28
      • 1970-01-01
      • 2018-03-06
      • 2017-01-16
      • 2011-05-20
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      相关资源
      最近更新 更多