【问题标题】:win32k.sys mapping address in the session space会话空间中的win32k.sys映射地址
【发布时间】:2011-06-12 11:28:11
【问题描述】:

我的问题:

当 win32k.sys 被加载到会话空间时,它在每个会话中得到相同的基地址吗?

详情:

我正在为 Windows(32 位)编写内核模式设备驱动程序。它在系统启动期间作为标准 WDM 驱动程序加载到系统空间(全局内核模式内存)中。

但在某些情况下,我需要访问由 win32k.sys 导出的函数。确切地说,我正在编写一种有时需要伪装成显示驱动程序的驱动程序。

可能不会静态导入这些函数(意味着通过可执行导入表导入它们)。这是因为 win32k.sys 是在创建会话的后期加载的。此外,它已加载到 会话空间

不过,我找到了解决方法。在会话创建期间,我动态导入所需的功能。我使用ZwQuerySystemInformationSystemModuleInformation 在当前会话中找到win32k.sys 的基地址。然后利用这个基地址分析找到win32k.sys的导出目录,得到需要的函数指针。

目前,对于每个会话,我都会保留一个单独的导入函数数组。然而实际上这些功能在所有会话中总是相同的。意思是——win32k.sys在每个会话中都映射到属于会话空间的同一个地址。

因此,我的问题是,是否可以保证 win32k.sys 将在所有会话中映射到相同的地址?

除了节省一些内存之外,这对我来说会更容易。目前为了调用这样的函数,我需要一个特定于会话的上下文来存储函数指针。

【问题讨论】:

    标签: windows session kernel driver


    【解决方案1】:

    我的经验是 win32k.sys 基地址在驱动程序映射的所有进程的上下文中是相同的。在其初始化期间,win32k.sys 调用ntoskrnl.exe 为桌面、窗口站和驱动程序使用的其他可能对象创建对象类型内核对象。这些内核对象在所有进程的上下文中必须位于相同的地址,以保持内核数据结构一致(例如,在ntoskrnl.exe 模块中存在指向所有对象类型对象的指针数组)。

    此外,win32k.sys 包含一个系统调用表 (win32k!W32pServiceTable)。表的地址再次存储在ntoskrnl.exe (nt!KeServiceDescriptorTableshadow) 中的固定位置。

    因此,如果 win32k.sys 驱动程序在不同会话中映射到不同地址,ntoskrnl.exe 的行为必须相同。这不是真的(这种行为会导致其他问题,例如,SYSENTER/SYSCALL)。但是我没有在任何官方文档中看到这个事实。

    【讨论】:

      【解决方案2】:

      我不太确定,但我想答案是肯定的。 Win32k.sys 只是另一个(特殊)dll 文件,Windows 上的每个 dll 文件在其 PE 头中都有一个基地址。对于Windows提供的win32k.sys(我认为),基地址不应与其他系统dll(.sys)文件冲突。

      为了安全起见,您可以让您的程序稍微灵活一些。一开始,您假设地址是相同的。但是你在实际打电话之前检查地址。这样,系统至少不会因为地址错误而挂起。

      【讨论】:

      • 这是有道理的。但是,我将无法以您建议的 灵活 方式编写程序。因为为了安全起见,我必须提供具有函数指针的每个会话上下文信息。这些指针在所有会话中通常都是相同的,这一事实对我没有太大帮助。
      • 好的。只是另一个想法。由于它是一个 .sys 文件,它驻留在内核空间中,并由所有用户级进程和会话共享。因此,它的地址应该是固定的。此外,我找不到任何情况下不同会话的地址会有所不同。为什么会有所不同?
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2012-03-02
      • 2017-05-06
      相关资源
      最近更新 更多