如何使用编程语言模拟键鼠输入 解决游戏拦截模拟输入问题
问题背景
常规键鼠模拟方案在记事本等普通桌面程序中可正常运行,但在特定带反作弊的游戏中完全失效,本质原因是这类游戏会过滤用户态API生成的、带注入标记的模拟输入信号。目前已验证无效的两种实现如下:
- C++ 调用
SendInput实现
#include <future> #include<Windows.h> using namespace std::chrono; using namespace std::this_thread; using namespace std; UINT PressKeyScan(WORD scanCode) { INPUT input[1] = { 0 }; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = NULL; input[0].ki.wScan = scanCode; input[0].ki.dwFlags = KEYEVENTF_SCANCODE ; UINT ret = SendInput(1, input, sizeof(INPUT)); return ret; } UINT ReleaseKeyScan(WORD scanCode) { INPUT input[1] = { 0 }; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = NULL; input[0].ki.wScan = scanCode; input[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; UINT ret = SendInput(1, input, sizeof(INPUT)); return ret; } int main() { for (size_t i = 0; i < 100; i++) { PressKeyScan(0x39); sleep_for(milliseconds(100)); ReleaseKeyScan(0x39); sleep_for(milliseconds(100)); } }
- C# WinForms 调用
SendKeys实现
private void btnSendKeys_Click(object sender, EventArgs e) { int iHandle = NativeWin32.FindWindow(null, txtTitle.Text); NativeWin32.SetForegroundWindow(iHandle); string keys = ""; string space = " "; for (int i = 0; i < lbKeys.Items.Count; i++) { if (lbKeys.Items[i].Text.ToString() == "{SPACE}") { keys += space; } else { keys += lbKeys.Items[i].Text.ToString(); } } System.Windows.Forms.SendKeys.Send(keys); }
可绕过拦截的实现方案
你之前用的SendInput、SendKeys以及更早的keybd_event、窗口消息发送方案,都属于用户态输入接口,生成的输入事件会携带LLMHF_INJECTED标记,几乎所有带反作弊的游戏都会直接过滤这类事件,完全不会传入游戏的输入处理逻辑。可落地的绕过方案按稳定性从高到低排序如下:
- 硬件级模拟
用Arduino、CH552等单片机开发板,刷入自定义HID固件,模拟成真实的USB键鼠外设接入电脑,直接从硬件层面发送输入报文。这种方案生成的输入和手动按实体键盘鼠标的信号完全一致,所有软件层面的输入检测都无法区分,不存在被识别为模拟输入的可能,是最稳妥的方案,唯一缺点是需要额外采购硬件。 - 虚拟HID驱动级模拟
在系统内核层虚拟一个HID键鼠设备,通过虚拟设备向系统输入栈上报输入事件,这类事件不会携带用户态注入标记,反作弊很难和真实硬件输入区分。优先选择成熟开源的虚拟HID框架实现,不要使用来源不明的钩子类驱动,避免被反作弊判定为恶意程序。
注意不要用固定间隔的输入逻辑,你代码里写死100ms按键间隔、100ms抬起间隔的行为特征非常明显,就算输入本身过了标记检测,也会被行为检测识别为脚本。 - 游戏进程内Hook输入接口
逆向分析目标游戏的输入处理逻辑,找到游戏读取输入的接口(常见的是DirectInput接口、RawInput回调、Unity/Unreal引擎的内置输入模块),将代码注入到游戏进程内部,直接写入按键状态,完全绕开系统层面的输入栈。这种方案不需要驱动,但通用性差,每次游戏更新后接口偏移可能变化,需要重新逆向适配,同时注入行为本身需要过反作弊的进程注入检测。
注意:所有输入模拟方案都存在被游戏反作弊判定为违规的风险,正式使用前请先用非核心账号测试,避免账号被封禁。不要尝试用更老的用户态API碰运气,这类接口的特征比SendInput更明显,不仅无效还可能直接触发反作弊告警。
内容的提问来源于stack exchange,提问作者Osama Adel
相关产品推荐
相关产品推荐

