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

#delphi #c builder

#дельфы #c builder #delphi

Вопрос:

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

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

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

Ответ №1:

Установите 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 file uses есть предложение для того, чтобы эти 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.

Комментарии:

1. Пара замечаний: Editbin.exe является частью всех версий Visual Studio. Необходимый параметр / nxcompat доступен в версиях 2008 и выше. Обратите внимание, что при стандартной установке VS 2010, editbin.exe может вызывать ошибки, связанные с отсутствующими библиотеками DLL. Я решил эту проблему, просто скопировав библиотеки DLL в каталог, где editbin.exe сохраняется.

2. @Jonesome Копирование DLL-файлов не является решением. Используйте скрипт vcvarsall.bat или более современный скрипт setenv.cmd для настройки необходимых путей.

3. @DavidHeffernan Вы правы, следует использовать bat-файл… но копирование DLL-файлов действительно работает … (я делал это более одного раза …)

4. @Jonesome Я знаю. Раньше я тоже так делал, пока не разработал официальный способ сделать это! 😉

Ответ №2:

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

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

Комментарии:

1. Я думаю, что лучше использовать именованный компонент IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE

2. Const IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE недоступен в D2006, вы должны определить его самостоятельно.

3. @ArjenvanderSpek Это так? Разве добавление Windows в uses не делает его доступным?

4. @DavidHeffeman: только что (повторно) попробовал, const недоступен, по крайней мере, не в моей версии 2006