Пример кода для предотвращения простого выполнения данных для Delphi

Для теста "сбой" мне нужен небольшой фрагмент кода 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 в журнале

1 ответ

Решение

Этот код выполняет свою работу:

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;
Другие вопросы по тегам