Win32应用程序,可无限制地访问内存

Win32 Application with unlimited access to memory

本文关键字:访问 内存 无限制 应用程序 Win32      更新时间:2023-10-16

我想创建Win32应用程序(在C/C++中(,该应用程序可以无限制地访问系统内存。我只想知道是否可能,如果是,我想知道创建该应用程序的最短方法。谢谢。

访问系统内存的唯一方法是从内核模式驱动程序。所以,如果你要这样做,你必须写这样的东西。

您需要内核驱动程序来更改页表映射。 将内存映射到进程的地址空间后,用户模式进程就可以访问它。 当然,这会带来一个严重的警告 - 可以访问内核内存区域的应用程序很容易破坏系统的稳定性或更糟。 当然,更改应该与虚拟内存管理器合作完成,方法是使用其 API 而不是直接更改映射,否则当内核内存管理的条目不在预期的位置时,内核内存管理可能会变得非常混乱。

没有什么可以阻止用户模式应用程序访问属于其他进程的内存,除了现有内核代码不提供此类访问,除非在非常有限的情况下。 例如,文件映射已经使用共享内存,并允许用户模式进程访问内核拥有的页面(由磁盘缓存拥有(。

请注意,虚拟地址仍然与物理地址不匹配,只有内核代码可以直接使用物理地址。 因此,将其用于DMA之类的事情将很困难。

(我知道有一个内核驱动程序可以为I/O端口执行此操作 - giveio.sys,它经常被硬件监控软件使用。 不确定它是否可以用于内存页面访问,或者您需要找到不同的/编写自己的页面。 在 Linux 上,有一个广泛使用的内核模块,它允许用户代码通过/dev/kmem设备访问所有内存。 这是一个很好的例子,这不一定会破坏安全性,因为/dev/kmem检查请求进程的超级用户权限,并且Windows驱动程序可以执行大致相同的操作。

最短的方法无疑是找到一个现有的驱动程序,为此公开 ioctl。 此时,用户模式应用程序只需安装和加载驱动程序,然后使用其 ioctls 将所需的页面映射到进程中。 用于管理驱动程序和设备(当然具有管理员权限(的用户模式 API 已详细记录。