如何绕过Game Guard的虚拟事件拦截,实现《奇迹MU》的鼠标与键盘自动化操作?
我之前也遇到过类似的反作弊系统拦截键鼠模拟的问题,GameGuard这类内核级反作弊确实会针对常见的自动化库做特征检测,而Windows屏幕键盘能正常工作,核心原因是它调用的是系统原生的高权限输入API,这类输入会被判定为“合法用户操作”而非脚本模拟。结合你的情况,给你几个可行的解决方案:
方案1:直接调用Win32原生SendInput API(绕过库特征检测)
很多Python自动化库(比如PyAutoGui、PyDirectInput)其实都是封装了Windows的SendInput API,但它们的封装层可能带有可被检测的特征。手动用ctypes直接调用原生API,能减少被GameGuard识别的概率,因为这和屏幕键盘调用的是同一底层接口。
示例代码:
import ctypes import time from ctypes import wintypes # 加载Win32用户态库 user32 = ctypes.WinDLL('user32', use_last_error=True) # 定义输入类型常量 INPUT_MOUSE = 0 INPUT_KEYBOARD = 1 # 鼠标事件常量 MOUSEEVENTF_LEFTDOWN = 0x0002 MOUSEEVENTF_LEFTUP = 0x0004 # 键盘事件常量 KEYEVENTF_KEYUP = 0x0002 MAPVK_VK_TO_VSC = 0 # 定义Win32输入结构体 class MOUSEINPUT(ctypes.Structure): _fields_ = (("dx", wintypes.LONG), ("dy", wintypes.LONG), ("mouseData", wintypes.DWORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR)) class KEYBDINPUT(ctypes.Structure): _fields_ = (("wVk", wintypes.WORD), ("wScan", wintypes.WORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR)) class INPUT(ctypes.Structure): class _INPUT(ctypes.Union): _fields_ = (("mi", MOUSEINPUT), ("ki", KEYBDINPUT)) _anonymous_ = ("_input",) _fields_ = (("type", wintypes.DWORD), ("_input", _INPUT)) def simulate_left_click(): # 构造鼠标按下+释放的输入序列 mouse_down = INPUT(INPUT_MOUSE, MOUSEINPUT(0, 0, 0, MOUSEEVENTF_LEFTDOWN, 0, 0)) mouse_up = INPUT(INPUT_MOUSE, MOUSEINPUT(0, 0, 0, MOUSEEVENTF_LEFTUP, 0, 0)) inputs = (INPUT * 2)(mouse_down, mouse_up) user32.SendInput(len(inputs), ctypes.byref(inputs), ctypes.sizeof(INPUT)) def simulate_key_press(key): # 获取按键的虚拟键码和扫描码 vk_code = ord(key.upper()) scan_code = user32.MapVirtualKeyA(vk_code, MAPVK_VK_TO_VSC) # 构造按键按下+释放的输入序列 key_down = INPUT(INPUT_KEYBOARD, KEYBDINPUT(vk_code, scan_code, 0, 0, 0)) key_up = INPUT(INPUT_KEYBOARD, KEYBDINPUT(vk_code, scan_code, KEYEVENTF_KEYUP, 0, 0)) inputs = (INPUT * 2)(key_down, key_up) user32.SendInput(len(inputs), ctypes.byref(inputs), ctypes.sizeof(INPUT)) # 测试:3秒后激活游戏窗口 time.sleep(3) simulate_left_click() simulate_key_press("i")
方案2:使用Windows UI Automation API(控件级输入)
UI Automation是Windows专为辅助功能设计的API,它可以直接向窗口的控件发送输入,而不是模拟全局键鼠事件。这种方式更隐蔽,因为GameGuard通常不会拦截针对窗口控件的合法输入操作。Python可以用pywinauto库来快速调用这个API。
示例代码:
from pywinauto import Application import time time.sleep(3) # 连接到奇迹MU的游戏窗口(需要替换为实际窗口标题/类名) # 可以用pywinauto的findwindows工具查找窗口信息:from pywinauto import findwindows; print(findwindows.find_windows(title_re=".*MU.*")) app = Application().connect(title_re=".*奇迹MU.*") game_window = app.top_window() # 模拟窗口内坐标的鼠标点击(替换为你需要的坐标) game_window.click_input(coords=(500, 500)) # 发送按键"i" game_window.type_keys("i")
方案3:内核级输入模拟(进阶对抗)
如果前两种方法都失效,说明GameGuard拦截了用户态的所有输入模拟,这时需要用内核级的输入工具,比如Interception库。它通过内核驱动来拦截和模拟输入,完全绕过用户态的检测,但操作相对复杂,需要安装驱动并以管理员权限运行。
你可以通过ctypes调用Interception的API,核心思路是模拟硬件级的输入信号,让GameGuard无法区分是真实键鼠还是脚本模拟。不过这个方案需要你先下载Interception驱动并安装,然后参考官方文档编写调用代码。
额外注意事项
- 一定要以管理员权限运行脚本:GameGuard运行在高权限,低权限进程无法向其保护的窗口发送输入,确保Python解释器和脚本都是右键“以管理员身份运行”。
- 避免批量使用常见自动化库:GameGuard会针对PyAutoGui、PyDirectInput等库做特征匹配,尽量用原生API或更小众的工具。
- 注意账号风险:使用自动化脚本可能违反游戏的用户协议,存在账号被封禁的风险,请谨慎使用。
内容的提问来源于stack exchange,提问作者Airflare1989




