首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何直接从物理内存中读取数据?

如何直接从物理内存中读取数据?
EN

Stack Overflow用户
提问于 2011-12-07 00:48:36
回答 6查看 32.1K关注 0票数 27

在C或C++ (windows)中,如何通过给出物理(而非虚拟)地址来读取内存?这意味着不需要通过虚拟内存系统(mmu表),并且特定于一个进程。

我已经知道API ReadProcessMemory,它从ram读取(大多数训练者使用),但它只用于特定的过程。

我在MSDN上搜索,发现Device\PhysicalMemory似乎提供了这样的可能性,但我没有找到实际的例子,而且这个功能似乎已经被Windows service pack关闭(为了修复一些漏洞)。

我知道这是可能的,因为WinHex做到了(如果你选择“工具”>“打开内存”>“物理内存”)。然后,它将显示内存内容从0x00000000到your_ram_size,就像你打开一个传统的文件一样。它需要管理员权限,但没有要安装的驱动程序(这意味着WinHex在用户模式下安装)。

编辑:添加os的相关信息。

EN

回答 6

Stack Overflow用户

发布于 2015-01-05 09:53:18

您必须编写内核模式驱动程序,并使用内存管理器函数将物理内存范围映射到内核驱动程序的系统空间,然后将功能导出到用户API或驱动程序。

在Windows98之后,在大多数情况下不可能从用户模式访问物理内存。正如其他人所说,这是因为任何旧程序都不能只破坏人们的计算机。您必须编写内核驱动程序,只有在签名并首先加载到窗口的存储中时,才能安装内核驱动程序。仅此一项并不像链接DLL那样是一个简单的过程。

总之,MmAllocateContiguousMemory()是一个windows内核模式函数,它将连续的物理内存映射到系统内存,是ntoskrnl.exe的一部分。

此外,您不能从用户模式应用程序中调用这些API。只有司机才能使用它们。如果没有驱动程序的帮助,用户模式应用程序就无法访问物理内存。驱动程序可以处理来自用户API的请求,也可以使用IOCTL并将其资源映射到API的虚拟内存。无论哪种方式,您都需要一个驱动程序的帮助,该驱动程序必须由即插即用管理器安装。PnP必须选择自己安装驱动程序,要么通过硬件激活,即热插拔,要么通过其他方法安装驱动程序,比如总线驱动程序始终处于打开状态。

此外,windows随机分配虚拟地址,这样就不容易辨别任何模式或计算出它的物理位置。

票数 10
EN

Stack Overflow用户

发布于 2011-12-07 01:13:08

请查看此链接:Access Physical Memory, Port and PCI Configuration Space

但从Windows Vista开始,即使是WinHex也无法打开物理ram。

票数 5
EN

Stack Overflow用户

发布于 2011-12-07 01:16:35

我认为设备驱动程序必须允许物理内存访问,因为PCI卡等设备需要以这种方式访问。如果你可以从一个驱动程序中做到这一点,那么为你的“用户”(更像是管理员)模式程序编写一个自定义分配器,以便轻松地链接到C++中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8403610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档