Как мне узнать, какие адреса памяти я могу читать-писать в сборке x86? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь узнать больше о сборке x86 (masm) и о том, как она работает с памятью. В частности, я наткнулся на следующее утверждение:

mov eax,ds:0x83f413c

Я понимаю, что это копирует содержимое по адресу памяти 0x83f413 c в eax, и это вызвало вопросы. Могу ли я просто читать и писать в каждую ячейку памяти? Как мне узнать, является ли 0x83f413 c действительной ячейкой памяти?

1 Ответ

3 голосов
/ 26 мая 2020

Контекст - это все :) Если строка была найдена в загруженной программе пользовательского пространства (о которой OP не упоминает, но я предполагаю), возможно, вот как она возникла. Инструкция mov считывала допустимую переменную размера DWORD из раздела данных программы, и модуль был либо загружен по предпочтительному адресу загрузки, либо содержал запись о перемещении, которая могла бы скорректировать адрес в команде mov на правильный адрес .

Префикс ds: был всего лишь случаем, когда дизассемблер пытался охватить все базы. Команда mov reg, mem по умолчанию использует ds.

Как правило, вы не можете получить доступ к старым адресам. ОДНАКО любой программе требуется немного памяти - по крайней мере, для хранения статически объявленных переменных. Когда ОС загружает программу, она должна выделить некоторую память для кода и данных. Расположение программы в памяти после ее загрузки предсказуемо. Компоновщик знает, что если программа была загружена, например, с 0x8300000, ее переменная с именем foo будет найдена по адресу 0x83f413 c. Таким образом, чтение значения этой переменной может быть закодировано напрямую - при условии, что программа была загружена по предпочтительному адресу, который в этом примере равен 0x8300000. Предпочтительный адрес сохраняется в заголовке программы, чтобы ОС знала его во время загрузки.

Что делать, если программа НЕ загружается по предпочтительному адресу? Затем есть еще один прием, который называется перестановкой. Заголовок программы содержит набор записей, которые говорят загрузчику корректировать код во время загрузки. Что-то вроде: «в разделе кода со смещением 0x7000 есть команда mov reg, mem, которая использует смещение памяти относительно адреса загрузки, пожалуйста, отрегулируйте соответствующим образом». Загрузчик программ, который является частью ОС, видит это и делает, как было сказано. , , если он создается цепочкой инструментов сборки (компилятором / компоновщиком), которая знает, что делает . С некоторой помощью загрузчика программ на базе ОС, такие адреса stati c могут безопасно работать.


Все это было написано из предположения, что OP обнаружил рассматриваемую строку в скомпилированная пользовательская программа, нацеленная на ОС защищенного режима (Windows, Linux, et c.). Если бы это было, скажем, в драйвере устройства или в ядре ОС, или в загрузчике, или в 32-битной программе реального режима (они существуют!), Тогда были бы применимы другие соображения.

...