You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何绕过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驱动并安装,然后参考官方文档编写调用代码。

额外注意事项

  1. 一定要以管理员权限运行脚本:GameGuard运行在高权限,低权限进程无法向其保护的窗口发送输入,确保Python解释器和脚本都是右键“以管理员身份运行”。
  2. 避免批量使用常见自动化库:GameGuard会针对PyAutoGui、PyDirectInput等库做特征匹配,尽量用原生API或更小众的工具。
  3. 注意账号风险:使用自动化脚本可能违反游戏的用户协议,存在账号被封禁的风险,请谨慎使用。

内容的提问来源于stack exchange,提问作者Airflare1989

火山引擎 最新活动