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

9
2个回答

13

设置PE标志

您可以使用{$SetPEOptFlags $40}来设置DEP标志,使用{$SetPEOptFlags $100}来设置ASLR标志。要同时设置两者,请使用{$SetPEOptFlags $140}

如果您拥有Windows.pas单元中必要的定义版本的Delphi,则可以使用更易读的方式:

{$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标志设置ASLR。

修改非常旧版本Delphi的PE标志

旧版本的Delphi不支持$SetPEFlags$SetPEOptFlags。对于这些版本,您需要使用外部工具在构建后修改可执行文件。当我最初撰写这个答案时,我认为来自MS工具链的EDITBIN可以完成这项工作。对于DEP,使用/NXCOMPAT选项就足够了。对于ASLR,您需要使用其他PE标志编辑器。我的网络搜索显示cygwin的peflags可以胜任。

peflags --dynamicbase=true --nxcompat=true MyApp.exe

我相信还有其他PE标志编辑选项可用。

几点说明:Editbin.exe是Visual Studio的所有版本的一部分。所需的/nxcompat选项在VS 2008及更高版本中可用。请注意,在VS 2010的默认安装中,editbin.exe可能会引发与缺少dll相关的错误。我通过将dll复制到editbin.exe所在的目录中来解决了这个问题。 - Jonesome Reinstate Monica
@Jonesome 复制 DLL 文件并不是解决方案。使用 vcvarsall.bat 脚本或更现代的 setenv.cmd 脚本来设置必要的路径。 - David Heffernan
@DavidHeffernan 您是正确的,应该使用批处理文件...但复制dll确实有效...(我已经做过多次了...) - Jonesome Reinstate Monica
@Jonesome 我知道。我以前也是这样做的,直到我找到了官方的做法!;-) - David Heffernan

7
"

'{$DYNAMICBASE ON}'是Delphi2007中的新指令,'{$SETPEOPTFLAGS $40}'是现有的指令:info

{$SetPEOptFlags $40}在Delphi2006中可用。

"

我认为最好使用命名常量IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE - OnTheFly
常量IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE在D2006中不可用,您必须自行定义它。 - Arjen van der Spek
@ArjenvanderSpek 是这样吗?将Windows添加到uses中不会使其可用吗? - David Heffernan
1
@DavidHeffeman:刚刚重新尝试了一下,const不可用,至少在我2006版本中不可用。 - Arjen van der Spek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接