#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