作弊、反作弊与反反作弊

文摘   游戏   2024-11-01 18:05   浙江  

作为一个FPS玩家,外挂是最令我深恶痛绝的,在游戏中遇到这些挂作弊者免不了狠狠地问候一下。有的时候可能也会好奇,这些外挂是怎么做到的?为什么反作弊没拦住他们?相信大家能在阅读完本篇文章之后,能够对这两个问题有一定的答案,对外挂的原理以及反制手段有一定的认知。 


01 传统作弊介绍


这里传统作弊指的是AI技术兴起之前,市面上流行的几种外挂。今天我们先不聊对服务器进行DDoS攻击的炸房挂,除了炸房挂之外,外挂大抵分为三类,最常见同时也是市面上流行最多的是通过读写内存来实现的内存挂;其次是通过修改数据包来实现的封包挂;最后是类似按键精灵、鼠标宏一类的模拟挂。这三种外挂可谓是各有乾坤,接下来介绍这几种外挂的原理、反制手段与反制反制手段的手段。

1.

内存挂

游戏中很多数据都存放在内存中,通过在游戏运行时对游戏内存数据进行读写来获得一些作弊的效果。

内存挂的其实算是一个比较宽泛的说法,其并不局限于修改内存,例如某游戏通过金山游侠改召唤师CD无限闪现,这种是内存挂。 

某游戏中在运输船开法相天地的清朝老兵也是内存挂。

某游戏里枪枪爆头的HF也是内存挂。

而内存挂的具体实现方式又可谓是多种多样,包括内存修改、代码注入、DLL注入等。

(1)内存修改

大部分内存修改是通过CheatEngine、OllyDbg或X64Debug等调试工具寻找内存中游戏数据的基址,然后加上偏移量对物理地址进行修改。这种方法应该是大家最常见的,比如在单机游戏中用CE给自己改个金币之类的。操作也很简单,搜索想要修改的数值->游戏内进行操作使数值发生变化->再次进行搜索,重复几次之后就可以得到实际的物理地址了。 

当然,这里获得的物理地址是会变动的。在游戏关闭后,其所占用的内存资源会被释放掉,同时其他的程序可能会占用这些内存地址。下一次打开游戏后,这个数值在内存中的物理内存地址就变了。如果想正儿八经地做个挂,就需要找到我们开头说的基址和偏移量了,除非游戏的exe更新了,变量的基址是永远不会变的。这部分涉及汇编以及计算机组成原理的一些知识,大家感兴趣可以自己学习一下。 

(2)代码注入

有的挂可能需求比较复杂一些,简单的改改内存中的变量已经无法满足需求了,这时候就可以考虑代码注入了。代码注入是指将自定义的代码加载到目标进程的地址空间中并执行,以改变目标进程的行为。通常通过创建远程线程或修改目标进程的内存来实现。 

代码注入的思路很简单,基本就两步:

1.OpenProcess打开需要注入的程序, 获取句柄;

2.通过CreateRemoteThread函数将我们需要注入的代码以新的线程的方式进行运行, 到达注入的效果;

一旦代码成功注入,它会在目标进程中执行,实现所需的功能,如修改游戏内存数据或监控游戏状态。不过我们注入的代码一般都是汇编代码,如果需要注入比较复杂的代码,DLL注入可能会是更好的选择。

(3)DLL注入

和代码注入差不多,DLL注入是指将自定义的动态链接库(DLL)加载到目标进程的地址空间中,并执行其中的代码。

这里我们可以简单实践一下,首先我们先简单写个功能,比如说弹窗,然后编一个DLL文件出来。

 

接下来我们简单写个注入器,这个注入器的核心是两部分:

1.利用AdjustTokenPrivileges函数进行提权

2.利用LoadLibraryA函数进行注入

在运行注入器将DLL注入到指定进程后,我们就可以看到我们想要的弹窗已经出现了。

以上就是一个简单的DLL注入实现过程,在注入后外挂作者就可以实现一些非法操作了。

2.

封包挂

封包挂基于客户端和服务器的数据包通信,通过给服务器发送或者拦截封包,来实现游戏功能。这类外挂的缺点是涉及技术面比内存挂更为广泛,开发周期长。优点是所实现的功能强大到难以想象,而且可以无视绝大部分游戏检测,足以弥补对时间上的消耗。想要实现一个封包挂,需要以下几个步骤:

1.定位游戏的发包函数。这里可以用OllyDbg等调试工具对游戏进行断点调试,来找到发包的函数。

