windows - session 空间中的 win32k.sys 映射地址
原文 标签 windows session kernel driver
我的问题:
当 win32k.sys 加载到 session 空间时,它是否在每个 session 中获得相同的基地址?
细节:
我正在为 Windows(32 位)编写内核模式设备驱动程序。它作为标准 WDM 驱动程序加载到 系统空间 (全局内核模式内存)在系统启动期间。
但是在某些情况下,我需要访问由 win32k.sys 导出的函数。确切地说,我正在编写一种有时需要伪装成显示驱动程序的驱动程序。
我可能不会 静态导入这些函数(意味着通过可执行导入表导入它们)。这是因为在创建 session 的后期阶段会加载 win32k.sys。此外,它已加载到 session 空间 .
不过我已经找到了解决方法。在 session 创建期间,我动态导入所需的函数。我用 ZwQuerySystemInformation与 SystemModuleInformation找到win32k.sys的基地址在本届 session .然后用这个基地址分析,找到win32k.sys的导出目录,得到需要的函数指针。
目前,对于每个 session ,我都会保留一个单独的导入函数数组。然而实际上这些功能在所有 session 中总是相同的。意思是——win32k.sys 被映射到每个 session 中属于 session 空间的同一个地址。
因此,我的问题是,是否可以保证 win32k.sys 将在所有 session 中映射到相同的地址?
除了节省一些内存之外,这将使我更轻松。目前为了调用这样的函数,我需要一个存储函数指针的特定于 session 的上下文。
最佳答案
我的经验是 win32k.sys 在驱动程序映射的所有进程的上下文中,基地址是相同的。在初始化期间, win32k.sys 电话ntoskrnl.exe为桌面、窗口站和驱动程序使用的其他可能的对象创建对象类型内核对象。这些内核对象必须在所有进程的上下文中位于相同的地址,以保持内核数据结构一致(例如,在 ntoskrnl.exe 模块中有一个指向所有对象类型对象的指针数组)。
此外, win32k.sys 包含一个系统调用表 ( win32k!W32pServiceTable )。表的地址再次存储在 ntoskrnl.exe 中的固定位置。 ( nt!KeServiceDescriptorTableshadow )。
所以,如果 win32k.sys 驱动程序被映射到不同 session 中的不同地址,ntoskrnl.exe必须表现相同。而事实并非如此(这种行为会导致其他问题,例如 SYSENTER/SYSCALL )。但我没有在任何官方文档中看到这个事实。
关于windows - session 空间中的 win32k.sys 映射地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6321677/