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

         

Когда программа не будет работать и как этого избежать


Если защищенный модуль не смог загрузиться по адресу Image Base (Project Options -> Linker), то выполнение защищенного кода с вероятностью 100% вызовет Access Violation. Это связано с тем, что при невозможности загрузки по указанному в Image base адресу, модуль загружается в другое место, а адреса всех переменных внутри кода с помощью Relocation Table изменяются на соответствующую дельту. Но в зашифрованном коде они остались прежними, и любое обращение к ним окажется некорректным.

Поэтому лучше не рисковать, а позаботиться о загрузке в нужное место.

Во всех 32-разрядных Windows доступное адресное пространство процесса составляет диапазон от $00400000 ($00010000 в NT) до $7FFEFFFF ($BFFEFFFF в Win2000/3gb). Соответственно только по этим адресам и может быть загружен пользовательский модуль (программа или библиотека). Загрузчик вначале пытается выделить модулю непрерывное адресное пространство нужного размера, начиная с адреса Image Base, и, если это не удается и в модуле присутствует Relocation Table, то модулю выделяется первое свободное место, а адреса вызовов внутри него пересчитываются. Это вызывает неоправданно высокую нагрузку на процессор и страничный файл, а также влияет на CRC загруженного модуля.

Чтобы избежать такой перезагрузки нужно задать модулю такой предпочтительный адрес, где в момент загрузки "будет свободно". Такая загрузка происходит намного быстрее, именно поэтому все системные библиотеки имеют уникальный предпочтительный адрес загрузки, а задание таких адресов в пользовательских библиотеках - одно из правил "хорошего тона". Кроме того, можно удалить Relocation Table - модуль станет немного меньше и вообще не сможет загрузиться по чужому адресу. Но в Delphi эта опция отсутствует.



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