Windows内核ReadProcessMemory()/ WriteProcessMemory()?

时间:2011-12-16 14:50:05

标签: windows kernel driver kernel-module

由于这些API,它在用户模式下简单明了。

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

驱动程序目标平台是windows xp / 2003

3 个答案:

答案 0 :(得分:4)

使用NtWriteVirtualMemory / NtReadVirtualMemory写入其他进程 - 您需要首先打开进程的句柄。

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

答案 1 :(得分:0)

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

我相信你应该使用ZwXxxVirtualMemory。

答案 2 :(得分:0)

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

因此,在内核中使用ZwXxx。

从/向另一个进程读取/写入内存的另一种方法是:

  1. 获取其进程对象的地址(PsLookupProcessByProcessId),
  2. 将当前线程切换到其地址空间(KeStackAttachProcess),
  3. 执行操作(读/写...),
  4. 切换回地址空间(KeUnstackDetachProcess),
  5. 递减引用计数,递增(1)(ObDereferenceObject)。