Должен ли я изменить свою базу изображений?

В Delphi параметр компоновщика База изображений по умолчанию - 00400000.

За помощью:

Задает предпочтительный адрес загрузки скомпилированного изображения. Это значение как правило, только при компиляции Библиотеки DLL. По умолчанию = 400000

Нет ли эффекта для его изменения на EXE? Каким был бы эффект? Является ли адрес относительно каждого процесса?

Ответ 1

Исполняемые изображения (EXE и DLL, а также другие элементы, которые скрывают DLL, например, BPL и OCX) загружаются загрузчиком ОС по их предпочтительному адресу загрузки (База изображений), если это возможно; если эта область виртуального адресного пространства зарезервирована для какой-либо другой цели (другое изображение, стек потоков, распределение кучи), тогда загрузчик ОС переместит изображение. Перемещение изображения связано с размещением его в другом месте в адресном пространстве, а затем с разницей между новым адресом загрузки и предпочтительным адресом загрузки и добавлением этой разницы в каждое исправление перемещения внутри изображения. Исправления привязки указывают на все места в исполняемом изображении, где код или данные ссылаются на себя, такие как значения загрузки кода из глобальных переменных или абсолютные переходы в другие процедуры.

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

Предпочтительным адресом для исполняемых изображений является $00400000 по соглашению в 32-разрядной Windows, а другие DLL (включая библиотеки DLL) полагаются на это соглашение, не имея адресов загрузки по умолчанию, которые могут совпадать с основным исполняемым файлом. Таким образом, они избегают перемещения. Фактически, перемещение EXE-изображения так редко выполняется, что данные перемещения часто могут быть удалены из изображений EXE без вреда.

Изменение его для DLL имеет смысл избежать противоречия с любой из стандартных DLL-систем OS и любых других DLL файлов, которые обычно поставляются с DLL/EXE. Поскольку изменение его для EXE увеличивает вероятность того, что ОС потребуется переместить DLL, не рекомендуется изменять адрес загрузки EXE.

Исполняемые компакторы изображений, такие как UPX, не рекомендуются для библиотек DLL, в частности, и для исполняемых файлов, которые могут иметь много экземпляров, -memory-декомпрессия действует как перемещение в предотвращении совместного использования образа в памяти между несколькими процессами.

Ответ 2

Изменить базу EXE-изображений почти бесполезно, если вы не делаете грязный хакер низкого уровня.

Является ли адрес относительно каждого процесса?

Да, каждый процесс имеет собственное адресное пространство.