视觉 AI 辅助的原理和反制


配套 PPT

前言

首先声明一点,我个人是坚决反对 使用任何形式的游戏辅助去破坏游戏的公平性的。
而且贩卖游戏外挂,更是涉嫌严重的违法犯罪行为,大家千万不要铤而走险以身试法。

我之所以研究这个主题,也仅仅是处出于学习的目的。

背景

回归正题。

大概去年年中的时候,有一个外挂团队制作了一款名为 User Vision Pro 的视觉 AI 软件,并且在 Youtube 发布了一个宣传视频,

视频的内容主要是针对【使命召唤】的 AI 自瞄辅助,而且号称是世界第一的、跨平台的 “无法检测” 和 “无法封禁” 的 AI 外挂。

我们先来看看这段视频。

不知道大家看完之后有什么感觉?

这个视频刚出没多久就火了,然后作者就被 动视 请去喝茶了,

作者回来之后就宣布不干了,相关的宣传视频也被要求全部下架,目前也只能从 推特 的 反作弊警察局 找到这段视频的存档。

动视的这波操作就有点耐人寻味了,外挂这么多,为什么就唯独对 AI 的反应这么大呢?

其实到现在已经时隔一年了,国内外各种模仿的视频层出不穷,可以说最初的那个 AI 的宣传视频,彻底打开了潘多拉魔盒,回想起当初动视的操作确实是有先见之明的。

其实视觉 AI 外挂之所以能引起轩然大波,主要还是因为它跟传统的外挂不一样:

【传统外挂】一般需要依附于游戏进程运行,
以便篡改游戏的内存或者文件数据、向服务器发送作弊指令,
实现一些游戏原本不可能实现的操作,例如子弹追踪,穿墙,透视 等等。

【视觉 AI】则可以完全独立于游戏之外运行,
它和人类一样,看着游戏画面,再把画面的分析结果通过鼠标键盘反馈到服务器,
交互方式和正常人类是没有区别的,交互的范围也在游戏的规则之内。

所以从理论上来说,传统的反外挂程序确实没法检测和封禁 AI 外挂。
但理论终究是理论,实际上 AI 的效果到底是不是如此变态呢?

原理

其实前面演示的 AI 外挂的思路并不复杂,我依葫芦画瓢很快就写了一个初始框架。

先来看一段我在 CSGO 靶场的实机演示.

左边是 AI 分析的画面,右边就是实际操作,基本是枪枪爆头。

那现在就从我的代码开始,去分析整个视觉 AI 的逻辑:

  1. 按住 Alt 截取准星附近范围内的游戏画面
  2. 把游戏画面送到视觉 AI
  3. 视觉 AI 分析画面中的人体姿态
  4. 把准星移动到预设的人体部位

我们来拆解一下每一步的实现原理

按住 Alt 截取准星附近范围内的游戏画面

第一步,按住 Alt 截取游戏画面,这个其实用开源的视觉库 OpenCV 就可以实现了。
而之所以要按住 Alt 触发,而且只截取准星附近的画面,主要是为了降低后面第三步视觉 AI 检测画面时给显卡带来的压力,
我们可以回到前面那个视频的画面大概讲解一下

其实 FPS 游戏很多帧画面都是没人的,尤其像吃鸡,有一大半时间都在跑图,
即使有敌人也是相对集中于视野的中心,就是准星附近敌人是要优先处理的,
外围的敌人优先级是相对低的,所以我们只需要让 AI 分析中心画面的某些帧即可,
这可以大大降低 AI 检测带来的延迟,而且分析的图片越接近人体的大小,精度就越高。
尤其是 AI 程序和游戏都跑在同一台机器上的时候,这种优化会特别明显。

把游戏画面送到视觉 AI

接下来第二步,把画面送到视觉 AI ,这里需要买一个视频采集卡。
没用过采集卡的同学可能不知道是这是什么东西,我这里画了一个示意图可以大概了解一下

如果有做过直播推流的同学可能会比较熟悉这个东西,它就是把电脑、或者手机、掌机主机画面等等同步串流到另一台电脑上的一个硬件设备。
那为什么需要这个东西呢?
做过游戏直播的同学其实都比较清楚,你要一边玩游戏、一边录屏推流,你的显卡就要分出一部分算力去做游戏渲染之外的事情,如果你的显卡性能不太好,直接表现出来的就是游戏画面也会掉帧。那采集卡的作用就是把录屏推流的工作交给另一台电脑去执行,你本身的电脑就专心玩游戏即可。

那其实类比 视觉 AI,它对显卡算力的消耗,相比录屏推流有过之而无不及。
因为视觉 AI 的图像检测,其实就是模型推理的过程。模型推理不像模型训练,训练的时候显卡性能低一点没所谓,我大不了等长一点时间嘛。
这个模型推理是有硬指标规定的,例如我要求游戏运行保持在 30 fps 以上,那么神经网络一次推理的时间就不能大于 33 ms,太慢就会让人感觉到掉帧。尤其是如果没有视频采集卡,显卡就要在运行游戏渲染的基础上去跑视觉 AI,这对显卡的要求是非常高的。

