Безопасность в Дельфи


По какому правилу выбирать адреса Image base?


Адрес по умолчанию, задаваемый в Delphi - $00400000. По этому адресу без проблем загрузится исполняемый модуль (если только ему не помешает какой-нибудь недобросовестный Hook). Но если речь идет о библиотеке, то адрес с вероятностью 100% уже занят исполняемым модулем, подгружающим данную библиотеку (и ранее подгруженными библиотеками). Более того, кроме страниц занятых кодом, почти наверняка окажется занят кусок памяти, распределенный под кучу и локальные переменные, так что вычислить заранее первое свободное место практически невозможно.

Поэтому для библиотек лучше всего искать место вниз от самого верхнего адреса ($7FFEFFFF). Но, как правило, там тоже уже занято (крайние верхние пользовательские адреса, в частности, используют OLE32.DLL, COMDLG32.DLL, SHELL32.DLL и т.д.). Более того, если речь идет о пакетах (BPL), то начиная с адреса $40000000 место занимают "системные" пакеты Borland (VCL50.BPL, VCLX50.BPL и т.д.).

Достаточно свободного места "вокруг" $50000000 и $60000000, "ниже" $70000000 и $40000000. В общем, если состав модулей используемых программой заранее известен, то все ее защищаемые модули без проблем размещаются по уникальным адресам. Если же пишется плагин, который будет работать неизвестно в каком составе, остается выбрать адрес наудачу или иметь несколько вариантов.

Следует также учитывать размер, занимаемый модулем - он немного больше размера файла, его можно посмотреть с помощью прилагаемой утилиты. При установке защиты размер несколько увеличится - в зависимости от сложности API шифрования (для GUARDANT это около 40 кб), и количества защищаемых мест в модуле.

И последнее правило: адрес загрузки кратен 64кб, то есть это число с 4 шестнадцатеричными нулями в конце.
Где задаются предпочтительные адреса загрузки?

Если проект компилируется в IDE, то адрес загрузки берется из опций проекта. Компилятор DCC32.EXE этих опций не использует, и если явно не задать в тексте проекта, этот адрес окажется равным $00010000. Поэтому в коде проекта всех защищаемых модулей надо явно указать нужный адрес, а именно: в файле проекта .DPR вставить строку вида {$IMAGEBASE $00400000} для приложений и {$IMAGEBASE $3FFA0000} (или другой уникальный адрес) для библиотек.



Содержание  Назад  Вперед