检测模拟键盘/鼠标输入
Posted
技术标签:
【中文标题】检测模拟键盘/鼠标输入【英文标题】:Detecting simulated keyboard/mouse input 【发布时间】:2010-12-29 11:43:35 【问题描述】:有没有办法检测 Windows 上的模拟键盘/鼠标输入。例如,用户在他的键盘与 sendKeys/PostMessage/On-screen 键盘上键入一些东西。有什么方法可以区分这两者吗?
编辑:也许一个例子会有所帮助。我正在制作游戏,想区分真实输入与 WinAPI 合成键盘/鼠标消息。
【问题讨论】:
这是一个相当有趣的问题,因为如果答案是肯定的,我几乎可以看到其他人在问:如何防止应用程序检测合成输入? @Lambert:这很简单,到目前为止我有五个答案。 (A) 虚拟键盘设备驱动程序 (B) 虚拟机 (C) PS/2 击键生成器 (D) 机械臂按下“真实”键盘上的键 (E) pitching machine @Lambert:我真的只是想找个借口来发个 animusic 的链接 :) @Ben:是的,我真的很喜欢这些,我在 KQED 的电视上看过它们。制作它们的人一定非常有才华。 :) 哈哈,增加内存,你就拥有了一台图灵机! 【参考方案1】:区分“真实”输入和“模拟”输入(假设它是使用keybd_event()
/mouse_event()
或SendInput()
生成的)的唯一方法是通过@ 使用低级键盘/鼠标挂钩987654324@。 WH_KEYBOARD_LL
和 WH_MOUSE_LL
挂钩回调为模拟输入提供 INJECTED
标志。
【讨论】:
【参考方案2】:从 Windows 8 开始,有 GetCurrentInputMessageSource
函数。您可以使用它,并检查 originId
枚举以获取以下值:
IMO_INJECTED
- 输入消息已被一个应用程序注入(通过SendInput
函数),该应用程序在其清单文件中没有将 UIAccess 属性设置为TRUE
。
【讨论】:
【参考方案3】:我可能错了,但屏幕键盘(和其他模拟用户输入的应用程序)很可能使用了 SendInput API:
SendInput 在输入堆栈的底层运行。它只是进入键盘和鼠标驱动程序用来告诉窗口管理器用户已生成输入的相同输入机制的后门。 来源:http://blogs.msdn.com/b/oldnewthing/archive/2010/12/21/10107494.aspx
因此,可能无法判断输入是否来自“真实”键盘。
【讨论】:
“来自真正的键盘”甚至还不够。 Dave 想知道是不是用户在他的键盘上打字(我想,不是机械臂在同一个键盘上按下按键)。 还有ofc,你可以用rootkit的方式来做这件事,钩住系统的SendInput API,并确保它永远不会触及你的应用程序。您甚至可以为此使用用户态 rootkit,挂钩所有其他用户态进程的 SendInput。 "因此可能无法判断输入是否来自“真实”键盘" - 实际上,有。看我的回答。以上是关于检测模拟键盘/鼠标输入的主要内容,如果未能解决你的问题,请参考以下文章