Delphi 2007 (and newer) supports通过以下三种技术中的任何一种启用DEP和ASLR:
–dynamicbase
{$DYNAMICBASE ON}
添加到源代码{$SETPEOPTFLAGS $40}
我希望能够使用Delphi 2006和C ++ Builder 2006(又名BDS 2006)做同样的事情。有谁知道怎么做?
答案 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