VA и адреса памяти

Это должен быть простой вопрос: я знаю, что VA = RVA + база изображений для PE, теперь я пытаюсь найти в дизассемблере строку, и она находится по адресу 0042720E в секции .text.

База изображений составляет 400000, а 2720E - это RVA, до сих пор все в порядке.

Но почему, когда я загружаю exe в отладчике, память, в которой отображается инструкция, равна 0140720E?

0140720E (то, что я вижу в оперативной памяти) и 0042720E (VA) отличаются на FE0000, почему так? Я что-то пропустил?


person Marco A.    schedule 25.04.2011    source источник
comment
На какой платформе вы работаете?   -  person JaredPar    schedule 25.04.2011
comment
win32, PE является переносимым исполняемым файлом   -  person Marco A.    schedule 25.04.2011
comment
@Paul: Содержит ли этот конкретный .exe базовую таблицу перемещения?   -  person ildjarn    schedule 25.04.2011
comment
Вы не поверите, но это приложение hello world, созданное с помощью Visual Studio 2010. В любом случае, да, есть каталог перемещения.   -  person Marco A.    schedule 25.04.2011
comment
Предполагая, что вы используете VS для отладки, проверьте базовый адрес образа в Debug -> Windows -> Modules. По умолчанию рандомизация макета адресного пространства включена для PE, созданных в Visual Studio.   -  person Peter Huene    schedule 25.04.2011
comment
@Peter -› см. комментарий в ответе ниже   -  person Marco A.    schedule 26.04.2011


Ответы (1)


На самом деле есть только две возможности: произошло перераспределение или вы неправильно определили RVA. Более вероятно, что это перераспределение, особенно если вы работаете в Windows Vista или Windows 7 из-за ASLR. В зависимости от того, как вы подключились и какой отладчик используете, можно заставить отладчик скорректировать сообщаемые адреса, чтобы они соответствовали адресам загрузки базового раздела, указанным в PE, ollydbg является одним из них (вы должны запустить приложение через ollydbg, то же самое для DLL)

person Necrolis    schedule 25.04.2011
comment
Это справедливо и для отладчика VS? Адрес вроде тот же - person Marco A.; 25.04.2011
comment
@Paul: Нет, отладчик VS не выполняет такой перевод; он сообщает VA как есть. Если используется ASLR, то в окне «Модули» должен отображаться фактический базовый адрес загруженного модуля, и оттуда вы можете применить RVA. - person Peter Huene; 26.04.2011
comment
Да, он действительно отображает адрес, который, добавленный к RVA, дает именно адрес инструкции. Так что это за адрес? База изображений + что-то случайное? - person Marco A.; 26.04.2011
comment
@Paul: Это просто место в виртуальной памяти, где загрузчик операционной системы решил сопоставить модуль. Когда модуль подключается к ASLR и загружается в версию Windows с поддержкой ASLR (Vista+), загрузчик игнорирует предпочитаемый базовый адрес (ImageBase в необязательном заголовке PE) и вместо этого выбирает другое местоположение. Я не уверен, задокументирован ли точный процесс, с помощью которого Windows определяет новое местоположение; Я бы погуглил. - person Peter Huene; 26.04.2011