01 传统作弊介绍
这里传统作弊指的是AI技术兴起之前,市面上流行的几种外挂。今天我们先不聊对服务器进行DDoS攻击的炸房挂,除了炸房挂之外,外挂大抵分为三类,最常见同时也是市面上流行最多的是通过读写内存来实现的内存挂;其次是通过修改数据包来实现的封包挂;最后是类似按键精灵、鼠标宏一类的模拟挂。这三种外挂可谓是各有乾坤,接下来介绍这几种外挂的原理、反制手段与反制反制手段的手段。
1.
内存挂
游戏中很多数据都存放在内存中,通过在游戏运行时对游戏内存数据进行读写来获得一些作弊的效果。
内存挂的其实算是一个比较宽泛的说法,其并不局限于修改内存,例如某游戏通过金山游侠改召唤师CD无限闪现,这种是内存挂。
某游戏中在运输船开法相天地的清朝老兵也是内存挂。
某游戏里枪枪爆头的HF也是内存挂。
而内存挂的具体实现方式又可谓是多种多样,包括内存修改、代码注入、DLL注入等。
(1)内存修改
当然,这里获得的物理地址是会变动的。在游戏关闭后,其所占用的内存资源会被释放掉,同时其他的程序可能会占用这些内存地址。下一次打开游戏后,这个数值在内存中的物理内存地址就变了。如果想正儿八经地做个挂,就需要找到我们开头说的基址和偏移量了,除非游戏的exe更新了,变量的基址是永远不会变的。这部分涉及汇编以及计算机组成原理的一些知识,大家感兴趣可以自己学习一下。
有的挂可能需求比较复杂一些,简单的改改内存中的变量已经无法满足需求了,这时候就可以考虑代码注入了。代码注入是指将自定义的代码加载到目标进程的地址空间中并执行,以改变目标进程的行为。通常通过创建远程线程或修改目标进程的内存来实现。
代码注入的思路很简单,基本就两步:
1.OpenProcess打开需要注入的程序, 获取句柄;
和代码注入差不多,DLL注入是指将自定义的动态链接库(DLL)加载到目标进程的地址空间中,并执行其中的代码。
这里我们可以简单实践一下,首先我们先简单写个功能,比如说弹窗,然后编一个DLL文件出来。
接下来我们简单写个注入器,这个注入器的核心是两部分:
1.利用AdjustTokenPrivileges函数进行提权
2.利用LoadLibraryA函数进行注入
以上就是一个简单的DLL注入实现过程,在注入后外挂作者就可以实现一些非法操作了。
2.
封包挂
封包挂基于客户端和服务器的数据包通信,通过给服务器发送或者拦截封包,来实现游戏功能。这类外挂的缺点是涉及技术面比内存挂更为广泛,开发周期长。优点是所实现的功能强大到难以想象,而且可以无视绝大部分游戏检测,足以弥补对时间上的消耗。想要实现一个封包挂,需要以下几个步骤:
1.定位游戏的发包函数。这里可以用OllyDbg等调试工具对游戏进行断点调试,来找到发包的函数。
2.定位封包加密calll。这里call的意思是函数调用。客户端发出去的数据包肯定是要加密的,如果直接明文发出去,服务器是不会接受的,所以要找出加密call并进行分析。
3.调用函数并实现功能。
通篇看下来,封包挂并不像它的字面意思,单纯的模拟网络数据包并发给服务器,更像是破解RPC并调用。
3.
模拟类
鼠标宏、按键精灵等都属于模拟类的外挂。这类外挂相较于前两种来说,开发难度更低,而且可能更为广泛,甚至有些“宏孩儿”用了也没觉得自己是挂。
鼠标宏常用于FPS游戏中的压枪,在某游戏中就有使用AHK配合OCR实现的自动识别压枪宏,除了消除武器后坐力之外甚至可以让半自动武器摇身一变成为全自动武器。同时这种宏作弊成本很低,网上有很多免费的版本,而且不像前两种外挂那么暴力,绿玩遇到了也不敢直接判断对面是不是开宏了。
不过这种宏拉闸也挺快的,我记得2022年的时候直接识别特征码封禁了一批作弊者。但是由于其没有对内存进行修改,如果自己编译了一个版本,而这个版本的特征与封禁的特征完全不一致的话就很难被发现了。
在了解了这几种传统作弊方式之后,我们需要去采取一些反作弊手段,防止外挂泛滥。
1.
加壳
"加壳"是指在软件发布前对软件进行加密或混淆处理,以增加软件的安全性和防止逆向工程。加壳可以使程序的代码和数据在磁盘上变得模糊和混乱,使得静态分析变得更加困难。就算挂上调试工具也看不出什么东西。
2.
接入一个靠谱且强力的反作弊系统
现在市面上有很多成熟的反作弊引擎(EAC、Ricochet、NEAC等),功能也都是比较强悍的,例如在启动游戏后会对机器加载的进程和驱动进行扫描,如果有可疑的进程或者驱动存在就禁止启动或封号;对游戏进程挂调试工具就崩溃或是根本挂不上调试工具的反调试功能。
3.
加点干扰项
在内存修改中,作弊者会对某个数值反复修改与搜索,我们可以试着做一些与这个数值同步的混淆项目,当这个数值被与同步的数值不一致的时候,就可以认定玩家作弊了。
4.
加强RPC测试
在封包挂的介绍中我们不难发现,封包挂更像是从外部进行RPC的调用。我们在日常测试中可以提高对RPC测试的重视程度,检查RPC参数异常的时候会不会有什么异常的表现,同时在日志监控中加入RPC报错或异常的提醒,及时封禁还在调试的外挂开发者,把外挂扼杀在摇篮之中!
03 反反传统作弊的作弊方式
在游戏中遇到外挂的时候除了喷作弊者之外,免不了顺便喷一下各种反作弊引擎。不过反作弊引擎可能是真尽力了,在作弊这一块确实是道高一尺魔高一丈,上有政策下有对策,外挂开发者总有各种各样的方法来绕过检测。
1.
加壳/频繁更新本体
和反作弊的效果一样,外挂通过加壳来混淆自己的特征码,防止被反作弊系统发现。这种可能需要定位软件的内存特征来针对性检测。
2.
伪装正规软件/进行数字签名
这个有点自欺欺人的感觉,只要查一下数字签名就能发现是伪装出来的。进阶一点的可能搞一些过期的数字签名、买正版数字或者第三方代签,这时候就需要反作弊系统给力一些,能够验证签名的有效性和签发公司的合法性。
3.
附加到其他进程
以前有听说过,有的外挂可以注入到其他进程(类似360)来绕过检测,这种可能需要检测第三方软件有没有被恶意注入了。
4.
利用内核驱动进行过检测
可以用类似HyperHide之类的内核插件来过检测,不过这种插件开发难度比较高。面对类似Vanguard这种内核级反作弊也可能有点不够看。这里有一篇分析Vanguard的文章,推荐感兴趣的同学阅读一下。瓦洛兰特反作弊系统Vanguard浅析(http://www.qfrost.com/posts/vanguard/)
5.
DMA
随着时代的发展,AI技术也越来越先进了。生活中各处都有AI的身影,如gpt、suno等。在游戏中我们也可以看到AI的应用,如逆水寒手游AI,永劫手游AI。同时在作弊者中AI外挂也逐渐兴起。
1.
基于计算机视觉的AI作弊
在2021年之前,FPS游戏的中的自瞄除了内存挂硬锁之外,最流行的就是找色的微自瞄。它的原理很简单,以守望先锋为例,地方在被击中的时候头上会亮血条,作弊者通过游戏内的色盲设置把颜色改成一些在游戏内不常出现的颜色(例如洋红色),通过OpenCV等库在屏幕中找对应的颜色,同时利用一些键鼠模拟设备来对鼠标进行控制,达到一个自瞄的效果。
随着21年YoloV5等框架的推出与CUDA等技术的加持,AI进行图像识别的快捷性、高效性与准确性得到了非一般的提升,同时配合针对FPS游戏制作的模型,基于图像识别的AI自瞄挂也在外挂市场上占据了一席之地,甚至涌现出了CVCheat这种专门制作AI外挂的团队。虽然CVCheat最后还是落网了,但是AI挂的发展并没有得到抑制。
以上步骤组合在一起,就是一个AI自瞄挂了。当然,基于图像识别的AI作弊应用范围不只FPS游戏,肉眼能明显识别特征的都可以用AI进行作弊。
2.
用于博弈的AI外挂
赛马娘是我玩得最多的手游,其核心玩法就是培养你的马娘。在育成的过程中,点击训练会消耗提升属性,点击休息会回复体力,点击外出会回复一定的体力并提升心情,点击比赛会提供PT(技能点数),同时支援卡出现在训练上的人头数会提升训练的效果。我们的训练目标就是尽可能高地提升马娘的各项属性、尽可能多的获取PT学习技能。
在正常游玩的时候,我可能只会考虑当前回合如何决策收益最大,而在训练的过程中每回合每项属性的训练收益都是随机的,基本可以看作是一个多臂老虎机问题。
我们引入基于蒙特卡洛搜索的强化学习AI来给出我们选择的建议。蒙特卡洛方法实际是基于样例返回值的均值求解强化学习的一种方法,只需要实际经验,不需要对环境的先验知识,即可以在不了解任何概率分布的情况下,学习最优策略。
于是针对赛马娘的AI就应运而生。下面就是一个开了AI的玩家的桌面,左侧是游戏窗口,中间是dump了游戏内训练属性和事件的插件,右侧是基于插件结果给出训练推荐的AI。可以看到,AI会计算出每种选择的推荐程度、这局的运气水平以及预测的养成评分。
以前我最后育成结果基本只有个UG的评分,运气好的时候才能上个UF,用这个AI体验了几局,养出来的马基本没有低于UF的,提升确实很大。单从AI这部分来说,他真的算作弊吗?我用的这个版本需要一个截获回合信息的插件,这部分算是外挂没得说,不过现在有了手动输入信息来计算结果的版本,彻底和游戏本体没有任何关联。这种利用AI进行博弈的第三方工具算不算作弊,我觉得是个值得讨论的问题。
3.
AI反作弊相关
图像识别的AI作弊可以分成两部分来看。首先是图像采集部分,可以通过扫描后台进程,看有没有显卡占用异常的程序来标记可疑用户。不过这种开AI自瞄的人,很多都是把视频画面推流到第二台机器上进行推理,整体类似DMA。这时候我们就可以通过设备信息和检测鼠标移动轨迹进行判断。我们可以尝试在画面中加入肉眼不可见的水印,增加模型推理的难度。其次是对后台异常的鼠标驱动进行检测,很多AI自瞄挂都要配合一些特定版本的鼠标驱动进行瞄准的操作,我们可以通过对使用这种特定老版本驱动、来路不明的鼠标驱动的玩家进行监控,来提前发现一些外挂的使用者。
而凭借YOLO这种目标检测框架的实时性,我们可以做到在操作客户端的同时进行检查。如果我们利用类似AI博弈的技术,测到Bug为"奖励",漏测Bug为“懊悔”,并把玩法作为选择输入进去,是不是就能搞出来一个能编写用例或测用例的AI了呢?AI自动化测试还有很多我们可能没想到或是没敢想的点,欢迎大家一起讨论!
推荐阅读
都看到这里了,点个赞再走吧~