Windows服务中的全局键盘钩子

8

在Windows(XP和7)服务中编写全局键盘钩子是否可行?(使用SetWindowsHookEx无法从系统服务中工作)

2个回答

12
SetWindowsHookEx的文档说明如下:

或使用与调用线程在同一个桌面中的所有线程。

因此,您需要与相同的桌面相关联(即使不考虑终端服务,仍会存在多个桌面:普通桌面、安全桌面(用于UAC和登录)和屏幕保护程序)。

由于服务未与交互式会话关联(自Windows V6起也不能),因此您需要在用户会话内使用一个进程进行挂钩,并与后端服务通信(例如通过命名管道)。还要记得在无人登录和多个用户登录时进行测试。


6
总结一下Richard说的话(并添加我的评论):您无法直接从Windows服务中设置全局键盘钩子,从Windows Vista开始。但是,仍然将使用Windows服务作为逻辑选择,因为您将拥有设置全局钩子所需的所有必要特权。您可以复制您的特权到每个已登录用户会话中创建的子进程中,以使您的子进程能够在其自己的桌面/会话中设置全局钩子,即使用户没有足够的特权也可以实现。个人而言(假设您正在编写键盘记录器),与其将所有记录的按键聚合到一个进程中并将它们写入磁盘,不如让每个单独的进程根据其用户名编写单独的文件。

1
一件不起作用的事情怎么可能是“合乎逻辑的选择”呢?而且是什么让你说一个服务具有高度特权?这并非先验所能得出的结论。人们经常使用高权限帐户运行服务,但那只是惯例。 - David Heffernan
拥有一个系统服务和多个已登录用户进程听起来是个好主意,但我该如何将服务的特权复制到用户进程中呢? - jacob
1
间接地从服务中设置钩子是一个逻辑上的选择,因为服务默认情况下(是的,即使在Windows 7上)以一组特权运行,允许它们设置全局钩子并获得所需的任何其他特权(SeTcbPrivilege -> 作为操作系统的一部分进行操作的权限)。只有在服务调用期间由svchost组件加载进程时,系统才会使用SeTcbPrivilege创建进程。使用服务允许您设置全局钩子,而不管您正在监视的交互式用户的特权如何,因为它允许其他用户使用其令牌。 - subwar
DuplicateHandle()。为了协调和授权您的特定键盘记录器子进程,以便其他应用程序不能将您的服务用作后门来提升权限,您需要某种形式的IPC。 - subwar
你会如何检测新用户会话并在其中创建一个进程?我需要做类似于此的事情(我需要制作一个响应“热键”的服务)。 - Tim Long

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