【问题标题】:Reach kernel session space from kernel driver从内核驱动程序到达内核会话空间
【发布时间】:2014-04-28 18:22:31
【问题描述】:

我正在编写一个内核驱动程序,它应该读取(并且在某些情况下,还写入)内核会话空间 (win32k.sys) 中的一些内存地址。我读过另一个主题,例如在 Windbg 中,我应该将上下文更改为随机用户进程以读取内核会话空间的内存(使用 .process /p)。我怎样才能在内核驱动程序中做到这一点?我应该创建一个与驱动程序通信的用户进程(这是我现在的想法,但我希望有更好的解决方案)还是有一个更简单的解决方案?

【问题讨论】:

    标签: c windows kernel driver


    【解决方案1】:

    内核内存空间在所有内核对象之间共享(就像 DOS 和早期 Windows 版本中的真实/不受保护模式一样)。内核驱动程序可以访问内核空间内的任何地址,无论它是否属于他。

    【讨论】:

    • 是的,我也知道,但是我必须做错事。 (我是 Windows 内核驱动程序领域的初学者)我执行以下操作:首先我得到 win32k.sys 基地址(例如在 Windows XP SP3 中它是 0xbf800000)。然后我想读取这个地址中的内容,然后砰——蓝屏(PAGE_FAULT_IN_NONPAGED_AREA,已引用无效系统内存)。 MmIsAddressValid 函数也返回 false。
    • 那是另一个问题。内核中的代码以不同的 IRQL 执行。如果访问分页内存,则需要 IRQL 不高于 APC LEVEL,否则会出现 BSOD。在此处查看最常见 IRQL 的简短摘要:msdn.microsoft.com/en-us/library/windows/hardware/…。您可以提高/降低 IRQL,但不建议这样做
    • 据我所知,在我的驱动程序执行的任何操作期​​间,我都处于 PASSIVE_LEVEL。
    【解决方案2】:

    会话空间未映射到系统地址空间(驱动程序共享,如果未附加到任何进程)。这些是您在访问 win32k 时获得 BSOD 的原因。

    您需要通过 KeStackAttachProcess 附加到 EPROCESS 才能执行此操作。您可以使用 ZwQueryInformationProcess(ProcessSessionInformation) 函数获取会话 ID。

    【讨论】:

      【解决方案3】:

      您必须找到并附加到 csrss 进程! win32k.sys 没有加载到所有进程的系统地址空间,只针对 csrss。

      您应该将堆栈附加到 csrss 进程。

      【讨论】:

        猜你喜欢
        • 2013-02-23
        • 1970-01-01
        • 2015-09-06
        • 2012-05-12
        • 1970-01-01
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多