对于测试'崩溃',我需要一小段Delphi代码来查看操作系统如何在事件日志中记录DEP违规。
我找到了很多关于激活DEP的来源,但没有找到关于如何“触发”DEP违规的消息。
你有一个例子吗?
显示DEP vialotion在日志中的外观如何
答案 0 :(得分:10)
此代码完成工作:
procedure DoJump(Address: Pointer);
asm
JMP Address
end;
const
X: Byte=$C3;//RET op code
procedure TriggerDEP;
begin
DoJump(@X);
end;
在生成的可执行文件中,存储X
的位置被视为数据。作为替代方案,您可以尝试执行堆栈中的代码:
procedure DoJump(Address: Pointer);
asm
JMP Address
end;
procedure TriggerDEP;
var
X: Byte;
begin
X := $C3;
DoJump(@X);
end;
当DEP处于活动状态时,这两种情况都会引发访问冲突异常。
如果您需要确保DEP处于活动状态,例如从32位进程中可选,请调用此函数:
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;