Поскажите, пожалуйста, в каких случаях ЕХЕ-файл будет загружен по адресу, отличным от базового адреса (ImageBase), указанного в PE заголовке!
EXE, пожалуй, ни в каких. Перемещение базы происходит в том случае, если по указанному адресу уже что-то лежит, т.е. память выделена под другой образ. В случае с Dll это случается часто, т.к. Dll обычно загружается множество и у них могут совпасть базовые адреса или они могут перекрыть друг друга, а EXE получает адресное пространство чистым, так что в пределах дозволенного диапазона загрузке не может ничего помешать. В литературе говорят, что такой случай, когда по адресу загрузки уже что-то лежит, возможен теоретически, но лично я никогда не сталкивался. Если, вдруг, такое случится, то, скорее всего, образ не будет загружен. В Dll есть специальная таблица релокации, которая корректирует все адреса, если модуль грузится не по указанному адресу, а в Exe эту таблицу обычно никто не делает и, следовательно, адреса не будут скорректированы.
В случае если базовый адрес записанный в заголовке уже занят, такое имеет место быть в win98 с exe собранными с Image Base < 0x400000
IceStudent И какому молодцу придет в голову грузить exe через LoadLibrary? Хотя, интересная тема.. Сделать в ехе директорию экспорта, наэкспортить функций всяких. Имеем динамическую библиотеку с возможностью самодостаточного запуска. Основной код ехе делает какие-то простенькие вещи через свои функции, а любой сторонний разработчик может использовать эти функции в своих прогах. Один минус - куча лишнего кода.
n0p Когда кому-то захочется выдрать оттуда ресурсы, например. Или ещё чего. А здесь уже пробегала такая тема. И пример кода был.