Как операционная система изменяет виртуальный базовый адрес процесса?

#windows #assembly #operating-system #portable-executable #relocation

Вопрос:

Чтобы уточнить, моя конкретная путаница связана с тем фактом, что все инструкции в исполняемом файле PE записываются при условии, что адрес базового образа = 00400000. Однако при отладке исполняемого файла используемые адреса адаптируются к любому адресу базового образа, определяемому во время выполнения.

Я открыл простой процесс в базовом образе, отличающемся от стандартного: Адрес базового изображения процессазатем запустил отладчик и принял к сведению вызов простой функции: Простой функциональный вызов Вызов относится к указателю, который имеет смещение B0F4 от базового адреса изображения (930000 B0F4). Указатель B0F4, являющийся IAT, указывает на библиотеку dll, содержащую используемую функцию. IATPointer

Меня смущает, как инструкция вызывает этот конкретный адрес, который использует 930000 в качестве базового адреса. Этот базовый адрес определяется во время выполнения.

При просмотре той же инструкции внутри PE-файла выполняется тот же вызов, но используется адрес по умолчанию. Файл инструкции Смещение B0F4 применяется к 00400000.

Как Windows это делает. Есть ли для этого аппаратное решение? Какая-то инструкция, которая решает, что все дальнейшие инструкции работают со смещением? Или, как бы нелепо это ни звучало, ОС каким-то образом идентифицирует все используемые адреса и изменяет их на основе новой базы изображений

Комментарии:

1. Да, ОС идентифицирует и исправляет все инструкции. Для этого в вашем исполняемом файле есть метаданные, называемые записями перемещения. См. также документацию Microsoft

2. Спасибо! Я понимаю, я прочитал документы и проверил раздел .reloc для приведенных выше примеров, и все это проверяется. Черт, до этого мне это казалось безумным решением, но я полагаю, что это то, что ты должен сделать.

3. Если вы хотите, не могли бы вы написать то же самое в качестве ответа, чтобы я мог отметить вас как ответившего на вопрос?