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

val*_*ldo 5 c windows 64-bit kernel driver

一旦我为Windows编写了一种驱动程序,它必须拦截本机显示驱动程序与操作系统的交互.本机显示驱动程序由一个微型端口驱动程序和一个由win32k.sys加载到会话空间的DLL组成.我的目标是介入win32k.sys和该DLL之间.此外,系统可能有几个显示驱动程序,我不得不挂钩它们.

我创建了一个标准的WDM驱动程序,它被配置为在系统启动时加载(即在win32k之前).在初始化期间,它ZwSetSystemInformation通过修补SSDT来连接.每当它将DLL加载/卸载到会话空间时,OS就会调用此函数,这正是我所需要的.

何时ZwSetSystemInformation使用SystemLoadImage参数调用- 其中一个参数是指向SYSTEM_LOAD_IMAGE结构的指针,它ModuleBase是模块基本映射地址.然后我分析映射的图像,用我的函数修补它的入口点,其余的很简单.

现在我需要将此驱动程序移植到64位Windows.毋庸置疑,这根本不是一项微不足道的任务.到目前为止,我发现了以下障碍:

  • 所有司机必须签名
  • PatchGuard技术
  • SSDT不直接导出.

如果我理解正确,可以关闭PatchGuard和驱动程序签名验证,驱动程序应该安装在专用机器上,我们可能会按照我们想要的方式折磨它.

据在线消息人士透露,还有一些技巧可以找到SSDT.

但是最近我发现存在一个叫做的函数PsSetLoadImageNotifyRoutine.它可以大大简化任务,并帮助避免肮脏的技巧.

我的问题是:

  • 如果我使用PsSetLoadImageNotifyRoutine,我会收到有关加载到会话空间的DLL的通知吗?官方文档谈到"系统空间或用户空间",但"系统空间"是否还包括会话空间?
  • 如果我要在映射修补映射的DLL映像,是否需要禁用PatchGuard ?
  • 还有更多我没想过的潜在问题吗?
  • 有没有其他方法可以实现我想要的?

提前致谢.

小智 2

如果我要在映射后修补映射的 DLL 映像,是否需要禁用 PatchGuard?

要在 x64 上加载任何驱动程序,必须对其进行签名。拥有管理员权限,您可以禁用 PatchGuard,我个人建议使用 DSEO,这是为此制作的 GUI 应用程序。或者,您可以通过覆盖 MBR(或 BIOS)来绕过 PatchGuard,尽管这通常被视为 bootkit - 恶意软件。