首页 文章

会话空间中的win32k.sys映射地址

提问于
浏览
3

我的问题:

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

细节:

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

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

may not 静态导入这些函数(意思是,通过可执行的导入表导入它们) . 这是因为在创建会话的后期阶段加载了win32k.sys . 而且,它被载入 session space .

不过我找到了解决方法 . 在会话创建期间,我动态导入所需的函数 . 我使用 ZwQuerySystemInformationSystemModuleInformation 来查找win32k.sys in the current session 的基址 . 然后使用这个基地址我分析它以找到win32k.sys的导出目录并获得所需的函数指针 .

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

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

除了节省一些内存,这将使我更容易 . 目前,为了调用这样的函数,我需要一个特定于会话的上下文,其中存储了函数指针 .

2 回答

  • 0

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

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

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

  • 2

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

    为了安全起见,您可以使程序有一点灵活性 . 一开始,您假设地址相同 . 但是,在实际调用之前,请检查地址 . 这样,系统不会因为地址不好而挂起,至少 .

相关问题