2025-01-02这篇文章是对我知乎回答的搬运和整理。 前言
检测常见大厂鼠标的鼠标宏很简单,判断宏是否具有外挂性质同样不难。在说这些之前我得澄清一些东西,和外挂、鼠标各有关联的东西。
误解
在游戏领域存在大量的误解,包括对技术名词的错误使用、曲解、衍生出词不达意的含义等。这主要是因为游戏群体是玩家,并非开发者。很多东西会错误的传播并延续下去,甚至反过来影响到游戏开发的从业者。本文不对相关名字进行解释,因为不是重点。但仍然有必要澄清一些误解。
鼠标宏和外挂
我很鄙视国内把反作弊(Anti-Cheat)翻译为反外挂。我不清楚这种愚蠢的翻译是怎么想出来的,总之我注意到有一些翻译人员刻意为之。所谓外挂仅仅指的只是作弊程序,但是作弊手段又不止只是使用作弊程序而已,使用“作弊宏”当然也算。也在理应封杀的范围内。
所以所谓的宏算不算外挂,根本就不存在争议。之所以大量国人玩家去争论这种东西,就是因为一些“蠢材”把反作弊曲解翻译为反外挂。而宏在外挂的定义之外。只要宏具有作弊性质,它当然就是违规的。你要讨论在 LOL 中用宏发连招算不算作弊还行,但是压枪这种当然毫无争议的是作弊宏。
板载内存鼠标
一些鼠标将配置保存在自己的存储空间中,例如颜色、DPI 和宏。另一些将配置保存在当前电脑中。一些人将前者称为“板载内存”鼠标,认为这种鼠标的宏就是硬件宏。其它的是软件宏。这也是完全错误的。鼠标的配置保存在哪里根本不决定宏是由谁执行的。
实际上部分鼠标将配置保存到内置存储中,但在连接系统后由鼠标驱动“部署”到配套软件中。也就是说这类所谓板载内存鼠标其实只是存储了配置,其配置是提供给电脑系统的配套软件使用的。这类鼠标虽然有存储宏的能力,但不一定具备执行宏的能力。宏仍然是电脑软件执行的。相反,一些鼠标没有内置存储,配置保存在当前电脑,每次连接时由驱动“部署”到鼠标中。这种鼠标并不是所谓的板载内存鼠标,但宏是由鼠标硬件执行的。
这类观点是把一些无关的概念错误归类,导致了错误的结论。并在这类错误结论的基础上吵个没完。
鼠标和系统交互
鼠标是最典型的 HID 设备,由 HID 驱动通过 USB 协议通信。在这个机制里,系统是主动轮询获取鼠标数据的一方,而鼠标只是不断的上报当前位置。也就是说系统或者说电脑是无法感知鼠标位置的,全由鼠标自己说什么就是什么。
所以在鼠标内部执行的宏,它产生的只是鼠标位置的输出,并不对操作系统产生任何“副作用”。理论上通过常规的软件手段是检测不到的。而软件宏需要在系统上执行,一般认为有很多方法可以检测它们。但软件宏可以非常强大,其强大程度是无上限的。硬件宏通常很简单,因为鼠标的执行能力有限。
将某类复杂硬件制作成鼠标,专注于增强宏的能力。让硬件宏也可以像软件宏那样强大。这类“特化”的非常规的被用于鼠标的硬件,也就是专门的宏作弊的鼠标,是天然规避检测的。实际上这很简单就可以做到,你甚至可以将另一台电脑“特化”成鼠标。
检测的可能性
通常鼠标是可以自定义宏功能的。通过官方提供的配套软件(国内网民统称为驱动)就可以获取和设置宏。你有想过系统是如何设置鼠标的吗?简单,还是 USB 协议通信,只不过和获取鼠标位置不同,一般用 USB 协议中的控制传输来通信。你只需要逆向这些控制软件和鼠标的通信协议内容,就可以获取这些鼠标的宏数据。
可行性如何?实际上市面上就有许多鼠标(或键盘)的第三方控制软件,不需要官方软件就能设置鼠标。例如 flozz/rivalcfg 就是一个例子,它是我曾经使用过的一个开源项目。使用这个工具可以在 Linux 上调整鼠标设置,摒弃官方软件。
在进行鼠标设置时(向鼠标写入或读取数据),我们是可以从 USB 协议层面抓取到通信数据的。例如:
鼠标宏也是类似的。我们可以在逆向特定鼠标甚至特定品牌鼠标/系列鼠标的前提下,轻易获取到鼠标的宏设置。我们可以以自己的方式解析宏,甚至实现软件层面的“宏模拟器”也不是什么难事(因为硬件宏通常很简单)。通过模拟宏的执行,就能很轻易的分析出该宏是用于压枪的,还是其它目的。而无论宏有多随机和复杂。
可用性
本文提到的内容就像开头提到的,对于一般的量产品牌鼠标是几乎 100% 有效的。只是数量太大会引起开发成本问题。但本文只讨论可行性,并不考虑这样做的经济性。当然对于专门定制的以鼠标的形式作弊的特殊硬件,这种方式是无效的。因为这种特殊硬件可能不需要宿主机来进行任何设置交互,它自己就能完成设置。并且它的宏可能极为复杂,甚至接入 AI 等技术,是无法完成软件层面的模拟的。
结束语
本文是对我曾经在其它平台写的内容的搬运整理,它可能失去了一些时效性。本文讨论的内容只是理论可行的,我本人也做过未完成实际可用成品的相关实验。总之,这应该是一篇科普文章。