我从谷歌搜索方法开始,其中一些游戏(如Valorant)会阻止虚拟输入,并看到很多帖子说您可以将Windows api函数SetWindowsHookEx与WH_KEYBOARD_LL一起使用,以检查确定输入是否为假的LLKHF_INJECTED标志。我在游戏上使用x64dbg调试器在SetWindowsHookEx上设置了断点,并检查是否正在使用WH_KEYBOARD_LL,并且没有使用WH_KEYBOARD_LL,所以这是死路一条。这是第一天,我放弃了,假设其他人会提出解决方案。
我觉得这与原始输入有关,因此看起来很有希望。在IDA Pro中加载了游戏,IDA Pro是一种非常流行的反汇编程序/反编译器,这就是我的屏幕截图。检查游戏是否使用了GetRawInputData,并且确实使用过一次。我环顾了与反编译器一起使用的代码,因此不必阅读汇编。在附近看到另一个对GetRawInputDeviceInfoW的呼叫并对其进行了搜索-https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-getrawinputdeviceinfow
游戏似乎正在使用此功能来确定WM_INPUT当前处理的原始输入事件是键盘还是鼠标。再次使用x64dbg打破了这一点,并注意到该函数正在返回错误,并且游戏没有对其进行处理,因此游戏无法确定它是键盘还是鼠标,并停止处理该事件。仍然不完全知道为什么,但是正在返回的HANDLE GetRawInputData传递给GetRawInputDeviceInfoW为零/无效-导致该错误。然后在msdn docs上,我注意到从GetRawInputData返回的RAWINPUTHEADER已经包含确定键盘/鼠标是否为信息-RIM_TYPEMOUSE 0 / RIM_TYPEKEYBOARD 1。
因此,我注意到他们从来不需要首先使用GetRawInputDeviceInfoW。十六进制更改只会使其忽略从GetRawInputDeviceInfoW返回的内容,而是使用已经通过相当基本的x86汇编知识从GetRawInputData获得的信息。