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

标签 delphi c++builder

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/

相关文章:

delphi - firemonkey idTcp 和记录

delphi - 带有平面按钮且没有计算器的数值编辑控件

c++builder - 如何从 Borland C++ 应用程序打开 HTMLHelp (.chm) 文件

delphi - CBuilder 中的 HTTP 服务器

delphi - 更改复选框状态而不调用 OnClick 事件

delphi - 如何在Delphi中将2个字节转换为一个16位数字?

delphi - 从 IShellLibrary 添加、删除文件夹

delphi - REST Datasnap 覆盖 URI 映射

delphi - 从 TListbox 移动到 TStringGrid 的数据错误

c++ - 警告 C4238 : nonstandard extension used : class rvalue used as lvalue