首页 文章

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

提问于
浏览
5

一旦我为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 回答

  • 2

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

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

相关问题