Windows 内核 ReadProcessMemory() / WriteProcessMemory()?

发布于 2024-12-21 11:39:58 字数 115 浏览 2 评论 0原文

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

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

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

It's simple and straightforward in user mode because of those APIs.

How do you read/write specified process's userspace memory from a windows kernel module?

driver target platform is windows xp/2003

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

万劫不复 2024-12-28 11:39:58

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

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

Use NtWriteVirtualMemory / NtReadVirtualMemory to write to other processes - you will need to open a handle to the process first.

Note that if you're already in the process, you can just write directly - for example if you're responding to a DeviceIoControl request from a process you can write directly to user-mode addresses and they will be in the address space of the process that called you.

故事未完 2024-12-28 11:39:58

我也开始接触 Windows 驱动程序的世界,根据我所读到的内容,XxxProcessMemory 在 ntdll (R3-UserMode) 中调用 NtXxxVirtualMemory。
NtXxxVirtualMemory 也在 ntdll.dll 中调用 ZwXxxVirtualMemory (R0-KernelMode)。

我相信你应该使用 ZwXxxVirtualMemory。

I'm also starting in the world of windows drivers and from what I've read XxxProcessMemory calls NtXxxVirtualMemory in ntdll (R3-UserMode).
The NtXxxVirtualMemory calls the ZwXxxVirtualMemory (R0-KernelMode) also in the ntdll.

I believe you should use the ZwXxxVirtualMemory.

一页 2024-12-28 11:39:58

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

因此,在内核中使用 ZwXxx。

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

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

In the krnel, ZwXxx routines are just wrappers around NtXxx ones, telling the kernel that the caller is a kernel mode component, rather than an user application. When a call comes from usermode, the kernel performs additional security checks.

So, use ZwXxx when in the kernel.

An alternative approach for reading/writing memory from/to another process is:

  1. obtain address of its process object (PsLookupProcessByProcessId),
  2. switch the current thread to its address space (KeStackAttachProcess),
  3. perform the operation (read/write...),
  4. switch the address space back (KeUnstackDetachProcess),
  5. decrement reference count incremented by (1) (ObDereferenceObject).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文