2012-06-21 11 views
7

Do testu "crash" potrzebuję małego kawałka kodu Delphi, aby zobaczyć, jak system operacyjny rejestruje naruszenie DEP w dzienniku zdarzeń.Kod przykładowy prosty egzekwowanie wykonywania danych Delphi

Znalazłem wiele źródeł o aktywacji DEP, ale nie o tym, jak "wyzwolić" naruszenie DEP.

Masz przykład?


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

pokazuje jak DEP vialotion powinien wyglądać w dzienniku

Odpowiedz

10

Ten kod dostaje zadanie:

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

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

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

w wygenerowanym wykonywalnego miejsce przechowywania X jest traktowane jako dane. Jako alternatywę można spróbować wykonywanie kodu znajdującego się na stosie:

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

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

obu tych naruszeń dostępu podbicie wyjątki kiedy DEP jest aktywny.

Jeśli chcesz się upewnić, że DEP jest aktywny, na przykład w procesie 32 bitowym, gdzie jest opcjonalne, nazywają tę funkcję:

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; 
Powiązane problemy