当我阅读here时,一个32位Windows应用程序的虚拟地址空间具有2GB的存储空间(从0x00000000-0x7FFFFFFF开始)。其余2GB保留用于系统地址空间。
但是现在我在32位程序(使用作弊引擎)中找到了一个指针,该指针指向的地址不在虚拟地址空间范围内。我上次浏览的地址为0x301DDC3C-> 0x87F56190,如您在图片中所见:
(第一行的扩展表示对指针0x301DDC3C的取消引用,在下一行中,您可以看到RAM的取消引用位置0x87F56190中的内容)
在取消对指针的引用之后,有指针返回到进程虚拟地址空间。
用户模式应用程序如何可能具有指向系统地址空间的有效指针?
这是否意味着位置0x301DDC3C中的指针指向系统地址空间中的位置?因此,我正在检查的过程正在使用内核模式的东西?
答案 0 :(得分:2)
来自Memory and Address Space Limits
对内存和地址空间的限制因平台,操作系统以及IMAGE_FILE_HEADER.Characteristics
中的IMAGE_FILE_LARGE_ADDRESS_AWARE
标志而异。使用/LARGEADDRESSAWARE
链接器选项可以设置或清除IMAGE_FILE_LARGE_ADDRESS_AWARE
(应用程序可以处理大于2 GB的地址)。
默认情况下,{p {1}}已清除32位PE,并已设置为64位PE,但是我们可以覆盖默认值:
因此设置了IMAGE_FILE_LARGE_ADDRESS_AWARE
标志的32位进程-最多可以使用4Gb内存。
当然,在x64窗口中,用户模式可以使用IMAGE_FILE_LARGE_ADDRESS_AWARE
(win8.1 +)或[0, 0x800000000000)
(win 8.1之前)的内存空间。但是系统通过保留大范围的内存来人为地限制了这一点(此分配受保护并且不能释放)
对于32位进程,此保留从[0, 0x80000000000)
或7FFF0000
开始,直到64位 ntdll.dll 。非常有趣的是,在清除了FFFE0000
的64位进程中,这种保留的内存空间也是从IMAGE_FILE_LARGE_ADDRESS_AWARE
开始的。同样有趣的是,在这种情况下,将 kernel32.dll 加载到另一个地址,与通常的64位进程进行比较。因此, kernel32.dll 的基础通常在所有64位进程中都不相同。但是 ntdll.dll 无论如何都在所有进程中加载到相同的地址。
x64窗口上的常规内存分配:
答案 1 :(得分:0)
ALL 是进程的虚拟地址(不是“物理”地址)。用户空间进程可能会使用恰好来自“系统空间”的指针,但这不是 NOT 意味着进程可以自由访问内核资源,也不意味着这些指针必然映射到物理地址。
这是另一个Microsoft链接,可能有助于阐明:
当处理器读取或写入内存位置时,它将使用 虚拟地址。作为读或写操作的一部分,处理器 将虚拟地址转换为物理地址。
...
范围 进程可用的虚拟地址称为虚拟地址 进程的地址空间。每个用户模式进程都有自己的 专用虚拟地址空间。对于32位进程,虚拟 地址空间通常为2 GB范围0x00000000至 0x7FFFFFFF。
...
诸如Notepad.exe和MyApp.exe之类的进程在用户中运行 模式。核心操作系统组件和许多驱动程序在 更特权的内核模式。有关处理器的更多信息 模式,请参阅用户模式和内核模式。每个用户模式进程都有其 拥有私有的虚拟地址空间,但是所有在内核中运行的代码 模式共享一个称为系统空间的虚拟地址空间。的 用户模式进程的虚拟地址空间称为用户空间。
...
在32位Windows中,总的可用虚拟地址空间为 2 ^ 32字节(4 GB)。通常较低的2 GB用于 用户空间,高2 GB用于系统空间。
...
以用户模式运行的代码可以访问用户空间,但不能访问用户空间 访问系统空间。此限制可防止用户模式代码从 读取或更改受保护的操作系统数据结构。码 以内核模式运行的用户可以访问用户空间和系统空间。 也就是说,以内核模式运行的代码可以访问系统空间,并且 当前用户模式进程的虚拟地址空间。
...
还值得一提的是内核模式和用户模式之间的区别:
启动用户模式应用程序时,Windows将为 应用程序。该过程为应用程序提供了私有的 虚拟地址空间和专用句柄表。因为 应用程序的虚拟地址空间是私有的,一个应用程序不能 更改属于另一个应用程序的数据。每个应用程序运行 隔离,并且如果应用程序崩溃,则崩溃仅限于 那一个应用程序。其他应用程序和操作系统是 不受崩溃的影响。
... 除了私有之外,用户模式应用程序的虚拟地址空间也受到限制。以用户模式运行的处理器 无法访问为操作保留的虚拟地址 系统。限制用户模式应用程序的虚拟地址空间 防止应用程序更改,甚至可能损坏, 关键操作系统数据。
...