Windows 7 驱动程序钩取

3
我的问题涉及Windows 7驱动程序开发。
我需要拦截对驱动程序的系统调用。理论上,在这种情况下,建议创建一个过滤器驱动程序,但在我的情况下,驱动程序没有公开过滤兼容接口。具体来说,它是一个Vista / 7显示迷你端口驱动程序。
显示驱动程序作为标准WDM驱动程序加载。在其DriverEntry中,预计调用一个DxgkInitialize系统例程(我想是由win32k.sys导出)。我的目标是拦截这个调用。
有人能向我建议任何有用的信息源吗?如何实现这一点?
胜利的关键可能是将可执行文件导入节中的DxgkInitialize替换为我的函数地址。问题是,这应该在加载可执行文件之后(映射+重定位,必要时+准备所有导入表条目),但在驱动程序的入口点调用之前。
我考虑了以下选项:
  • 将可执行文件映射到系统内存中,并手动“准备”它(即执行加载程序的工作)。然后修补所需的功能并运行入口点。
  • 可以使用一些努力进行模块加载ZwSetSystemInformation(?)
  • 可能会修补导出DxgkInitialize的模块的导出部分。这样,加载程序将自动将每个加载的模块重定向到我的手中。
提前致谢。

1
即使您做得完美无缺,64位系统仍然会出现蓝屏。Windows Vista和7专门寻找在加载后被修改的代码。一种更安全的替代方法是在磁盘上替换驱动程序的导入表,并更改从中进行导入的模块名称,但64位Windows也不会加载没有有效签名的驱动程序,如果您编辑导入表,则签名将无效。 - Ben Voigt
@Ben Voigt:谢谢,我明白你的观点。但是我想知道“代码修改检测”是如何工作的。当可执行文件被加载时,它会被加载器更改。特别是它的导入部分。如果我再次更改它,然后立即恢复到原始状态(在驱动程序调用该函数之后),会发生什么? - valdo
1
@valdo:我可能高估了KPP的干扰程度。"它不能防止一个设备驱动程序修补另一个" 特别是看一下Skywing的工作,非常出色。根据您的目标,我认为您应该编写一个"镜像显示驱动程序",它得到更好的支持,不需要干涉其他内核模块的内部,因此应该更加稳定和可组合。 - Ben Voigt
1
@valdo:这个链接似乎是一个很好的总结。可能没有你不知道的内容。如果不能接受失去Aero效果,我建议钩取dwm.exe,因为所有WDDM绘图都会通过它进行,而且使用用户模式钩取的话,系统不太可能变得不稳定。 - Ben Voigt
PatchGuard不检查驱动程序的内存。它仅适用于内核。 - Sergey Podobry
显示剩余3条评论
1个回答

0

你没有提供业务原因,所以我不想说出什么过分的话。但是如果涉及到挂钩调用,你应该重新考虑你的技术方案。

我会采取的步骤可能包括:

  1. 谁导出了 DxgkInitialize? 不要猜测 win32k,查一下。 (我不会给你答案)。也许你可以轻松地挂钩被调用者而不是调用者。

  2. 我是否有任何回调可以在驱动程序模块加载但尚未初始化时进行? 查找 PsSetLoadImageNotifyRoutine。也许它会为您提供适当的时间段来修补驱动程序的 IAT(如果您不知道 Import Address table 是什么,请重新考虑挂钩)。

从评论中我看到你主要关心“监视显示活动” 。我不能确定你完全控制电脑是否允许这样做。但是为了问题的完整性,让我们假设这是合法的。

根据您想要获得的分辨率,您不需要驱动程序。实际上,您几乎不需要DLL。查找窗口钩子以获取部分解决方案和可访问性回调。


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