Windows虚拟地址空间

时间:2019-01-21 21:46:03

标签: windows pointers system cheat-engine

当我阅读here时,一个32位Windows应用程序的虚拟地址空间具有2GB的存储空间(从0x00000000-0x7FFFFFFF开始)。其余2GB保留用于系统地址空间。

但是现在我在32位程序(使用作弊引擎)中找到了一个指针,该指针指向的地址不在虚拟地址空间范围内。我上次浏览的地址为0x301DDC3C-> 0x87F56190,如您在图片中所见: enter image description here

(第一行的扩展表示对指针0x301DDC3C的取消引用,在下一行中,您可以看到RAM的取消引用位置0x87F56190中的内容)

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

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

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

2 个答案:

答案 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,但是我们可以覆盖默认值:

enter image description here

因此设置了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. 32位进程,0x80000000已清除(默认) enter image description here
  2. 32位进程,已设置IMAGE_FILE_LARGE_ADDRESS_AWARE enter image description here
  3. 64位进程,IMAGE_FILE_LARGE_ADDRESS_AWARE已清除 enter image description here
  4. 64位进程,已设置IMAGE_FILE_LARGE_ADDRESS_AWARE(默认) enter image description here

答案 1 :(得分:0)

您看到的地址的

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

这是另一个Microsoft链接,可能有助于阐明:

  

Virtual Address Space

     

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

     

...

     

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

     

...

     

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

     

...

     

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

     

...

     

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

     

...

还值得一提的是内核模式用户模式之间的区别:

  

User mode and kernel mode

     

启动用户模式应用程序时,Windows将为   应用程序。该过程为应用程序提供了私有的   虚拟地址空间和专用句柄表。因为   应用程序的虚拟地址空间是私有的,一个应用程序不能   更改属于另一个应用程序的数据。每个应用程序运行   隔离,并且如果应用程序崩溃,则崩溃仅限于   那一个应用程序。其他应用程序和操作系统是   不受崩溃的影响。

     

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

     

...