7

对于测试“崩溃”,我需要一小段 Delphi 代码来查看操作系统如何在事件日志中记录 DEP 违规。

我发现了很多关于激活 DEP 的资料,但没有找到关于如何“触发”违反 DEP 的资料。

你有一个例子吗?


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

显示 DEP vialotion 在日志中的外观

4

1 回答 1

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 处于活动状态时,这两个都会引发访问冲突异常。

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;
于 2012-06-21T08:20:06.867 回答