gpt4 book ai didi

delphi - 如何在 Delphi 2006 或更早版本的可执行文件上启用 DEP/NX 和 ASLR?

转载 作者:行者123 更新时间:2023-12-03 14:46:02 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com