Установка флагов 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.