Ich habe mich auch in letzter Zeit mit diesem Thema beschäftigt. Die einfachste Möglichkeit ist, die Compiler-Direktive {$SetPEOptFlags $0140} (am besten im Projekt-Quelltext) zu verwenden - dies setzt den DllCharacteristics-Wert des Optional
PE Headers (
Siehe MSDN). $0100 heißt IMAGE_DLLCHARACTERISTICS_NX_COMPAT (aktiviert DEP), $0040 heißt IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (aktiviert ASLR). Das funktioniert sogar in älteren Delphi-Versionen (ich weiß nicht seit wann es SetPEOptFlags gibt, aber in Turbo Delphi funktioniert's problemlos).
Das Ganze hat leider einen Haken: diese Flags werden nur unter Vista und 7 ausgewertet, unter XP nicht. Das heißt, unter XP (ab
SP2) entscheidet das System, welcher Prozess DEP kriegt und welcher nicht - außer das Programm benutzt die Funktion SetProcessDEPPolicy. Diese Funktion gibt es leider aber erst ab XP
SP3 (und in Vista erst ab SP1). Um DEP auch unter XP SP2 nutzen zu können, kann man es wie der Chromium-Browser machen: die rufen die undokumentierte Funktion NtSetInformationProcess mit den Parametern ProcessExecuteFlags= PROCESS_INFORMATION_CLASS=$22 und ProcessInformation=MEM_EXECUTE_OPTION_PERMANENT | MEM_EXECUTE_OPTION_ENABLE=$9 auf (Quellcode zu sehen bei
Google Code Search).
ASLR gibt's unter XP übrigens gar nicht, erst unter Vista.