有没有一种方法可以转储所有物理内存的值?

4
我知道每个用户进程都有一个虚拟地址空间,可以进行转储。但是有没有一种方法可以转储物理地址空间?假设我有一个具有4GB内存的32位系统,我能否编写程序以打印每个物理内存位置。
我知道这会违反内存保护等规定,但如果可能的话,如何将其转换为内核进程或更低级别的进程,以允许我访问整个内存..?
我想知道如何在Windows/Linux平台(或内核)编写此类代码(如果可能)。或者如果必须使用汇编语言或类似语言,则如何切换到该特权级别。

你可能可以做到(我个人从未尝试过),但至少需要进行一些操作系统调用。用户进程无法访问物理内存。如果在代码中没有已知的方法来实现这一点,你总是可以崩溃操作系统并以这种方式获取内存转储。 - Jeff Mercado
哈哈!你知道怎么崩溃操作系统吗?:P - shreedhar
有一些工具可以为您完成这项任务,例如Sysinternals Notmyfault。您还可以配置注册表键,以便在出现特定的键盘组合时系统崩溃。 - Sasha Goldshtein
相关链接 ntmio 一个用于访问硬件资源的Windows命令行。 - user1013904
你可以用一个叫 CheatEngine 的程序实现它。我想它是开源的,所以你可以查看它是如何实现的。 - Daniel
5个回答

2
在Linux中,如果你有读取权限,可以打开并映射设备文件/dev/mem,该文件对应物理内存。

0

我能编写一个程序来打印每个物理内存位置吗?

我认为没有操作系统会给用户访问物理内存位置的权限,所以你无法做到。不管怎样,你看到的都是操作系统产生的虚拟地址。


0

在Windows上,可以直接访问物理内存。以下是一些您可以做的事情:

  • 使用Device\PhysicalMemory对象--您无法访问所有物理内存,并且从Windows Server 2003 SP1开始限制对其的用户模式访问。
  • 使用地址窗口扩展--您可以控制自己的虚拟到物理地址映射,因此在某种意义上,您正在直接访问物理内存,尽管仍然通过页表。
  • 编写内核模式驱动程序--有内核模式API可直接访问物理内存,分配物理内存页面等。其中一个原因是DMA(直接内存访问)。

这些方法都不会为您提供对任何物理内存位置的易于、不受限制的访问。 如果我可以问一下,您想要实现什么目标?


0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接