2.定位封包加密calll。这里call的意思是函数调用。客户端发出去的数据包肯定是要加密的,如果直接明文发出去,服务器是不会接受的,所以要找出加密call并进行分析。

3.调用函数并实现功能。

通篇看下来,封包挂并不像它的字面意思,单纯的模拟网络数据包并发给服务器,更像是破解RPC并调用。 

3.

模拟类

鼠标宏、按键精灵等都属于模拟类的外挂。这类外挂相较于前两种来说,开发难度更低,而且可能更为广泛,甚至有些“宏孩儿”用了也没觉得自己是挂。

鼠标宏常用于FPS游戏中的压枪,在某游戏中就有使用AHK配合OCR实现的自动识别压枪宏,除了消除武器后坐力之外甚至可以让半自动武器摇身一变成为全自动武器。同时这种宏作弊成本很低,网上有很多免费的版本,而且不像前两种外挂那么暴力,绿玩遇到了也不敢直接判断对面是不是开宏了。 

不过这种宏拉闸也挺快的,我记得2022年的时候直接识别特征码封禁了一批作弊者。但是由于其没有对内存进行修改,如果自己编译了一个版本,而这个版本的特征与封禁的特征完全不一致的话就很难被发现了。

按键精灵则是通过自动化控制鼠标和键盘来模拟玩家操作,达成挂机的目的。其实这种按键精灵算不算作弊也有待商榷,有些游戏可能不会管按键精灵挂机,但是有些游戏则非常严格,检测到有类似挂机行为或者后台按键精灵,直接封禁到2035年,力度堪比信用卡盗刷买黑金。 


02 传统作弊的反作弊方式


在了解了这几种传统作弊方式之后,我们需要去采取一些反作弊手段,防止外挂泛滥。

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

DMA(直接内存访问)现在已经是最主流的反反作弊手段了。在FPS游戏中,DMA直接从硬件层面出发,简单暴力的把游戏的内存数据从主机传到副机上进行处理,然后再将结果从副机通过视频融合器将外挂绘制的画面与主机的画面混合在一起进行透视,同时通过利用kmbox等设备模拟主机上的鼠标移动来达成自瞄的效果。
这种方法开挂成本高,同时也不好抓,外挂作者可能会定制固件,用合规的固件标识码来替换掉DMA设备的固件标识码。这种作弊方式可能更多的需要玩家举报来处理。


04 AI作弊相关介绍

随着时代的发展,AI技术也越来越先进了。生活中各处都有AI的身影,如gpt、suno等。在游戏中我们也可以看到AI的应用,如逆水寒手游AI,永劫手游AI。同时在作弊者中AI外挂也逐渐兴起。

1.

基于计算机视觉的AI作弊

在2021年之前,FPS游戏的中的自瞄除了内存挂硬锁之外,最流行的就是找色的微自瞄。它的原理很简单,以守望先锋为例,地方在被击中的时候头上会亮血条,作弊者通过游戏内的色盲设置把颜色改成一些在游戏内不常出现的颜色(例如洋红色),通过OpenCV等库在屏幕中找对应的颜色,同时利用一些键鼠模拟设备来对鼠标进行控制,达到一个自瞄的效果。

随着21年YoloV5等框架的推出与CUDA等技术的加持,AI进行图像识别的快捷性、高效性与准确性得到了非一般的提升,同时配合针对FPS游戏制作的模型,基于图像识别的AI自瞄挂也在外挂市场上占据了一席之地,甚至涌现出了CVCheat这种专门制作AI外挂的团队。虽然CVCheat最后还是落网了,但是AI挂的发展并没有得到抑制。

与传统作弊程序相比,AI作弊的开发难度简直算是没有门槛。只要准备好足够的数据集,人人都可以训练模型。同时就算游戏再怎么更新,只要游戏内模型没有什么大变化,外挂都可以做到不用更新。

在推理后可以基于预测框的坐标来获取当前分辨率下预测框在桌面上的精确坐标,然后再通过游戏内FOV视角进行三维转二维的坐标变换得到游戏内的目标的坐标,然后通过驱动或者Kmbox之类的键鼠盒子来把鼠标移动到敌人身上。同时有些模型能推理出目标角色的骨骼信息,这样我们就能通过骨骼信息或者预测框加偏移量做到想锁头就锁头、想锁胸就锁胸。

以上步骤组合在一起,就是一个AI自瞄挂了。当然,基于图像识别的AI作弊应用范围不只FPS游戏,肉眼能明显识别特征的都可以用AI进行作弊。

2.

用于博弈的AI外挂

在作弊方面,AI除了能在图像识别上发力外,在一些博弈方面也有发挥场景。

