2012-06-21 4 views
7

Für einen Test "Absturz" brauche ich ein kleines Stück Delphi-Code, um zu sehen, wie das Betriebssystem die DEP-Verletzung im Ereignisprotokoll protokolliert.Beispielcode für einfache Datenausführungsverhinderung für Delphi

Ich habe viele Quellen zum Aktivieren der DEP gefunden, aber nicht zum Auslösen einer DEP-Verletzung.

Haben Sie ein Beispiel?


Verwandte Frage: https://serverfault.com/questions/130716/if-dep-has-stopped-an-app-is-there-a-possibility-to-see-this-events-in-a-log

zeigt, wie ein DEP vialotion wie

im Protokoll aussehen sollte

Antwort

10

Dieser Code bekommt den Job getan:

procedure DoJump(Address: Pointer); 
asm 
    JMP Address 
end; 

const 
    X: Byte=$C3;//RET op code 

procedure TriggerDEP; 
begin 
    DoJump(@X); 
end; 

In der generierten ausführbaren, die Der Speicherort, an dem X gespeichert ist, wird als Daten behandelt. Als Alternative können Sie versuchen, Code auf dem Stack befindet Ausführung:

Ausnahmen
procedure DoJump(Address: Pointer); 
asm 
    JMP Address 
end; 

procedure TriggerDEP; 
var 
    X: Byte; 
begin 
    X := $C3; 
    DoJump(@X); 
end; 

Beide dieser Erhöhung Zugriffsverletzung, wenn DEP aktiviert ist.

Wenn Sie sicherstellen müssen, dass DEP aktiv ist, beispielsweise von einem 32-Bit-Prozess, in dem es optional ist, rufen Sie diese Funktion:

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 
    SetProcessDEPPolicy(PROCESS_DEP_ENABLE); 
    end; 
end;