【问题标题】:Can Kernel mode driver do ReadProcessMemory on any process?内核模式驱动程序可以在任何进程上执行 ReadProcessMemory 吗?
【发布时间】:2018-06-02 06:17:11
【问题描述】:

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

【问题讨论】:

  • 这是XY Problem。你真正想解决什么问题?
  • 这很奇怪。你问这是否可以做到,然后问是否可以预防。是哪个?
  • 我想创建一种防病毒应用程序,它应该可以访问所有进程的内存,并且我想避免其他进程(我知道一些恶意软件或游戏会这样做)禁止我的驱动程序扫描它们签名内存
  • 我希望你喜欢蓝色 :)

标签: c++ winapi driver kmdf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    根据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
    );
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-01-17
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 2016-05-30
        • 2018-07-29
        • 1970-01-01
        • 2018-05-07
        相关资源
        最近更新 更多