Delphi 在C+中启用安全异常处理+;建设者

Delphi 在C+中启用安全异常处理+;建设者,delphi,windows-8,c++builder,seh,aslr,Delphi,Windows 8,C++builder,Seh,Aslr,对于Windows 8应用程序认证,除其他要求外,还有以下要求: 3.2必须使用/SafeSEH标志编译应用程序,以确保安全处理异常 3.3必须使用/NXCOMPAT标志编译应用程序,以防止数据执行 3.4您的应用程序必须使用地址空间布局随机化(ASLR)的/DYNAMICBASE标志进行编译 我无法找到如何在C++Builder XE中启用这两个选项 对于/NXCOMPAT和/DYNAMICBASE,可以使用VS中的editbin.exe或Cygwin中的peflags.exe。虽然我会对

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

  • 3.2必须使用
    /SafeSEH
    标志编译应用程序,以确保安全处理异常
  • 3.3必须使用
    /NXCOMPAT
    标志编译应用程序,以防止数据执行
  • 3.4您的应用程序必须使用地址空间布局随机化(ASLR)的
    /DYNAMICBASE
    标志进行编译
我无法找到如何在C++Builder XE中启用这两个选项

对于
/NXCOMPAT
/DYNAMICBASE
,可以使用VS中的
editbin.exe
或Cygwin中的
peflags.exe
。虽然我会对可能的副作用更有信心,但如果有一种天然的方法来实现这些作用的话


不管怎么说,我对
/SafeSEH
完全不知所措

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


您应该尝试说服C++Builder更新其编译器以支持SafeSEH。它从XP SP2开始就出现在Windows平台上,填补了一个相当严重的安全漏洞(x86中的堆栈上存在异常处理程序地址,只是等待缓冲区溢出将任何随机地址放入其中执行)

对于与
/NXCOMPAT
/DYNAMICBASE
相关的问题,我已经为C++ Builder链接器创建了一个请求来支持这些标志:

使用VisualC++中的<代码> EdgBiel.exe < /代码>不是一个理想的解决方案,它们的链接器需要本地支持这些标志。

<强>更新< /St>:这里已经为C++ Builder/Delphi运行时文件(DLLS/BPLS)创建了附加的请求,这些标志必须被设置为这些标志,以避免使用VisualC++中的EddiBin来设置它们:

当然Delphi XE2不生成可执行文件。我不需要检查,但我打赌不会。我认为你会运气不好,应该提交一份QC申请。实际上,结构化异常处理程序可能是安全的,但如果PE文件没有标记为安全的,那么这对您没有多大用处。您的64位应用程序将很好,但在CPPBuilder中这也是不可能的。