线程环境块如何位于地址 space 限制之上?

How can Thread Environment Blocks reside above the address space limit?

我最近注意到 Cheat Engine 的 32 位版本的线程环境块位于比 32 位地址可用地址更高的地址 space。据我所知,用户 space 只能访问地址 0x7FFFFFFF,但此 TEB 位于 0xFFFDB000。我见过的每个 TEB 都从 0x7EFD8000 或 0x7EFDB000 开始,随后的 TEB 继续向下。我假设 Cheat Engine 是一个内存扫描器,它是为了简化扫描过程。 Process Environment Block 也被移动了。谁能告诉我这怎么可能?这是可移植可执行文件中的设置吗?

对于 32 位程序可用地址从 0x000000000xFFFFFFFF 但在 x86 平台上历史 [0x00000000, 0x7FFFFFFF] 是用户 space 和 [0x80000000, 0xFFFFFFFF] 内核 space.但在 x64 上,wow64 子系统中的 32 位应用程序 运行 这已经不是真的 - 所有 32 位范围 - [0x80000000, 0xFFFFFFFF] 是用户 space。但是出于兼容的原因,系统无论如何都会默认将 wow64 位应用程序的用户地址 space 限制为 2GB [0x00000000, 0x7FFFFFFF]。打破这个并有 4GB space 需要使用标志

IMAGE_FILE_LARGE_ADDRESS_AWARE 应用程序可以处理大于 2 GB 的地址。 in IMAGE_FILE_HEADER.Characteristics

On 64-bit editions of Windows, 32-bit applications marked with the IMAGE_FILE_LARGE_ADDRESS_AWARE flag have 4 GB of address space available.