【问题标题】:Windows kernel ReadProcessMemory() / WriteProcessMemory()?Windows 内核 ReadProcessMemory() / WriteProcessMemory()?
【发布时间】:2012-01-22 01:52:21
【问题描述】:

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

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

驱动目标平台是windows xp/2003

【问题讨论】:

  • 您应该在捕获阶段在上下文中访问内存,之后您应该只对捕获的值进行操作。否则你有一个安全漏洞。

标签: windows kernel driver kernel-module


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我相信你应该使用 ZwXxxVirtualMemory。

    【讨论】:

      【解决方案3】:

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

      所以,在内核中使用 ZwXxx。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多