对于Windows 8应用程序认证,除其他外,还有以下要求:
/SafeSEH
标记进行编译,以确保安全的异常处理/NXCOMPAT
标志进行编译,以防止数据执行/DYNAMICBASE
标志进行编译以进行地址空间布局随机化(ASLR)我无法在C ++ Builder XE中找到如何启用其中任何一个。
对于/NXCOMPAT
和/DYNAMICBASE
,可以使用VS的editbin.exe
或Cygwin的peflags.exe
。虽然我对可能的副作用更有信心,但如果有本地方式来启用这些副作用。
无论如何,我对/SafeSEH
感到十分茫然。
答案 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