Delphi的简单数据执行保护示例代码

时间:2012-06-21 08:10:56

标签: delphi data-execution-prevention

对于测试'崩溃',我需要一小段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在日志中的外观如何

1 个答案:

答案 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;