2012-06-21 35 views
7

Để kiểm tra 'sự cố', tôi cần một đoạn mã Delphi nhỏ để xem cách hệ điều hành ghi lại vi phạm DEP trong bản ghi sự kiện.Mã ví dụ phòng thí nghiệm thực thi dữ liệu đơn giản cho Delphi

Tôi đã tìm thấy nhiều nguồn xung quanh kích hoạt DEP nhưng không tìm thấy cách 'kích hoạt' vi phạm DEP.

Bạn có ví dụ không?


câu hỏi liên quan: https://serverfault.com/questions/130716/if-dep-has-stopped-an-app-is-there-a-possibility-to-see-this-events-in-a-log

cho thấy cách một vialotion DEP sẽ giống như trong nhật ký

Trả lời

10

Mã này được công việc làm:

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

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

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

Trong tạo thực thi, các vị trí nơi lưu trữ X được coi là dữ liệu. Thay vào đó, bạn có thể thử thực thi mã nằm trên ngăn xếp:

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

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

Cả hai trường hợp này đều tăng ngoại lệ vi phạm quyền truy cập khi DEP hoạt động.

Nếu bạn cần phải chắc chắn rằng DEP đang hoạt động, ví dụ từ một quá trình 32 bit mà nó là không bắt buộc, gọi hàm này:

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; 
Các vấn đề liên quan