【问题标题】:How can I enable DEP/NX and ASLR on a Delphi 2006 or earlier executable?如何在 Delphi 2006 或更早的可执行文件上启用 DEP/NX 和 ASLR?
【发布时间】:2011-12-25 08:39:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi c++builder


    【解决方案1】:

    设置 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 标志编辑选项。

    【讨论】:

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

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

    {$SetPEOptFlags $40} 在 Delphi2006 中工作

    【讨论】:

    • 我认为最好使用命名的 contant IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
    • Const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 在 D2006 中不可用,您必须自己定义。
    • @ArjenvanderSpek 是这样吗?将 Windows 添加到使用中不会使其可用吗?
    • @DavidHeffeman:刚刚(重新)尝试过,const 不可用,至少在我的 2006 版本中不可用
    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 2011-03-11
    • 1970-01-01
    • 2011-03-24
    • 2014-08-08
    • 2020-01-15
    相关资源
    最近更新 更多