我的 2080TI 就是这样报废了。

视频采集卡的另一个作用就是跨平台,比如你用手机玩吃鸡,或者用 PS4 玩 GTA,这些游戏平台是没法直接跑视觉 AI 的,但是把画面串流到装了视觉 AI 的电脑上,就可以实现跨平台了。

视觉 AI 分析画面中的人体姿态

视觉 AI 分析画面中的人体部位,终于讲到最核心的 AI。

前面 Youtube 的视频中,看着应该是用的基于方框的目标检测算法,

其实像这种需要定位人体的游戏场景,有比方框检测更好的算法。

因为我个人的编程能力比较菜,所以就找了两个开源的算法框架 MMPose 或 OpenPose ,简单编译一下就能用了。

当然如果你是计算机视觉领域的资深工程师,估计写这么一个真实人体检测的神经网,估计最多 2 天就完事了。

可是这两个框架有个好处就是提供训练好的人体姿态模型,不需要自己训练就能用了。

目前比较常用模型是 BODY25 ,这个模型还提供了 手部 和 脸部 特征点,

但是可以不管它,毕竟在 FPS 游戏中并不需要对敌人做人脸识别,也不需要手势识别,

我们只需要知道他的头在哪就可以了,但是有可能敌人会被掩体遮挡,以防万一实际上我用了 三个位置坐标:

首先是头(点击)
其次是躯干(点击)
最后是屁股(点击)

哪里露出来打哪里

当然了,如果大家有时间的话,也可以 自己训练模型

素材嘛,相信大家手上都已经有不少了吧。去翻一下你们那个黑盒子,各种中方的、西方的、动物的、食物的人体学习资料,这个时候就派上用场了嘛。

把那些人体资料抽取关键帧进行数据标注后喂给神经网络就可以了。

不过这些都是用现实世界的图像去训练的,所以要提高精度的话,最好再做一下迁移学习,往游戏世界去训练一下,一般准备三四百张游戏图像就足够了。

但是时间有限,怎么去训练我就不展开了。

把准星移动到预设的人体部位

最后一步,要根据 AI 的分析结果,把准星移动到目标位置。
其实就是要想办法把输入送进去游戏。
这里我列了 3 个设备,如果只是纯粹在 PC 平台上面,有一个鼠标就够了,甚至可能连鼠标都不需要。
后面两个是输入控制器,Titan Two 和 Cronus Zen (克迈) 作用都是差不多的,某宝上也有很多类似的产品。

我大概画了一个 titan two 接线图,这个知道一下就好了。

输入控制器主要是用来适配其他平台的输入的,例如手机是没有输入设备的,或者我们想把 PS4 手柄映射到键鼠,都可以借助输入控制器。

当然了,用输入控制器最终的目的不是为了做键位映射,而是为了从驱动层往游戏里输送 AI 的信号,去模拟鼠标移动,

我这里录了一个通过写入驱动,自动移动准星追踪敌人的片段。

实现原理这里先不做太详细的说明,后面我们聊反外挂的时候会稍微展开一下。

演示

OK 那么我们现在已经把这 4 步的原理都理清楚了,那实际效果怎么样呢?

我们来看一下最终的完成效果

反制

优缺点

可以看到视频的风格我是山寨 Youtube 那位老哥的,但这个不重要。

有了实现依据,我们就可以真正地分析一下:

  • 视觉 AI 有什么特点和缺陷
  • 又如何有效地反制它

B 站有个 up 主就总结出了视觉 AI 几个特点,我借鉴了一下:

  1. 首先最明显的,就是通用性好,刚刚的演示视频中出现了 3 个 FPS 游戏,我没改过一行代码就全跑下来了。这是因为 AI 看游戏的方式和人没什么区别,都是识别画面中的人物作出反应,这就意味着它可以攻陷大部分的游戏平台。
  2. 其次 AI 速度和精度都比人类要高,这是因为计算机都比较擅长处理低级信息,在这种定位人体部位的事情上,AI 从识别头部到移动鼠标压根花不了几毫秒。
  3. 最后是隐蔽性强,前面也提到了,AI 看游戏的方式和人一样,不需要读取内存再修改数据,换言之,AI 确实是完全游离在游戏数据之外进行作弊的,试想想,你朋友看着你玩吃鸡,提示你哪里有敌人,反作弊程序能够证明你在作弊吗?

所以有人就说,视觉AI 的出现是 FPS 游戏世界的末日。