赛马娘是我玩得最多的手游,其核心玩法就是培养你的马娘。在育成的过程中,点击训练会消耗提升属性,点击休息会回复体力,点击外出会回复一定的体力并提升心情,点击比赛会提供PT(技能点数),同时支援卡出现在训练上的人头数会提升训练的效果。我们的训练目标就是尽可能高地提升马娘的各项属性、尽可能多的获取PT学习技能。

在正常游玩的时候,我可能只会考虑当前回合如何决策收益最大,而在训练的过程中每回合每项属性的训练收益都是随机的,基本可以看作是一个多臂老虎机问题

在多臂老虎机(multi-armed bandit,MAB)问题中,有一个拥有K根拉杆的老虎机,拉动每一根拉杆都对应一个关于奖励的概率分布R。我们每次拉动其中一根拉杆,就可以从该拉杆对应的奖励概率分布中获得一个奖励。我们在各根拉杆的奖励概率分布未知的情况下,从头开始尝试,目标是在操作T次拉杆后获得尽可能高的累积奖励。由于奖励的概率分布是未知的,因此我们需要在“探索拉杆的获奖概率”和“根据经验选择获奖最多的拉杆”中进行权衡。“采用怎样的操作策略才能使获得的累积奖励最高”便是多臂老虎机问题。

我们引入基于蒙特卡洛搜索的强化学习AI来给出我们选择的建议。蒙特卡洛方法实际是基于样例返回值的均值求解强化学习的一种方法,只需要实际经验,不需要对环境的先验知识,即可以在不了解任何概率分布的情况下,学习最优策略。

于是针对赛马娘的AI就应运而生。下面就是一个开了AI的玩家的桌面,左侧是游戏窗口,中间是dump了游戏内训练属性和事件的插件,右侧是基于插件结果给出训练推荐的AI。可以看到,AI会计算出每种选择的推荐程度、这局的运气水平以及预测的养成评分。

以前我最后育成结果基本只有个UG的评分,运气好的时候才能上个UF,用这个AI体验了几局,养出来的马基本没有低于UF的,提升确实很大。单从AI这部分来说,他真的算作弊吗?我用的这个版本需要一个截获回合信息的插件,这部分算是外挂没得说,不过现在有了手动输入信息来计算结果的版本,彻底和游戏本体没有任何关联。这种利用AI进行博弈的第三方工具算不算作弊,我觉得是个值得讨论的问题

3.

AI反作弊相关

图像识别的AI作弊可以分成两部分来看。首先是图像采集部分,可以通过扫描后台进程,看有没有显卡占用异常的程序来标记可疑用户。不过这种开AI自瞄的人,很多都是把视频画面推流到第二台机器上进行推理,整体类似DMA。这时候我们就可以通过设备信息和检测鼠标移动轨迹进行判断。我们可以尝试在画面中加入肉眼不可见的水印,增加模型推理的难度。其次是对后台异常的鼠标驱动进行检测,很多AI自瞄挂都要配合一些特定版本的鼠标驱动进行瞄准的操作,我们可以通过对使用这种特定老版本驱动、来路不明的鼠标驱动的玩家进行监控,来提前发现一些外挂的使用者。


05 AI自动测试相关

其实上面的AI作弊,更像是模拟出一个反应更快的人,反过来我们也可以利用这些技术来进行自动化测试。以图像识别为例,我们可以利用图像识别来检测模型是否正常生成、材质是否正确。

而凭借YOLO这种目标检测框架的实时性,我们可以做到在操作客户端的同时进行检查。如果我们利用类似AI博弈的技术,测到Bug为"奖励",漏测Bug为“懊悔”,并把玩法作为选择输入进去,是不是就能搞出来一个能编写用例或测用例的AI了呢?AI自动化测试还有很多我们可能没想到或是没敢想的点,欢迎大家一起讨论! 


06 结语

对于普通玩家来说,大部分外挂对于他们的游戏体验都是毁灭性打击。我们想要干掉游戏里所有的外挂,但对于一个火爆的游戏来说一个外挂都没有是很难做到的。所以我们要做的就是尽可能跑得比外挂作者快,尽可能地提高外挂的制作成本和开挂成本来减少外挂的数量。 






推荐阅读



一名测开的任务升级攻略


从小白开始和日志打交道的那些事


功能跟进之我见




 

都看到这里了,点个赞再走吧~

网易雷火测试中心
雷火测试中心致力于提供高质、高效的质量保障服务,建设成为国内顶尖的测试团队!
 最新文章