c# - 如何检测进程是否移动了鼠标光标而不是用户?
问题描述
可以通过调用mouse_event 函数或使用System.Windows.Forms.Cursor.Position属性来移动鼠标。我想知道的是,是否有可能知道使用我的软件的用户是否正在使用这些方法之一。
我知道可以检查用户的鼠标移动,例如,查看它是否发生得太快。但是我想知道是否还有其他更准确的方法,例如检查是否正在调用某个 WinApi 函数。
当鼠标被物理移动时,会触发 mouse_event 函数吗?
或者对 mouse_event 函数的调用是否会进行另一个系统调用并调用“物理鼠标移动”使用的实际函数?
解决方案
可以使用 API 调用SendInput()
或mouse_event()
. 为此,请使用SetWindowsHookEx()
设置低级鼠标挂钩。这个钩子过程被传递了一个MSLLHOOKSTRUCT,它的flags
成员指示鼠标事件是由代码注入的结果,还是用户输入的结果。
如果攻击者正在向您的应用程序发送鼠标消息,您可以从鼠标消息处理程序中调用InSendMessage 。真正的鼠标消息发布到消息队列。通常会发送假鼠标消息。如果InSendMessage
返回TRUE
,您可以确定收到了虚假的输入消息。如果攻击者确实发布了消息,您将不得不依靠识别实际输入设备状态和预期状态之间的不匹配。GetKeyState可用于此。
没有直接的方法来检测对SetCursorPos
. 单独来看,这些调用不会生成用户输入,也不能用于自动化应用程序。它们总是伴随着其他注入输入的方案,你知道如何识别它们。
推荐阅读
- php - 如何删除 UTF-32 字符?
- arrays - 将 firebase 中多个字典的值添加到 Int
- regex - 在powershell中将正则表达式捕获组的结果更改为小写
- api - 使用 webhook 在不和谐服务器上创建频道
- javascript - 无法读取未定义的属性“地图”。错误还原
- java - 如何在 Java 中制作应用程序图标进度指示器?
- apache-kafka - 使用 Kafka Connect 时如何转换所有时间戳字段?
- python-3.x - 如何用python求解线性方程组
- class - 如果参数编译时间不是实际类型,kotlin 的 javaclass.isPrimitive 会失败
- postgresql - 如何在没有 TLS 客户端身份验证的情况下通过 SSL 连接到 Google Cloud SQL?