設置PE標誌
您可以使用{$SetPEOptFlags $40}
設置DEP標誌,{$SetPEOptFlags $100}
設置ASLR標誌。要同時設置使用{$SetPEOptFlags $140}
。
如果您在Windows.pas單位有必要的定義版本的Delphi您可以使用更可讀:
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE }
通常用戶在使用.dpr文件$SetPEOptFlags
設置。因此,您需要確保Windows
位於.dpr文件使用子句中,這些常量可用於這些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;
這將爲任何版本的德爾福。
您不能在運行時設置ASLR標誌,因爲它會影響模塊的加載方式。所以ASLR只能使用PE標誌來設置。
很老版本的Delphi
舊版本的Delphi的修改PE標誌不支持$SetPEFlags
和$SetPEOptFlags
。對於這樣的版本,您需要使用外部工具來修改可執行的後期構建。當我最初寫這個答案時,我認爲來自MS工具鏈的EDITBIN
可以完成這項工作。對於DEP來說,使用/NXCOMPAT
選項就足夠了。對於ASLR,您需要使用不同的PE標誌編輯器。我的網絡搜索顯示來自cygwin的peflags
。
peflags --dynamicbase=true --nxcompat=true MyApp.exe
我確定還有其他PE標誌編輯選項可用。
這很有效。謝謝! – Mick
editbin鏈接被破壞 – OnTheFly
幾個註釋:Editbin.exe是所有版本的Visual Studio的一部分。所需的/ nxcompat選項在VS 2008及更高版本中。請注意,在VS 2010的股票安裝中,editbin.exe可能會拋出與丟失dll有關的錯誤。我解決了這個問題,只需將dll複製到editbin.exe所在的目錄即可。 – Jonesome