Delphi 2007(及更高版本)支持以下三种技术之一启用DEP和ASLR:
- 在使用dcc32编译时添加命令行开关
-dynamicbase
- 在源代码中添加预处理命令
{$DYNAMICBASE ON}
- 手动将PE头文件中的位设置为
{$SETPEOPTFLAGS $40}
我希望能够在Delphi 2006和C ++ Builder 2006(又名BDS 2006)中做到同样的事情。有人知道怎么做吗?
Delphi 2007(及更高版本)支持以下三种技术之一启用DEP和ASLR:
-dynamicbase
{$DYNAMICBASE ON}
{$SETPEOPTFLAGS $40}
我希望能够在Delphi 2006和C ++ Builder 2006(又名BDS 2006)中做到同样的事情。有人知道怎么做吗?
设置PE标志
您可以使用{$SetPEOptFlags $40}
来设置DEP标志,使用{$SetPEOptFlags $100}
来设置ASLR标志。要同时设置两者,请使用{$SetPEOptFlags $140}
。
如果您拥有Windows.pas单元中必要的定义版本的Delphi,则可以使用更易读的方式:
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE }
$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
'{$DYNAMICBASE ON}'是Delphi2007中的新指令,'{$SETPEOPTFLAGS $40}'是现有的指令:info
{$SetPEOptFlags $40}在Delphi2006中可用。
"IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
。 - OnTheFly