Как блоки среды потока могут находиться выше ограничения адресного пространства?

Недавно я заметил, что 32-битная версия Cheat Engine имеет блок Thread Environment с более высоким адресом, чем тот, который доступен для 32-битного адресного пространства. Насколько мне известно, пользовательское пространство доступно только до адреса 0x7FFFFFFF, но этот TEB был расположен по адресу 0xFFFDB000. Каждый TEB, который я когда-либо видел, начинался с 0x7EFD8000 или 0x7EFDB000, а последующие TEB продолжались вниз. Я предполагаю, что, поскольку Cheat Engine является сканером памяти, он должен упростить процесс сканирования. Блок среды процесса также был перемещен. Может кто-нибудь сказать, пожалуйста, как это возможно? Это параметр в Portable Executable, случайно?

1 ответ

Решение

Для 32-битных программ доступны адреса от 0x00000000 в 0xFFFFFFFF но на платформе x86 историческая [0x00000000, 0x7FFFFFFF] было пространство пользователя и [0x80000000, 0xFFFFFFFF] пространство ядра. но на x64, где 32-битные приложения работают в подсистеме wow64, это уже не так - весь 32-битный диапазон - [0x80000000, 0xFFFFFFFF] это пространство пользователя. но по совместимым причинам система в любом случае ограничивает адресное пространство пользовательских приложений wow64 до 2 ГБ. [0x00000000, 0x7FFFFFFF] по умолчанию. для перерыва это и иметь 4GB места нужно использовать флаг

IMAGE_FILE_LARGE_ADDRESS_AWARE Приложение может обрабатывать адреса размером более 2 ГБ. в IMAGE_FILE_HEADER.Characteristics

В 64-разрядных выпусках Windows 32-разрядные приложения, помеченные флагом IMAGE_FILE_LARGE_ADDRESS_AWARE, имеют 4 ГБ доступного адресного пространства.

Другие вопросы по тегам