2011-11-09 37 views

回答

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設置。因此,您需要確保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標誌編輯選項可用。

+0

這很有效。謝謝! – Mick

+0

editbin鏈接被破壞 – OnTheFly

+0

幾個註釋:Editbin.exe是所有版本的Visual Studio的一部分。所需的/ nxcompat選項在VS 2008及更高版本中。請注意,在VS 2010的股票安裝中,editbin.exe可能會拋出與丟失dll有關的錯誤。我解決了這個問題,只需將dll複製到editbin.exe所在的目錄即可。 – Jonesome

6

'{$ DYNAMICBASE ON}' 是在Delphi2007新的, '{$ SETPEOPTFLAGS $ 40}' 是現有的指令:info

{$ SetPEOptFlags $ 40}工作在Delphi2006

+0

我認爲它更好地使用命名contant' IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE' – OnTheFly

+0

const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE在D2006中不可用,您必須自定義它。 –

+0

@ArjenvanderSpek是這樣嗎?不添加Windows使用使它可用? –

相關問題