7

「クラッシュ」をテストするには、オペレーティング システムがイベント ログに DEP 違反を記録する方法を確認するために、小さな Delphi コードが必要です。

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 がアクティブな場合にアクセス違反の例外を発生させます。

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