【问题标题】:Global Keyboard Hook from windows service来自 Windows 服务的全局键盘挂钩
【发布时间】:2011-08-14 11:57:50
【问题描述】:

是否可以从 windows(xp 和 7) 服务编写全局键盘挂钩? (使用 SetWindowsHookEx 在系统服务中不起作用)

【问题讨论】:

    标签: .net c++ winapi windows-7 windows-services


    【解决方案1】:

    SetWindowsHookEx 的文档说:

    或与调用线程在同一桌面上的所有线程。

    所以你需要关联同一个桌面(即使不考虑终端服务也会有多个桌面:普通桌面、安全桌面(用于 UAC 和登录)和屏幕保护程序)。

    由于服务不与交互式会话相关联(并且,从 Windows V6 开始,不能),您需要用户会话中的一个进程来执行挂钩,并与后端服务通信(例如,通过命名管道)。并且不要忘记在没有人登录和多个用户登录的情况下进行测试。

    【讨论】:

      【解决方案2】:

      总结理查德所说的话(并添加我自己的评论): 您不能从 Windows Vista 开始的 Windows 服务直接设置全局键盘挂钩。但是,使用 Windows 服务仍然是一个合乎逻辑的选择,因为您将拥有设置全局挂钩的所有必要权限。您可以将您的权限复制到您在每个登录用户的会话中创建的子进程,以使您的子进程能够在他们自己的桌面/会话中设置全局挂钩,即使用户没有足够的权限。

      就个人而言,(假设您正在编写键盘记录器)而不是将所有记录的击键汇总到一个进程并将它们写入磁盘,让每个单独的进程根据其用户名写入单独的文件可能是有意义的。

      【讨论】:

      • 行不通的东西怎么会是一个“合乎逻辑的好选择”?是什么让您说服务具有很高的特权。这不是先验的。人们经常在高权限帐户下运行服务,但这只是惯例。
      • 拥有一个系统服务和多个登录的用户进程听起来不错,但如何将服务权限复制到用户进程?
      • 从服务间接设置挂钩是一个合乎逻辑的选择,因为默认的服务(是的,甚至到 Windows 7)使用一组权限运行,允许他们设置全局挂钩并获得他们的任何其他权限要求(SeTcbPrivilege -> 授权作为操作系统的一部分)。如果进程在服务调用期间由 svchost 组件加载,系统只会创建具有 SeTcbPrivilege 的进程。使用服务允许您设置全局挂钩,而不管您正在监视的交互式用户的权限如何,都允许其他用户使用其令牌。
      • 复制句柄()。您需要某种形式的 IPC 来协调和授权您的特定键盘记录子进程,这样其他应用程序就不会使用您的服务作为后门来提升权限。
      • 你将如何检测一个新的用户会话,然后在其中创建一个进程?我需要做类似的事情(我需要做一个响应“热键”的服务)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多