Как блоки среды потока могут находиться выше ограничения адресного пространства?
Недавно я заметил, что 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