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