【发布时间】:2014-04-28 18:22:31
【问题描述】:
我正在编写一个内核驱动程序,它应该读取(并且在某些情况下,还写入)内核会话空间 (win32k.sys) 中的一些内存地址。我读过另一个主题,例如在 Windbg 中,我应该将上下文更改为随机用户进程以读取内核会话空间的内存(使用 .process /p)。我怎样才能在内核驱动程序中做到这一点?我应该创建一个与驱动程序通信的用户进程(这是我现在的想法,但我希望有更好的解决方案)还是有一个更简单的解决方案?
【问题讨论】:
我正在编写一个内核驱动程序,它应该读取(并且在某些情况下,还写入)内核会话空间 (win32k.sys) 中的一些内存地址。我读过另一个主题,例如在 Windbg 中,我应该将上下文更改为随机用户进程以读取内核会话空间的内存(使用 .process /p)。我怎样才能在内核驱动程序中做到这一点?我应该创建一个与驱动程序通信的用户进程(这是我现在的想法,但我希望有更好的解决方案)还是有一个更简单的解决方案?
【问题讨论】:
内核内存空间在所有内核对象之间共享(就像 DOS 和早期 Windows 版本中的真实/不受保护模式一样)。内核驱动程序可以访问内核空间内的任何地址,无论它是否属于他。
【讨论】:
会话空间未映射到系统地址空间(驱动程序共享,如果未附加到任何进程)。这些是您在访问 win32k 时获得 BSOD 的原因。
您需要通过 KeStackAttachProcess 附加到 EPROCESS 才能执行此操作。您可以使用 ZwQueryInformationProcess(ProcessSessionInformation) 函数获取会话 ID。
【讨论】:
您必须找到并附加到 csrss 进程! win32k.sys 没有加载到所有进程的系统地址空间,只针对 csrss。
您应该将堆栈附加到 csrss 进程。
【讨论】: