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

val*_*ldo 5 windows session kernel driver

我的问题:

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

细节:

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

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

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

尽管如此,我还是找到了解决方法。在会话创建期间,我动态导入所需的函数。我使用ZwQuerySystemInformationwith来查找当前会话中SystemModuleInformationwin32k.sys 的基地址。然后使用这个基地址对其进行分析以找到win32k.sys的导出目录并获取所需的函数指针。

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

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

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

Jia*_*ang 0

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

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