На какой-то вопрос есть вопрос, что именно показывает OlyDbg. 32-разрядная (и 64-разрядная) Windows использует виртуальную память, что означает, что адрес, который вы используете в вашей программе, - , а не так же, как адрес, фактически отправленный по шине в чипы памяти. Вместо этого Windows (и я должен добавить, что другие ОС, такие как Linux, MacOS, * bsd и т. Д., Делают примерно то же самое) настраивает некоторые таблицы, которые говорят (по сути), когда программа использует адрес в , этот диапазон, используйте , что диапазон физических адресов.
Это сопоставление выполняется на каждой странице (где каждая страница обычно составляет 4 Кбайта, хотя возможны и другие размеры). В этой таблице он также может отмечать страницу как «нет» - это то, что поддерживает пейджинговую память на диск. При попытке прочитать страницу, помеченную как нет, ЦП генерирует исключение. Затем ОС обрабатывает это исключение, читая данные с диска в блок памяти и обновляя таблицу, чтобы сказать, что данные присутствуют на физическом адресе X. Наряду с не существующими таблицы поддерживают несколько других значений, таких как только для чтения, поэтому вы можете читать, не записывая некоторые адреса.
Windows (опять же, как и другие ОС) устанавливает таблицы для первой части адресного пространства, но НЕ связывает с ними какую-либо память. С точки зрения пользовательской программы эти адреса просто никогда не должны использоваться.
Это возвращает нас к моей неуверенности в том, что дает OlyDbg, когда вы просите его прочитать по адресу 0x21. Этот адрес просто не ссылается на какие-либо реальные данные - никогда не было и никогда не будет.
То, что другие говорят, правда, так: отладчик обычно использовать некоторые функции ОС (например, ReadProcessMemory
и WriteProcessMemory
, в частности под Windows), чтобы получить доступ к вещам, которые не умеют читать или писать напрямую. Они позволят вам читать и записывать память в другой процесс, который не может быть напрямую доступен обычным указателем. Ни один из них не помог бы в попытке прочитать с адреса 0x21, хотя - этот адрес не относится к какой-либо реальной памяти в любом процессе.
Почему бы вам не сделать это в мире? –
Откуда вы получили адрес? Вы работаете в виртуальном режиме (я подозреваю ...)? Связана ли программа в режиме ядра (предположительно не ...)? –
Потому что я хочу узнать больше о том, как работают компьютеры – jmasterx