设置 PE 标志
您可以使用{$SetPEOptFlags $40} 设置DEP 标志,使用{$SetPEOptFlags $100} 设置ASLR 标志。要同时设置两者,请使用{$SetPEOptFlags $140}。
如果您的 Delphi 版本在 Windows.pas 单元中有必要的定义,您可以使用更具可读性的版本:
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE }
通常在 .dpr 文件中包含 $SetPEOptFlags 设置。因此,您需要确保 Windows 位于 .dpr 文件的 uses 子句中,以便这些 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 标志编辑选项。