我想创建 Win32 应用程序(在 C/C++ 中),它可以无限制地访问系统内存。我只想知道是否可能,如果可能,我想知道创建该应用程序的最短方法。谢谢。
2 回答
访问系统内存的唯一方法是从内核模式驱动程序。所以,如果你要这样做,你将不得不写这样的东西。
您需要一个内核驱动程序来更改页表映射。一旦内存被映射到进程的地址空间,用户模式进程就可以访问它。当然,这伴随着一个严重的警告——一个可以访问内核内存区域的应用程序很容易破坏你的系统甚至更糟。 当然,更改应该与虚拟内存管理器合作,通过使用其 API 而不是直接更改映射,否则当其条目不在预期的位置时,内核内存管理可能会变得非常混乱。
没有什么可以阻止用户模式应用程序访问属于其他进程的内存,除非现有内核代码不提供这种访问,除非在非常有限的情况下。例如,文件映射已经使用共享内存并让用户模式进程访问内核拥有的页面(由磁盘缓存拥有)。
请注意,虚拟地址仍然与物理地址不匹配,只有内核代码可以直接使用物理地址。因此,将其用于 DMA 之类的事情会很困难。
(我知道一个用于 I/O 端口的内核驱动程序——giveio.sys,它经常被硬件监控软件使用。不确定它是否可以用于内存页面访问,或者你需要找到一个不同的一个/自己写。在linux上,有一个广泛可用的内核模块,它允许用户代码通过/dev/kmem
设备访问所有内存。这是一个很好的例子,这不一定会破坏安全性,因为/dev/kmem
检查超级用户权限请求过程,并且 Windows 驱动程序可以执行大致相同的操作。)
毫无疑问,最短的方法是找到一个为此公开 ioctl 的现有驱动程序。此时,用户模式应用程序只需要安装和加载驱动程序,然后使用它的 ioctl 将您想要的页面映射到您的进程中。用于管理驱动程序和设备(当然具有管理员权限)的用户模式 API 有详细的文档记录。