Win32应用程序,可无限制地访问内存
Win32 Application with unlimited access to memory
我想创建Win32应用程序(在C/C++中(,该应用程序可以无限制地访问系统内存。我只想知道是否可能,如果是,我想知道创建该应用程序的最短方法。谢谢。
访问系统内存的唯一方法是从内核模式驱动程序。所以,如果你要这样做,你必须写这样的东西。
您需要内核驱动程序来更改页表映射。 将内存映射到进程的地址空间后,用户模式进程就可以访问它。 当然,这会带来一个严重的警告 - 可以访问内核内存区域的应用程序很容易破坏系统的稳定性或更糟。 当然,更改应该与虚拟内存管理器合作完成,方法是使用其 API 而不是直接更改映射,否则当内核内存管理的条目不在预期的位置时,内核内存管理可能会变得非常混乱。
没有什么可以阻止用户模式应用程序访问属于其他进程的内存,除了现有内核代码不提供此类访问,除非在非常有限的情况下。 例如,文件映射已经使用共享内存,并允许用户模式进程访问内核拥有的页面(由磁盘缓存拥有(。
请注意,虚拟地址仍然与物理地址不匹配,只有内核代码可以直接使用物理地址。 因此,将其用于DMA之类的事情将很困难。
(我知道有一个内核驱动程序可以为I/O端口执行此操作 - giveio.sys,它经常被硬件监控软件使用。 不确定它是否可以用于内存页面访问,或者您需要找到不同的/编写自己的页面。 在 Linux 上,有一个广泛使用的内核模块,它允许用户代码通过/dev/kmem
设备访问所有内存。 这是一个很好的例子,这不一定会破坏安全性,因为/dev/kmem
检查请求进程的超级用户权限,并且Windows驱动程序可以执行大致相同的操作。
最短的方法无疑是找到一个现有的驱动程序,为此公开 ioctl。 此时,用户模式应用程序只需安装和加载驱动程序,然后使用其 ioctls 将所需的页面映射到进程中。 用于管理驱动程序和设备(当然具有管理员权限(的用户模式 API 已详细记录。
- 特里树.无法访问内存
- 如何使用 C/C++ 访问内存的内容?
- 指针可以用于访问内存中的任何任意区域吗?
- 分段错误:无法访问内存
- SIGABRT 在线程中访问内存时
- 访问内存以内联循环访问数组
- 如何从C或C 语言级别安全访问内存映射的硬件寄存器
- 在释放了所有作用域内指针之后仍然可访问内存
- 有什么快速访问内存的技巧吗
- CUDA非法访问内存
- C++ 访问内存冲突
- 悬空指针仍在访问内存值
- 当我尝试从结构列表中访问内存时出现错误:" Program received signal SIGSEGV, Segmentation fault."
- 如何访问内存映射的 USB 主控制器寄存器
- 访问内存时出现奇怪的崩溃
- 如何在C++读取块后访问内存中的文件数据
- 使用共享库时仍可访问内存
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- Win32应用程序,可无限制地访问内存
- 强制两个线程直接访问内存中的全局变量