你如何直接从物理内存中读取?

tig*_*rou 23 c c++ memory windows readprocessmemory

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

我已经知道API ReadProcessMemory,它从ram中读取(由大多数培训师使用),但它仅适用于特定的过程.

我在MSDN上搜索并发现Device\PhysicalMemory似乎提供了这种可能性,但我发现没有实际的例子,这个功能似乎已被Windows服务包关闭(以修复某些漏洞).

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

编辑:添加有关操作系统的信息.

mar*_*aft 7

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

在Windows 98之后,在大多数情况下无法从用户模式访问物理内存.正如其他人所说的那样,任何旧程序都无法破坏人们的计算机.您必须编写内核驱动程序,只有在签名并首次加载到窗口的存储区中才能安装该驱动程序.仅此一点并不像链接DLL那样简单.

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

此外,您无法从用户模式应用程序调用这些API.只有司机可以使用它们.用户模式应用程序无法在驱动程序的帮助下访问物理内存.驱动程序可以处理来自用户API的请求,也可以使用IOCTL并将其资源映射到API的虚拟内存.无论哪种方式,您都需要一个必须由插件管理器安装的驱动程序的帮助.PnP必须选择通过硬件激活(即热插拔或其他方法,如总是打开的总线驱动程序)自行安装驱动程序.

进一步的窗口随机分配虚拟地址,以便不容易识别任何模式或计算出它的物理位置.


dat*_*olf 6

语言C和C++都没有定义术语"记忆".事物用抽象术语定义,如"存储"和"存储分类器".指针是抽象的东西 - 它们的值可以是任何东西,与物理或虚拟地址完全无关.

仅在系统及其实现的上下文中引入了诸如存储器和地址空间之类的术语.由于这些是特定于系统的东西,因此必须使用操作系统提供的方法来访问它们.

即使在实现OS内核时,您也必须通过C(因为它根本不能)访问最低级别的内容,而是通过特定于实现和体系结构的方法.通常这是通过在汇编中编程的一组低级函数来完成的,这些函数的编写方式与编译器生成的机器代码类型相匹配.这允许从C调用那些用汇编编写的函数,就好像它们是由编译器编译的一样.


小智 6

检查此链接:访问物理内存,端口和PCI配置空间

但是从Windows Vista开始,即使是WinHex也无法打开物理内存.


Mar*_*ork -3

简短回答:否

长答案:

C/C++ 标准用非常简单的术语定义了机器。没有虚拟内存的概念(只是内存)。这些概念更多地属于硬件领域,并且可能通过操作系统来访问(如果它知道操作系统这样的事情)。

我会根据您的操作系统/硬件提供的设施重新提出问题。

  • 我认为问题“已经”是操作系统提供的设施,因为它谈论的是操作系统提供的功能和设备。 (4认同)
  • 这不是 C++ 新闻组,是吗?操作系统细节完全没问题 (4认同)