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