Почему адрес PE ImageBase изменяется в памяти?
Я реверсирую вредоносный 32-битный исполняемый файл Windows x86. Статически просматривая заголовки PE в Ghidra, я вижу, что ImageBase
он установлен 0x400000
как ожидалось. Однако, когда двоичный файл загружается в память, начальный RVA не соответствует ImageBase
определенному в файле. Например, я видел, что базовый адрес в памяти установлен на 0x4B0000
и 0x900000
. Такое поведение наблюдается на чистой виртуальной машине и при отладке с помощью Immunity и x32dbg, а также IDA Free.
Насколько я понимаю, загрузчик Windows считывает ImageBase
и использует это смещение, чтобы начать отображение разделов в виртуальное адресное пространство. Поскольку системный код обрабатывает загрузку, и моя система чиста при первом запуске, я предполагаю, что необычное ImageBase
является признаком нюанса загрузчика, а не вмешательства. Я никогда не сталкивался с таким сценарием и был бы признателен за любые идеи.
MD5: 1f63d04ee95ea041f2f6b1e818d94a7c
SHA1: 823ad6abb05f2393c44cf4b7f1d00e32ac04d1d1
ImageBase
установлено 0x400000
при просмотре заголовков PE в Ghidra:

ImageBase
в отображенном в память PE header ( 0x4B0000
) не соответствует ImageBase
заданному в статическом файле:

Разделы PE отображаются в память с помощью ImageBase
at0x4B0000

Ответы
Это просто предпочтительный адрес. Windows может загрузить двоичный файл практически по любому адресу и переустановить его в это новое место.
ImageBase: предпочтительный адрес первого байта изображения при загрузке в память; должно быть кратно 64 К. Значение по умолчанию для DLL - 0x10000000. По умолчанию для Windows CE EXE установлено 0x00010000. По умолчанию для Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 и Windows Me установлено значение 0x00400000.
Источник: MSDN