Почему адрес PE ImageBase изменяется в памяти?

Aug 17 2020

Я реверсирую вредоносный 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 отображаются в память с помощью ImageBaseat0x4B0000

Ответы

7 PawełŁukasik Aug 17 2020 at 12:44

Это просто предпочтительный адрес. Windows может загрузить двоичный файл практически по любому адресу и переустановить его в это новое место.

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

Источник: MSDN