2

正如我在这里读到的,32 位 Windows 应用程序的虚拟地址空间有 2GB 的存储空间(从 0x00000000-0x7FFFFFFF)。其他 2GB 保留给系统地址空间。

但是,我在一个 32 位程序(使用作弊引擎)中找到了一个指针,它指向一个不在虚拟地址空间范围内的地址。我上次探索的地址是 0x301DDC3C -> 0x87F56190,如图所示: 在此处输入图像描述

(第一行的扩展意味着指针 0x301DDC3C 的解引用,在下一行你可以看到 RAM 中解引用位置 0x87F56190 中的内容)

在解除对指针的引用后,有指针返回到进程虚拟地址空间。

用户模式应用程序如何拥有指向系统地址空间的有效指针?

这是否意味着位置 0x301DDC3C 中的指针指向系统地址空间中的某个位置?所以我正在检查的过程是使用内核模式的东西吗?

4

2 回答 2

4

内存和地址空间限制

内存和地址空间的限制因平台、操作系统IMAGE_FILE_LARGE_ADDRESS_AWARE以及IMAGE_FILE_HEADER.Characteristics. IMAGE_FILE_LARGE_ADDRESS_AWARE应用程序可以处理大于 2 GB 的地址)通过使用/LARGEADDRESSAWARE链接器选项设置或清除。

默认情况下IMAGE_FILE_LARGE_ADDRESS_AWARE清除 32 位 PE 并设置为 64 位 PE,但我们可以覆盖默认值:

在此处输入图像描述

所以带有设置标志的 32 位进程IMAGE_FILE_LARGE_ADDRESS_AWARE- 最多 4Gb 内存可用。

当然,[0, 0x800000000000)(win8.1 +)或[0, 0x80000000000)(win 8.1 之前)内存空间可用于 x64 窗口中的用户模式。但是系统通过保留大范围的内存人为地限制了这一点(这个分配是受保护的,不能是免费的)

对于 32 位进程,此保留开始于7FFF0000FFFE0000直到 64 位ntdll.dll。非常有趣的是,在 64 位进程中,IMAGE_FILE_LARGE_ADDRESS_AWARE被清除的地方 - 这种保留的内存空间也是从0x80000000. 同样有趣的是,在这种情况下,kernel32.dll被加载到另一个地址,与通常的 64 位进程相比。所以kernel32.dll的基础在所有 64 位进程中通常都不相同。但是ntdll.dll在所有进程中都加载到相同的地址。

x64 窗口上的常用内存分配:

  1. 32 位进程,IMAGE_FILE_LARGE_ADDRESS_AWARE清除(默认) 在此处输入图像描述
  2. 32位进程,IMAGE_FILE_LARGE_ADDRESS_AWARE设置 在此处输入图像描述
  3. 64位进程,IMAGE_FILE_LARGE_ADDRESS_AWARE清除 在此处输入图像描述
  4. 64 位进程,IMAGE_FILE_LARGE_ADDRESS_AWARE设置(默认) 在此处输入图像描述
于 2019-01-22T09:59:56.007 回答
0

您看到的所有地址都是进程的虚拟地址(不是“物理”地址)。用户空间进程可能使用恰好来自“系统空间”的指针,但这并不意味着进程可以自由访问内核资源,也不意味着这些指针必然映射到物理地址。

这是另一个 Microsoft 链接,可能有助于澄清:

虚拟地址空间

当处理器读取或写入内存位置时,它使用虚拟地址。作为读取或写入操作的一部分,处理器将虚拟地址转换为物理地址。

...

进程可用的虚拟地址范围称为进程的虚拟地址空间。每个用户模式进程都有自己的私有虚拟地址空间。对于 32 位进程,虚拟地址空间通常是 2 GB 范围 0x00000000 到 0x7FFFFFFF。

...

Notepad.exe 和 MyApp.exe 等进程在用户模式下运行。核心操作系统组件和许多驱动程序在更高特权的内核模式下运行。有关处理器模式的更多信息,请参阅用户模式和内核模式。每个用户模式进程都有自己的私有虚拟地址空间,但在内核模式下运行的所有代码共享一个称为系统空间的虚拟地址空间。用户模式进程的虚拟地址空间称为用户空间。

...

在 32 位 Windows 中,总可用虚拟地址空间为 2^32 字节(4 GB)。通常低 2 GB 用于用户空间,高 2 GB 用于系统空间。

...

在用户模式下运行的代码可以访问用户空间,但不能访问系统空间。此限制可防止用户模式代码读取或更改受保护的操作系统数据结构。在内核模式下运行的代码可以访问用户空间和系统空间。也就是说,在内核模式下运行的代码可以访问系统空间和当前用户模式进程的虚拟地址空间。

...

值得注意的是内核模式用户模式之间的区别:

用户模式和内核模式

当您启动用户模式应用程序时,Windows 会为该应用程序创建一个进程。该进程为应用程序提供了一个私有虚拟地址空间和一个私有句柄表。因为应用程序的虚拟地址空间是私有的,所以一个应用程序不能更改属于另一个应用程序的数据。每个应用程序都是独立运行的,如果一个应用程序崩溃,崩溃仅限于那个应用程序。其他应用程序和操作系统不受崩溃影响。

...除了私有之外,用户模式应用程序的虚拟地址空间是有限的。在用户模式下运行的处理器无法访问为操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并可能损坏关键操作系统数据。

...

于 2019-01-21T21:56:35.910 回答