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

时间:2011-11-09 14:12:28

标签: delphi c++builder

Delphi 2007 (and newer) supports通过以下三种技术中的任何一种启用DEP和ASLR:

  • 在使用dcc32
  • 进行编译时添加命令行开关–dynamicbase
  • 将预处理程序命令{$DYNAMICBASE ON}添加到源代码
  • 手动或在标题中的位中使用源代码中的{$SETPEOPTFLAGS $40}

我希望能够使用Delphi 2006和C ++ Builder 2006(又名BDS 2006)做同样的事情。有谁知道怎么做?

2 个答案:

答案 0 :(得分:10)

设置PE标记

您可以使用{$SetPEOptFlags $40}设置DEP标志,使用{$SetPEOptFlags $100}设置ASLR标志。设置两者都使用{$SetPEOptFlags $140}

如果你有一个带有Windows.pas单元中必要定义的Delphi版本,你可以使用更具可读性:

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or
    IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE }

通常,您在.dpr文件中包含$SetPEOptFlags设置。因此,您需要确保{。{1}}在.dpr文件中使用子句,以使这些Windows常量可用。

在运行时设置DEP策略

对于不支持基于PE标记的方法的版本,您可以在应用初始化时尽早调用此函数:

IMAGE_XXX

这适用于任何版本的Delphi。

您无法在运行时设置ASLR标志,因为它会影响模块的加载方式。因此,只能使用PE标志设置ASLR。

为旧版本的Delphi修改PE标志

较早版本的Delphi不支持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; $SetPEFlags。对于此类版本,您需要使用外部工具来修改可执行的后期构建。当我最初写这个答案时,我假设MS工具链中的$SetPEOptFlags可以完成这项工作。对于DEP,使用EDITBIN选项就足够了。对于ASLR,您需要使用不同的PE标志编辑器。我的网络搜索显示来自cygwin的/NXCOMPAT

peflags

我确定还有其他PE标志编辑选项。

答案 1 :(得分:6)

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

{$ SetPEOptFlags $ 40}适用于Delphi2006