Delphi 2007 (and newer) supports通过以下三种技术中的任何一种启用 DEP 和 ASLR:
- 使用 dcc32 编译时添加命令行开关
–dynamicbase
- 将预处理器命令
{$DYNAMICBASE ON}
添加到源代码 - 在 header 中的位中手动或,与源代码中的
{$SETPEOPTFLAGS $40}
我希望能够使用 Delphi 2006 和 C++ Builder 2006(又名 BDS 2006)做同样的事情。有谁知道该怎么做吗?
最佳答案
设置 PE 标志
您可以使用 {$SetPEOptFlags $40}
设置 DEP 标志,使用 {$SetPEOptFlags $100}
设置 ASLR 标志。要设置两者,请使用 {$SetPEOptFlags $140}
。
如果您有一个在 Windows.pas 单元中具有必要定义的 Delphi 版本,您可以使用更具可读性的:</p>
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE }
通常,您可以在 .dpr 文件中包含 $SetPEOptFlags
设置。因此,您需要确保 .dpr 文件中的 Windows
使用子句,以便这些 IMAGE_XXX
常量可用。
在运行时设置 DEP 策略
对于不支持基于 PE 标志的方法的版本,您可以在应用初始化的早期调用此函数:
procedure EnableDEP;
const
PROCESS_DEP_ENABLE: DWORD=$00000001;
var
SetProcessDEPPolicy: function(dwFlags: DWORD): BOOL; stdcall;
begin
SetProcessDEPPolicy := GetProcAddress(GetModuleHandle(kernel32),
'SetProcessDEPPolicy');
if Assigned(SetProcessDEPPolicy) then begin
//don't bother checking for errors since we don't need to know if it fails
SetProcessDEPPolicy(PROCESS_DEP_ENABLE);
end;
end;
这适用于任何版本的 Delphi。
您无法在运行时设置 ASLR 标志,因为它会影响模块的加载方式。因此 ASLR 只能使用 PE 标志来设置。
修改非常旧版本的 Delphi 的 PE 标志
旧版本的 Delphi 不支持 $SetPEFlags
和 $SetPEOptFlags
。对于此类版本,您需要使用外部工具来修改可执行的构建后。当我最初写这个答案时,我假设 MS 工具链中的 EDITBIN
可以完成这项工作。对于 DEP,使用 /NXCOMPAT
选项就足够了。对于 ASLR,您将需要使用不同的 PE 标志编辑器。我的网络搜索显示来自 cygwin 的 peflags
。
peflags --dynamicbase=true --nxcompat=true MyApp.exe
我确信还有其他可用的 PE 标志编辑选项。
关于delphi - 如何在 Delphi 2006 或更早版本的可执行文件上启用 DEP/NX 和 ASLR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8066266/