一次,我写了一个Windows的驱动程序,需要拦截本地显示驱动和操作系统之间的交互。本地显示驱动由一个miniport驱动和一个由win32k.sys加载到会话空间中的DLL组成。我的目标是在win32k.sys和那个DLL之间加入介质。此外,系统可能有多个显示驱动程序,我需要钩住它们全部。
我创建了一个标准的WDM驱动程序,配置为在系统启动时加载(即在win32k之前)。在初始化过程中,我通过修补SSDT钩住了ZwSetSystemInformation。每当操作系统将DLL加载/卸载到会话空间时,该函数将被调用,正好符合我的要求。
当ZwSetSystemInformation被使用SystemLoadImage参数调用时,其中一个参数是指向SYSTEM_LOAD_IMAGE结构的指针,其ModuleBase是模块基映射地址。然后我分析了映射的映像,patched其入口点与我的函数,其余部分就很简单了。
现在我需要将这个驱动程序移植到64位Windows上,这当然不是一件简单的任务。到目前为止,我发现以下障碍:
1.所有驱动程序必须签名;
2.PatchGuard;
3.SSDT没有直接导出。
如果我理解正确,PatchGuard和驱动程序签名验证可以关闭,在专用机器上安装驱动程序,然后我们可以随心所欲地对其进行折腾。
网上有技巧来定位SSDT。
然而,最近我发现存在一个名为PsSetLoadImageNotifyRoutine的函数。它可能会显着简化任务,并帮助避免肮脏的技巧。
我的问题是:
1.如果我使用PsSetLoadImageNotifyRoutine,我是否会收到关于加载到会话空间的DLL的通知?官方文档谈到“系统空间或用户空间”,但“系统空间”是否也包括会话空间?
2.如果我打算在映射DLL图像之后修补它,我需要禁用PatchGuard吗?
3.有没有其他潜在问题我没有考虑到的?
4.有没有其他实现我想要的功能的方法?
提前感谢您的回答。
我创建了一个标准的WDM驱动程序,配置为在系统启动时加载(即在win32k之前)。在初始化过程中,我通过修补SSDT钩住了ZwSetSystemInformation。每当操作系统将DLL加载/卸载到会话空间时,该函数将被调用,正好符合我的要求。
当ZwSetSystemInformation被使用SystemLoadImage参数调用时,其中一个参数是指向SYSTEM_LOAD_IMAGE结构的指针,其ModuleBase是模块基映射地址。然后我分析了映射的映像,patched其入口点与我的函数,其余部分就很简单了。
现在我需要将这个驱动程序移植到64位Windows上,这当然不是一件简单的任务。到目前为止,我发现以下障碍:
1.所有驱动程序必须签名;
2.PatchGuard;
3.SSDT没有直接导出。
如果我理解正确,PatchGuard和驱动程序签名验证可以关闭,在专用机器上安装驱动程序,然后我们可以随心所欲地对其进行折腾。
网上有技巧来定位SSDT。
然而,最近我发现存在一个名为PsSetLoadImageNotifyRoutine的函数。它可能会显着简化任务,并帮助避免肮脏的技巧。
我的问题是:
1.如果我使用PsSetLoadImageNotifyRoutine,我是否会收到关于加载到会话空间的DLL的通知?官方文档谈到“系统空间或用户空间”,但“系统空间”是否也包括会话空间?
2.如果我打算在映射DLL图像之后修补它,我需要禁用PatchGuard吗?
3.有没有其他潜在问题我没有考虑到的?
4.有没有其他实现我想要的功能的方法?
提前感谢您的回答。
PsSetLoadImageNotifyRoutine
拦截视频驱动程序 DLL(而不是其 miniport 驱动程序)加载到会话中。如果您想了解更多细节,请与我联系。 - valdo