Windows 显示驱动程序钩取,64 位

5
一次,我写了一个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.有没有其他实现我想要的功能的方法?
提前感谢您的回答。

我认为你提出的替代方案是一种叫做镜像驱动程序的东西。它用于通过RDP等远程桌面连接。它实际上允许存在一个新的窗口会话,应用程序连接并在其上呈现。该驱动程序通过魔法将绘图指令复制到远程客户端上。Google可以告诉你更多信息。 - Tra5is
@valdo,你找到一种将显示驱动程序加载到会话中而不是标准RDP显示驱动程序的方法了吗?我正在尝试弄清楚如何告诉Windows在不同的会话中加载不同的显示驱动程序,而不是加载正常的驱动程序。我需要知道的是终端服务如何单独加载其驱动程序与普通控制台驱动程序不同。我已经搜索了几天,但无法弄清楚如何做到这一点,而你似乎有一个好主意。我不需要替换终端服务DD,我正在创建需要在会话中加载不同驱动程序(如RDs)的软件。 - user1632018
@user1632018 目前我发现最干净的方法是使用 PsSetLoadImageNotifyRoutine 拦截视频驱动程序 DLL(而不是其 miniport 驱动程序)加载到会话中。如果您想了解更多细节,请与我联系。 - valdo
那太好了。不过你的个人资料没有联系信息。我有一些想法可以完成这项工作,但最好先知道你是否尝试过它们。你有可以联系你的电子邮件吗? - user1632018
@user1632018 请随时通过vgelfer@gmail.com与我联系。 - valdo
显示剩余3条评论
1个回答

2

如果我打算在映射后对映射的DLL镜像进行修补,那么我需要禁用PatchGuard吗?

x64上加载任何驱动程序都必须签名。您可以使用管理员权限禁用PatchGuard,我个人建议使用专门为此设计的GUI应用程序DSEO。或者您可以通过覆盖MBR(或BIOS)来绕过PatchGuard,但这通常被认为是引导工具包(恶意软件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接