Как включить DEP / NX и ASLR в исполняемом файле Delphi 2006 или более ранней версии? - PullRequest
8 голосов
/ 09 ноября 2011

Delphi 2007 (и новее) поддерживает включение DEP и ASLR с помощью любого из этих трех методов:

  • добавьте параметр командной строки –dynamicbase при компиляции с dcc32
  • добавить команду препроцессора {$DYNAMICBASE ON} к исходному коду
  • вручную или в бит в заголовке, с {$SETPEOPTFLAGS $40} в исходном коде

I 'Я хотел бы иметь возможность делать то же самое с Delphi 2006 и C ++ Builder 2006 (он же BDS 2006).Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

10 голосов
/ 09 ноября 2011

Установка флагов PE

Вы можете использовать {$SetPEOptFlags $40} для установки флага DEP и {$SetPEOptFlags $100} для установки флага ASLR.Для настройки обоих используйте {$SetPEOptFlags $140}.

Если у вас есть версия Delphi с необходимыми определениями в модуле Windows.pas, вы можете использовать гораздо более удобочитаемый текст:

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT or
    IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE }

Обычно вывключите параметр $SetPEOptFlags в файл .dpr.И поэтому вам нужно убедиться, что Windows в файле .dpr использует предложение для доступности этих IMAGE_XXX констант.

Установить политику DEP во время выполнения

Для версий, которые не поддерживают подходы на основе флагов PE, вы можете вызвать эту функцию на ранней стадии инициализации приложения:

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
    //don't bother checking for errors since we don't need to know if it fails
    SetProcessDEPPolicy(PROCESS_DEP_ENABLE);
  end;
end;

Это будет работать для любой версии Delphi.

Вы не можетеустановите флаг ASLR во время выполнения, поскольку он влияет на загрузку модуля.Таким образом, ASLR может быть установлен только с использованием флагов PE.

Изменение флагов PE для очень старых версий Delphi

Более старые версии Delphi не поддерживают $SetPEFlags и $SetPEOptFlags.Для таких версий вам нужно использовать внешний инструмент для изменения исполняемого файла после сборки.Когда я изначально писал этот ответ, я предполагал, что EDITBIN из цепочки инструментов MS сделает эту работу.Для DEP этого будет достаточно, используя опцию /NXCOMPAT.Для ASLR вам нужно использовать другой редактор флагов PE.Мой веб-поиск показал peflags от cygwin.

peflags --dynamicbase=true --nxcompat=true MyApp.exe

Я уверен, что есть другие доступные варианты редактирования флага PE.

6 голосов
/ 09 ноября 2011

‘{$ DYNAMICBASE ON} 'является новым в Delphi2007,, {$ SETPEOPTFLAGS $ 40}' было существующей директивой: info

{$ SetPEOptFlags $ 40} работает в Delphi2006

...