一旦我为Windows编写了一种驱动程序,它必须拦截本机显示驱动程序与操作系统的交互 . 本机显示驱动程序由一个微型端口驱动程序和一个由win32k.sys加载到会话空间的DLL组成 . 我的目标是介入win32k.sys和该DLL之间 . 此外,系统可能有几个显示驱动程序,我不得不挂钩它们 .
我创建了一个标准的WDM驱动程序,它被配置为在系统启动时加载(即在win32k之前) . 在初始化期间,它通过修补SSDT来连接 ZwSetSystemInformation
. 每当它将DLL加载/卸载到会话空间时,OS就会调用此函数,这正是我所需要的 .
当使用 SystemLoadImage
参数调用 ZwSetSystemInformation
时 - 其参数之一是指向 SYSTEM_LOAD_IMAGE
结构的指针,其 ModuleBase
是模块基本映射地址 . 然后我用我的函数分析映射的图像 patch 它的入口点,其余的很简单 .
现在我需要将此驱动程序移植到64位Windows . 毋庸置疑,这根本不是一项微不足道的任务 . 到目前为止,我发现了以下障碍:
-
必须签署所有司机
-
PatchGuard
-
SSDT未直接导出 .
如果我理解正确,可以关闭PatchGuard和驱动程序签名验证,驱动程序应该安装在专用机器上,我们可能会按照我们想要的方式折磨它 .
据在线消息人士透露,还有一些技巧可以找到SSDT .
但是最近我发现存在一个名为 PsSetLoadImageNotifyRoutine
的函数 . 它可以大大简化任务,并帮助避免肮脏的技巧 .
我的问题是:
-
如果我使用
PsSetLoadImageNotifyRoutine
,我是否会收到有关加载到会话空间的DLL的通知?官方文档谈到"system space or user space",但"system space"还包括会话空间吗? -
如果要修补已映射的映射的DLL映像,是否需要禁用PatchGuard?
-
还有没有我想到的潜在问题吗?
-
还有其他方法可以达到我的目的吗?
提前致谢 .
1 回答
要在x64上加载任何驱动程序,必须对其进行签名 . 使用管理员权限,您可以禁用PatchGuard,我个人建议使用DSEO,这是一个为此而设计的GUI应用程序 . 或者您可以通过覆盖MBR(或BIOS)来绕过PatchGuard,尽管这通常被认为是一个bootkit - 恶意软件 .