内核模式驱动程序可以在任何进程上执行 ReadProcessMemory 吗?
Can Kernel mode driver do ReadProcessMemory on any process?
我目前正在使用 KMDF 编写内核模式驱动程序(软件驱动程序),因为我对这个主题很陌生,所以我想问你我的驱动程序是否能够在任何 运行 进程或者有什么方法可以防止我的驱动程序可以从内核模式调用进程上的那些函数?
根据 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
);
您可以通过调用目标进程PsLookupProcessByProcessId
. than call KeStackAttachProcess
and direct read process memory. because this is user mode memory - mandatory do it in __try/__except
block. finally call KeUnstackDetachProcess
and ObfDereferenceObject
来获取目标进程指针
您有 NtReadVirtualMemory,但内核模式下没有 Zw* 版本,这意味着您将不得不自己定位地址(使用 KeServiceDescriptorTable 可以,但内存扫描也是一种选择)。
记住,如果你想使用任何内核模式地址,你需要将当前线程的 PreviousMode 设置为 0 (KernelMode) 如果你碰巧在一个非内核线程(例如,在回调例程中,您可能会被置于 NTOSKRNL 以外的另一个进程的上下文中)。这是 Zw* 例程将在内核模式下自动为您执行的操作,但显然正如我已经说过的,在内核模式下没有用于 NtReadVirtualMemory 的例程(我猜微软只是不想让您使用它).
第二种方法是附加到您想要读取其内存的进程的上下文,然后依靠 MmCopyMemory(记录在 MSDN 中)从有效地址复制内存您刚刚附加到您自己的缓冲区的过程。然后你可以从你自己的缓冲区访问复制的内存。记得拆。
或者,您可以采用@RbMm 建议的路径。就我个人而言,我会采纳他的建议,因为它是一种记录在案的方法,并且您可能会在实施它时取得更大的成功(更不用说您要做的工作会更少)。
我目前正在使用 KMDF 编写内核模式驱动程序(软件驱动程序),因为我对这个主题很陌生,所以我想问你我的驱动程序是否能够在任何 运行 进程或者有什么方法可以防止我的驱动程序可以从内核模式调用进程上的那些函数?
根据 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
);
您可以通过调用目标进程PsLookupProcessByProcessId
. than call KeStackAttachProcess
and direct read process memory. because this is user mode memory - mandatory do it in __try/__except
block. finally call KeUnstackDetachProcess
and ObfDereferenceObject
来获取目标进程指针
您有 NtReadVirtualMemory,但内核模式下没有 Zw* 版本,这意味着您将不得不自己定位地址(使用 KeServiceDescriptorTable 可以,但内存扫描也是一种选择)。
记住,如果你想使用任何内核模式地址,你需要将当前线程的 PreviousMode 设置为 0 (KernelMode) 如果你碰巧在一个非内核线程(例如,在回调例程中,您可能会被置于 NTOSKRNL 以外的另一个进程的上下文中)。这是 Zw* 例程将在内核模式下自动为您执行的操作,但显然正如我已经说过的,在内核模式下没有用于 NtReadVirtualMemory 的例程(我猜微软只是不想让您使用它).
第二种方法是附加到您想要读取其内存的进程的上下文,然后依靠 MmCopyMemory(记录在 MSDN 中)从有效地址复制内存您刚刚附加到您自己的缓冲区的过程。然后你可以从你自己的缓冲区访问复制的内存。记得拆。
或者,您可以采用@RbMm 建议的路径。就我个人而言,我会采纳他的建议,因为它是一种记录在案的方法,并且您可能会在实施它时取得更大的成功(更不用说您要做的工作会更少)。