在C或C++(Windows)中,如何通过给出物理(非虚拟)地址来读取RAM?
这意味着无需通过虚拟内存系统(mmu 表),并且特定于一个进程。
我已经知道 APIReadProcessMemory http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553.aspx,它从 ram 读取(大多数训练者使用),但它仅适用于特定进程。
我在MSDN上搜索了一下,发现设备\物理内存 http://technet.microsoft.com/en-us/library/cc787565.aspx似乎给出了这种可能性,但我没有找到实际的例子,而且这个功能似乎已经被Windows服务包关闭了(为了修复一些漏洞)。
我知道这是可能的,因为 WinHex 可以做到这一点(如果你选择“工具”>“打开内存”>“物理内存”)。然后它将显示从 0x00000000 到 your_ram_size 的 RAM 内容,就像打开传统文件时一样。它需要管理员权限,但无需安装驱动程序(这意味着 WinHex 从用户模式进行)。
编辑:添加有关操作系统的信息。
您必须编写内核模式驱动程序并使用内存管理器函数将物理内存范围映射到内核驱动程序的系统空间,然后将功能导出到用户 API 或驱动程序。
在 Windows 98 之后,大多数情况下不可能从用户模式访问物理内存。正如其他人所说,这样任何旧程序都不能破坏人们的计算机。您必须编写一个内核驱动程序,只有在签名并首先加载到窗口存储中后才能安装该驱动程序。仅此一个过程就不像链接 DLL 那样简单。
总之MmAllocateContiguousMemory()
是一个 Windows 内核模式函数,它将连续的物理内存映射到系统内存,并且是ntoskrnl.exe
.
此外,您无法从用户模式应用程序调用这些 API。只有司机才能使用它们。如果没有驱动程序的帮助,用户模式应用程序无法访问物理内存。驱动程序可以处理来自用户 API 的请求,也可以使用 IOCTL 并将其资源映射到用户程序虚拟内存。无论哪种方式,您都需要驱动程序的帮助,该驱动程序必须由即插即用管理器安装。 PnP 必须选择通过硬件激活(即热插拔)或某些其他方法(例如始终打开的总线驱动程序)自行安装驱动程序。
另外的窗口随机分配虚拟地址,因此不容易辨别任何模式或算出其物理位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)