win32k.sys 映射地址

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值