gpt4 book ai didi

windows - Windows虚拟地址空间

转载 作者:行者123 更新时间:2023-12-03 11:08:46 24 4
gpt4 key购买 nike

当我阅读here时,一个32位Windows应用程序的虚拟地址空间具有2GB的存储空间(从0x00000000-0x7FFFFFFF开始)。其余2GB保留用于系统地址空间。
但是,我在32位程序(使用 Cheat Engine )中找到了一个指针,该指针指向不在虚拟地址空间范围内的地址。我上次浏览的地址是0x301DDC3C-> 0x87F56190,如图所示:
enter image description here
(第一行中的扩展表示对指针0x301DDC3C的取消引用,在下一行中,您可以看到RAM中的取消引用位置0x87F56190中的内容)
在取消对指针的引用之后,有指针返回到进程虚拟地址空间。
用户模式应用程序如何可能具有指向系统地址空间的有效指针?
这是否意味着位置0x301DDC3C中的指针指向系统地址空间中的位置?因此,我正在研究的过程正在使用内核模式的东西?

最佳答案

来自Memory and Address Space Limits

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

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

enter image description here

因此设置了IMAGE_FILE_LARGE_ADDRESS_AWARE标志的32位进程-最多可使用4Gb内存。

当然,在x64窗口中,用户模式可以使用[0, 0x800000000000)(win8.1 +)或[0, 0x80000000000)(在Win 8.1之前)的内存空间。但是系统通过保留大范围的内存人为地限制了此操作(此分配 protected 并且不能释放)

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

x64 Windows上通常的内存分配:

  • 32位进程,已清除IMAGE_FILE_LARGE_ADDRESS_AWARE(默认)
    enter image description here
  • 32位进程,设置IMAGE_FILE_LARGE_ADDRESS_AWARE enter image description here
  • 64位进程,已清除IMAGE_FILE_LARGE_ADDRESS_AWARE enter image description here
  • 64位进程,设置了IMAGE_FILE_LARGE_ADDRESS_AWARE(默认)
    enter image description here
  • 关于windows - Windows虚拟地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298176/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com