对于测试“崩溃”,我需要一小段 Delphi 代码来查看操作系统如何在事件日志中记录 DEP 违规。
我发现了很多关于激活 DEP 的资料,但没有找到关于如何“触发”违反 DEP 的资料。
你有一个例子吗?
显示 DEP vialotion 在日志中的外观
对于测试“崩溃”,我需要一小段 Delphi 代码来查看操作系统如何在事件日志中记录 DEP 违规。
我发现了很多关于激活 DEP 的资料,但没有找到关于如何“触发”违反 DEP 的资料。
你有一个例子吗?
显示 DEP vialotion 在日志中的外观
这段代码完成了工作:
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 处于活动状态时,这两个都会引发访问冲突异常。
If you need to make sure that DEP is active, for example from a 32 bit process where it is optional, call this function:
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;