2011-12-16 57 views
2

由于这些API,它在用户模式下很简单直接。Windows内核ReadProcessMemory()/ WriteProcessMemory()?

如何从Windows内核模块读取/写入指定进程的用户空间内存?

驱动程序的目标平台是Windows XP/2003

+2

您应该在捕获阶段访问内存,在此之后,您应该只对捕获的值进行操作。否则,你有一个安全漏洞。 – 2011-12-16 15:23:09

回答

4

使用NtWriteVirtualMemory/NtReadVirtualMemory写信给其他进程 - 你需要首先打开的句柄过程。

请注意,如果您已经在进程中,则可以直接写入 - 例如,如果您正在响应来自进程的DeviceIoControl请求,您可以直接写入用户模式地址,并且它们将位于调用您的进程的地址空间。

0

我也是从Windows驱动程序的世界开始的,从我读过的内容XxxProcessMemory在ntdll(R3-UserMode)中调用NtXxxVirtualMemory。 NtXxxVirtualMemory也在ntdll中调用ZwXxxVirtualMemory(R0-KernelMode)。

我相信你应该使用ZwXxxVirtualMemory。

0

在krnel中,ZwXxx例程只是围绕NtXxx的例程,告诉内核调用者是内核模式组件,而不是用户应用程序。当一个调用来自usermode时,内核会执行额外的安全检查。

因此,在内核中使用ZwXxx。

用于读/ /写入存储器到另一个进程的另一种方法是:

  1. 获得其处理对象(PsLookupProcessByProcessId函数)的地址,
  2. 开关当前线程它的地址空间(KeStackAttachProcess),
  3. 执行操作(读/写...),
  4. 开关的地址空间背面(KeUnstackDetachProcess),
  5. 递增
  6. 递减引用计数(1) (ObDereferenceObject函数)。