内核模式驱动程序可以在任何进程上执行读取进程内存吗?
Can Kernel mode driver do ReadProcessMemory on any process?
我目前正在使用 KMDF 编写内核模式驱动程序(软件驱动程序(,由于我对这个主题非常陌生,我想问你我的驱动程序是否能够在任何正在运行的进程中调用 OpenProcess 和 ReadProcessMemory,或者有没有办法防止我的驱动程序可以从内核模式在进程上调用这些函数?
您可以通过调用PsLookupProcessByProcessId
来获取目标进程指针。 而不是调用KeStackAttachProcess
和直接读取进程内存。 因为这是用户模式内存 - 强制在__try/__except
块中执行此操作。 最后调用目标进程的KeUnstackDetachProcess
和ObfDereferenceObject
根据 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建议的路径。就个人而言,我会接受他的建议,因为这是一种记录在案的方法,并且您可能会在实现它时取得更大的成功(更不用说您将有更少的工作要做(。
- 编写一个读取五个整数并执行一些任务的C++程序
- C++ mProtect 用于读取、写入和执行
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- 内核模式驱动程序可以在任何进程上执行读取进程内存吗?
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- 如何从控制台启动可执行文件并使用Qt读取输出
- 有什么方法可以在C++中读取文本并执行这样的代码命令吗?
- 是否可以在使用 Boost::asio 之前从套接字读取后执行async_handshake
- 从文件中读取数据并在C 中执行矩阵乘法
- 从文件中读取运算符并执行操作C++
- 双击编译C++ Unix 可执行文件不会打开现有文件以从中读取信息
- 执行带有参数的 .bat 文件并以 C++ 格式读取控制台输出
- 读取函数由 main 调用,但不执行
- 读取双打和单词,并根据阅读内容执行动作
- 正在从可执行资源中读取位图
- 为什么要使用select()调用对inotify实例执行选择性读取
- 如何制作进程以及它们执行不同的分配任务,例如使用fork读取文件或写入文件
- 如何在vc++中执行从安装目录中读取数据的应用程序
- 当读取超过500000个整数时,c++程序无法执行
- 使用boost(C++库)读取执行命令的结果