但我这么一套整下来,其实也未必。因为凡事都有两面,有好必有坏:

  1. 首先视觉 AI 的流行性相对于传统外挂而言,非常差。
    • 要搭建这么一套东西,硬件成本就高的离谱,首先你需要一台中高端的电脑用来跑视觉 AI ,低档一点的显卡还跑不下来,组装这么一台电脑至少 8000 以上,视频采集卡最低 两三百,不然掉帧很明显,输入控制器最低 650,整套下来差不多 1W
    • 而且深度学习这类的程序,目前还是科研为主,少数可以商用,远远还没普及到民用的程度,它对硬件的型号版本要求极其严格,尤其是显卡。不是说像其他 APP 一样,给个安装包就能到处用了,它必须依赖当前的硬件环境重新编译安装才能运行。前面说的那款外挂,国外的地下市场还能交易,可是购买的人都因为安装极为繁琐而怨声载道。
  2. 其次,视觉 AI 的高精度是基于很多限制条件的前提下才成立的:
    • 视觉 AI 看不到画面外有没有人,即使有枪声也不会做出任何反应
    • 就算画面里有人,中远距离也会导致识别效果变差、甚至完全识别不了,所以你看我录的视频基本都是倍镜不离手
    • 而且就算有倍镜,AI 也不会通过武器的射程、弹道等因素做瞄准的调整
      换言之,AI 缺乏对高层次信息的演绎归纳能力,而这恰恰是人脑所擅长的东西。
  3. 最后视觉 AI 隐蔽性其实不强,我们都被表象迷惑了,主要问题就出在 AI 的输入方式,采用的是传统外挂的输入方式。

输入原理

我们首先大概了解一下游戏的输入原理。

Intel 把 CPU 的特权等级由高到低划分分为 R0 ~ R3 四个等级, windows 只用了两个等级,

R0 也就是我们常说的内核,这层只给操作系统的程序运行,设备驱动就运行在 R0 层。
R3 是应用层,这层任何人的程序都可以运行,游戏就运行在 R3 层。
此外 R0 层还提供的一个接口 win32api 让 R3 层可以调用 R0 层的部分功能

每个应用程序在启动的时候,Windows 都会为其分配一个专属的消息队列,
在 DirectX 诞生之前,游戏获取输入的方式就是通过消息队列,键鼠通过驱动程序往队列里面写,游戏从队列里面读。
这个时候外挂要模拟键鼠的输入其实就很简单了,只需要从 R3 层模拟一个按键消息送到队列就可以了。(点击动画)

可是因为有些游戏对实时性控制的要求比较高,而消息队列不仅仅有键鼠的输入消息,导致操作会存在延迟,
于是 DirectX 就创造了 DirectInput 输入方式,(点击动画),直接与键鼠打交道,从此消息队列就被屏蔽了。

这个时候 R3 层要模拟一个输入信号,就必须要经过 R0 层才能送进游戏里,一般而言有两种方法:
第一种方法是通过 win32api 调用 R0 的接口(点击动画)
第二种方法涉及到驱动程序开发,(点击动画),要知道在 windows 的分层驱动模型中,一个物理设备对应着一个驱动程序,一个驱动程序可以注册多个设备对象,每个设备对象会指向下一个设备对象,形成一条设备链。
应用程序与驱动程序通信时,应用程序会发出I/O请求,操作系统将I/O请求转化为相应的 IRP 数据,这个 IRP 包会在设备链中依次流转处理。

那么我们就可以在设备链的末端创建一个自定义设备,当 IRP 流转过来时,对其进行篡改,例如改变鼠标坐标到人物的头部。

反制方法

知道原理之后,其实想要反制视觉 AI 也就很简单了。

首先是给游戏厂商的建议:
在游戏中屏蔽所有 R3 层的输入,这个 DirectX 已经能做到了
针对 R0 层的设备链做一个设备白名单,现在各大游戏厂商一直对输入控制器都是睁一只眼闭一只眼,如果视觉 AI 真的触碰到底线,只要搞一个白名单,就能 100% 杜绝这类型的外挂。

而对玩家而言,视觉 AI 无非就是一个反应快一点的聋子+近视眼,所以遇上了,就:
迅速找掩体撤后,拉开距离
不能拉开距离就尽量绕后,离开他的画面范围
直接打死然后举报

忠告

以上就是我今天要分享的全部内容了
再次声明一下,以上内容仅用于学习研究,我写的那个程序也会封存在我的小黑盒,不会让它外传。

忠告大家千万不要制作、出售外挂,不然后果很严重
千万千万不要面向监狱编程,就算你要面向监狱编程,也千万不要说是我教的
我没教过大家什么东西,而且前面的内容只有一个大概的思路,真要深入进去细节,内容还是很多的,我差不多搞了半年。
所以我确实没教过大家,谢谢。

参考文档


文章作者: EXP
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 EXP !
 本篇
视觉 AI 辅助的原理和反制 视觉 AI 辅助的原理和反制
配套 PPT 前言首先声明一点,我个人是坚决反对 使用任何形式的游戏辅助去破坏游戏的公平性的。而且贩卖游戏外挂,更是涉嫌严重的违法犯罪行为,大家千万不要铤而走险以身试法。 我之所以研究这个主题,也仅仅是处出于学习的目的。 背景回归正题。 大
2022-05-04
下一篇 
OpenPose 编译指引(含 python 接口) OpenPose 编译指引(含 python 接口)
前言OpenPose 人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以 Caffe 为框架开发的开源库。 可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人,具有极好的鲁棒性。是世界上首个基于深度学
2022-01-08
  目录