Виртуальное адресное пространство Windows - PullRequest
0 голосов
/ 22 января 2019

как я прочитал здесь виртуальное адресное пространство 32-битного приложения Windows имеет 2 ГБ памяти (от 0x00000000-0x7FFFFFFF).Остальные 2 ГБ зарезервированы для системного адресного пространства.

Но теперь я обнаружил указатель в 32-битной программе (использующий Cheat Engine), который указывает на адрес, который находится вне диапазона виртуального адресного пространства.Адреса в моем последнем исследовании были 0x301DDC3C -> 0x87F56190, как вы можете видеть на картинке: enter image description here

(Расширение в первой строке означает разыменование указателя 0x301DDC3C, вВ следующей строке вы можете увидеть, что находится в месте разыменования 0x87F56190 в ОЗУ)

После разыменования указателя в виртуальном адресном пространстве процесса есть указатели.

Как это возможно, чтоприложение пользовательского режима имеет действительный указатель на системное адресное пространство?

Означает ли это, что указатель в местоположении 0x301DDC3C указывает на местоположение в системном адресном пространстве?Итак, процесс, который я изучаю, использует режим ядра?

Ответы [ 2 ]

0 голосов
/ 22 января 2019

из Ограничения памяти и адресного пространства

Ограничения на память и адресное пространство зависят от платформы, операционной системы и от того, установлен ли флаг IMAGE_FILE_LARGE_ADDRESS_AWARE в IMAGE_FILE_HEADER.Characteristics. IMAGE_FILE_LARGE_ADDRESS_AWARE ( Приложение может обрабатывать адреса размером более 2 ГБ ) устанавливается или очищается с помощью опции компоновщика /LARGEADDRESSAWARE.

по умолчанию IMAGE_FILE_LARGE_ADDRESS_AWARE очищено для 32-битного PE и установлено для 64-битного PE, но мы можем перезаписать по умолчанию:

enter image description here

32-битный процесс с установленным флагом IMAGE_FILE_LARGE_ADDRESS_AWARE - доступно до 4 Гб памяти.

действительно, конечно [0, 0x800000000000) (win8.1 +) или [0, 0x80000000000) (до win 8.1) доступно пространство памяти для пользовательского режима в x64 windows. но система искусственно ограничивает это резервным большим диапазоном памяти (это распределение защищено и не может быть свободным)

для 32-разрядного процесса это резервирование начинается с 7FFF0000 или FFFE0000 и до 64-разрядного ntdll.dll . Очень интересно, что в 64-битном процессе, где IMAGE_FILE_LARGE_ADDRESS_AWARE очищено - также было такое резервное пространство памяти, начиная с 0x80000000. Также интересно, что в этом случае kernel32.dll загружается по другому адресу для сравнения обычного 64-битного процесса. поэтому база kernel32.dll не одинакова в целом во всех 64-битных процессах. но ntdll.dll все равно загружается по одному и тому же адресу во всех процессах.

обычное распределение памяти в x64 windows:

  1. 32-битный процесс, IMAGE_FILE_LARGE_ADDRESS_AWARE очищен (по умолчанию) enter image description here
  2. 32-битный процесс, IMAGE_FILE_LARGE_ADDRESS_AWARE набор enter image description here
  3. 64-битный процесс, IMAGE_FILE_LARGE_ADDRESS_AWARE очищен enter image description here
  4. 64-битный процесс, IMAGE_FILE_LARGE_ADDRESS_AWARE набор (по умолчанию) enter image description here
0 голосов
/ 22 января 2019

ALL адресов, которые вы видите, являются виртуальными адресами, процессов (не "физических" адресов). Процесс пользовательского пространства может использовать указатели, которые происходят из «системного пространства», но это означает, НЕ означает, что процесс может свободно обращаться к ресурсам ядра, и при этом это не означает, что эти указатели обязательно отображаются на физические адреса.

Вот еще одна ссылка Microsoft, которая может помочь уточнить:

Виртуальное адресное пространство

Когда процессор читает или записывает данные в ячейку памяти, он использует виртуальный адрес. Как часть операции чтения или записи, процессор переводит виртуальный адрес в физический адрес.

...

Ассортимент виртуальные адреса, доступные процессу, называются виртуальными адресное пространство для процесса. Каждый процесс пользовательского режима имеет свой собственный личное виртуальное адресное пространство. Для 32-битного процесса виртуальный адресное пространство обычно составляет 2-гигабайтный диапазон от 0x00000000 до 0x7FFFFFFF.

...

Процессы, такие как Notepad.exe и MyApp.exe, запускаются пользователем Режим. Основные компоненты операционной системы и многие драйверы работают в более привилегированный режим ядра. Для получения дополнительной информации о процессоре режимы, см. Пользовательский режим и режим ядра. Каждый процесс пользовательского режима имеет свои собственное частное виртуальное адресное пространство, но весь код, который работает в ядре mode разделяет единое виртуальное адресное пространство, называемое системным пространством. виртуальное адресное пространство для процесса пользовательского режима называется пользовательским пространством.

...

В 32-битной Windows общее доступное виртуальное адресное пространство 2 ^ 32 байта (4 гигабайта). Обычно младшие 2 гигабайта используются для пространство пользователя, а верхние 2 гигабайта используются для системного пространства.

...

Код, работающий в пользовательском режиме, имеет доступ к пользовательскому пространству, но не имеет доступ к системному пространству. Это ограничение не позволяет коду пользовательского режима чтение или изменение защищенных структур данных операционной системы. Код работа в режиме ядра имеет доступ как к пользовательскому, так и к системному пространству. То есть код, работающий в режиме ядра, имеет доступ к системному пространству и виртуальное адресное пространство текущего процесса пользовательского режима.

...

Также стоит отметить разницу между режимом ядра и режимом пользователя :

Режим пользователя и режим ядра

Когда вы запускаете приложение в пользовательском режиме, Windows создает процесс для приложение. Процесс обеспечивает приложение с частным виртуальное адресное пространство и личная таблица дескрипторов. Потому что виртуальное адресное пространство приложения является частным, одно приложение не может изменить данные, которые принадлежат другому приложению. Каждое приложение запускается в отдельности, и в случае сбоя приложения сбой ограничивается это одно приложение. Другие приложения и операционная система не пострадал от аварии.

... В дополнение к тому, что оно является частным, виртуальное адресное пространство приложения пользовательского режима ограничено. Процессор работает в режиме пользователя не может получить доступ к виртуальным адресам, которые зарезервированы для операционной система. Ограничение виртуального адресного пространства приложения пользовательского режима предотвращает изменение приложения и, возможно, повреждение, критические данные операционной системы.

...

...