![]() |
Data Execution Prevention (DEP) aktivieren
Da bei älteren Delphi-Versionen die
![]()
Delphi-Quellcode:
function ActiveDEP: Cardinal;
const OptIn: Byte = 2; PROCESS_DEP_ENABLE = 1; var Info: TOSVersionInfo; SetProcessDEPPolicy: function (dwFlags: dword): Boolean; stdcall; GetSystemDEPPolicy: function: Word; stdcall; nStatus: Word; h :HINST; begin Result := S_FALSE; ZeroMemory(@Info, SizeOf(TOSVersionInfo)); Info.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); // Wir benötigen mind. Windows XP SP3 if Windows.GetVersionEx(Info) and (Info.dwMajorVersion >= 6) or ((Info.dwMajorVersion = 5) and (Info.dwMinorVersion = 1) and (lstrcmpi(Info.szCSDVersion, 'Service Pack 3') = 0)) then begin h := SafeLoadLibrary('Kernel32.dll', SEM_NOOPENFILEERRORBOX); nStatus := OptIn; // Den aktuellen systemweiten Status der Datenausführungsverhinderung (DEP) abfragen if (h <> 0) then begin @GetSystemDEPPolicy := GetProcAddress(h, 'GetSystemDEPPolicy'); FreeLibrary(h); nStatus := GetSystemDEPPolicy(); end; // Wenn der Staus auf OptIn (=2) steht, dann kann DEP für den aktuelle Prozess aktviert werden if (nStatus = OptIn) then begin h := SafeLoadLibrary('Kernel32.dll', SEM_NOOPENFILEERRORBOX); if (h <> 0) then begin @SetProcessDEPPolicy := GetProcAddress(h, 'SetProcessDEPPolicy'); FreeLibrary(h); if not SetProcessDEPPolicy(PROCESS_DEP_ENABLE) then Result := GetLastError else Result := S_OK; end; end; end else Result := ERROR_OLD_WIN_VERSION; end; |
AW: Data Execution Prevention (DEP) aktivieren
Danke für den Code. :thumb: War vor ein paar Tagen auch auf der Suche ...
Zitat:
Und hast du dich evtl. auch schon bezüglich ![]() |
AW: Data Execution Prevention (DEP) aktivieren
Zitat:
und b) selbst viele windowseigene DLLs den selben Adressraum belegen. Kein Wunder daß da viele DLLs verschoben werden müssen und dadurch auch nicht unbedingt immer am selben Platz liegen :wall: |
AW: Data Execution Prevention (DEP) aktivieren
Zitat:
Zitat:
Edit: Ich habe die Funktion ein wenig überarbeitet, so dass jetzt im Fehlerfall der Wert von GetLastError zurückgeliefert wird. Damit kann man dann auch mehr anfangen als mit True/False ;) |
AW: Data Execution Prevention (DEP) aktivieren
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 (
![]() 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 ![]() ASLR gibt's unter XP übrigens gar nicht, erst unter Vista. |
AW: Data Execution Prevention (DEP) aktivieren
Zitat:
|
AW: Data Execution Prevention (DEP) aktivieren
Zitat:
|
AW: Data Execution Prevention (DEP) aktivieren
Zitat:
|
AW: Data Execution Prevention (DEP) aktivieren
Der Code-Speicher dürfte doch als CopyOnWrite definiert sein ... wenn sich da alles Verschiebt, müssen überall die Adressen geändert werden und dann hätte jeder Prozess seine eigene DLL-Version.
Bei vielen DLLs läppert sich das und Speicher muß man doch nicht unbedingt verschwenden. Und dieses ASLR würde das dann noch verschlimmern. :? Wird das eigentlich auf alle DLLs angewendet oder läßt sich dieses nur auch "wichtige" DLLs beschränken? Aber notfalls läßt sich das auch bei dynamisch geladene DLLs selber etwas machen oder man bastelt sich selber einen EXE/DLL-Loader (sowas wie bei UPX) und das würde dann auch unter XP und Co. laufen. |
AW: Data Execution Prevention (DEP) aktivieren
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz