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