内核模式驱动程序可以在任何进程上执行读取进程内存吗?

Can Kernel mode driver do ReadProcessMemory on any process?

本文关键字:读取 执行 取进程 内存 进程 驱动程序 模式 任何 内核      更新时间:2023-10-16

我目前正在使用 KMDF 编写内核模式驱动程序(软件驱动程序(,由于我对这个主题非常陌生,我想问你我的驱动程序是否能够在任何正在运行的进程中调用 OpenProcess 和 ReadProcessMemory,或者有没有办法防止我的驱动程序可以从内核模式在进程上调用这些函数?

您可以通过调用PsLookupProcessByProcessId来获取目标进程指针。 而不是调用KeStackAttachProcess和直接读取进程内存。 因为这是用户模式内存 - 强制在__try/__except块中执行此操作。 最后调用目标进程的KeUnstackDetachProcessObfDereferenceObject

根据 https://github.com/Zer0Mem0ry/KernelBhop/blob/master/Driver/Driver.c,您需要使用未记录的MmCopyVirtualMemory来读取和写入任何进程。

NTSTATUS NTAPI MmCopyVirtualMemory
(
PEPROCESS SourceProcess,
PVOID SourceAddress,
PEPROCESS TargetProcess,
PVOID TargetAddress,
SIZE_T BufferSize,
KPROCESSOR_MODE PreviousMode,
PSIZE_T ReturnSize
);

你有 NtReadVirtualMemory,但在内核模式下没有 Zw* 版本,这意味着你必须自己找到地址(使用 KeServiceDescriptorTable 可以工作,但内存扫描也是一种选择(。

请记住,如果要使用任何内核模式地址,则需要将当前线程的 PreviousMode 设置为 0 (KernelMode(,如果您碰巧在非内核线程的上下文中执行(例如,在回调例程中,您可能会被置于 NTOSKRNL 以外的另一个进程的上下文中(。这就是 Zw* 例程在内核模式下自动为您执行的操作,但显然正如我已经说过的,内核模式下没有用于 NtReadVirtualMemory 的例程(Microsoft只是不希望您使用它我猜(。

第二种方法是附加到要读取其内存的进程的上下文,然后依靠 MmCopyMemory(记录在 MSDN 中(将内存从刚刚附加到的进程的有效地址复制到您自己的缓冲区。然后,您可以从自己的缓冲区访问复制的内存。记得拆开。

或者,您可以采用@RbMm建议的路径。就个人而言,我会接受他的建议,因为这是一种记录在案的方法,并且您可能会在实现它时取得更大的成功(更不用说您将有更少的工作要做(。