浅谈外挂常识和如何防御
本文首发于行者AI
电子游戏自诞生以来,一直遭受着外挂的困扰,给游戏公司造成了不可估量的损害。本文希望通过介绍外挂的相关知识,让对游戏安全感兴趣、有意愿了解游戏安全知识的同学对游戏安全有个基本的认识。
1. 外挂基本概念
1.1 外挂基本定义
未经官方许可的,可以达到游戏作弊效果的游戏工具。使用这种工具,能获得其他诚实玩家无法达到、或者在短期内得到其他诚实玩家必须通过长期运行游戏才能得到的游戏结果。满足上述效果的工具,称之为“外挂”。
1.2 外挂的影响
外挂作弊行为十分恶劣地影响了游戏行业的发展。
首先,外挂的使用损坏了游戏的公平性。在外挂等游戏中作弊的最直接害处便是影响了游戏的公平性并破坏诚实玩家的利益。其次,它会破坏游戏玩法,损害游戏质量,从而缩短游戏生命周期。通过使用外挂,外挂者可以特别容易获胜或获得更高分数,失去挑战将使游戏不那么可玩。此外,外挂的使用会影响服务器的服务质量并加速玩家的流失。第三,它破坏了游戏公司和玩家的经济利益。游戏外挂造成的犯罪也经常发生。游戏公司主要通过收取增值服务或在线游戏玩家付费来赚钱。外挂的使用破坏了网游的可玩趣味性,减少了游戏用户的在线时间和该类产品的生命周期,这极大地损害了出品公司的经济利益。
1.2 外挂的分类
现如今游戏外挂的种类繁多,面对这么多的外挂很有必要对外挂做一些分类,方便分析和总结外挂的技术和特点。
不更改游戏逻辑和数据的”模拟挂”“脚本挂”
以按键精灵为代表的一类,它本质上不进入游戏内部,只是在外围通过识别游戏图片、文字等方式来模拟点击,达到获益的目的。将网络游戏中很繁琐的动作或者重复的无聊的很费玩家时间的流程和任务使用外挂帮助玩家完成,达到方便和解放玩家的目的。例如在网络游戏《地下城与勇士》中,角色存在等级制度,等级越高,可以带越好的装备,但是练级并不是一件美妙的事情,想要达到满级更是要花费很长的时间,在游戏满级前就要一直杀怪刷图,可能同一个图要刷几百遍。而刷图杀怪的过程就要一直按技能键和普攻键,比如普攻是 X 键,一天就要按几千上万遍,及其无聊和枯燥,所以外挂制作商开发出这种能够代替人们进行操作的外挂,可以利用其按键连点功能,来降低游戏的枯燥和痛苦,按一次就可以连续使用 X 键位,达到一直普攻的效果,在游戏人物进游戏后只需按一下 X 键,角色就可以一直攻击,玩家只需要控制角色的移动就可以了,让玩家远离这种无趣的连续点击键盘或者鼠标的操作。
图1. 按键精灵使用示意(图片来源网络)
修改游戏内存的“内存挂”
内存修改类外挂可以分为以下三种:
(1)第一种方法是利用 virtual X driver(虚拟设备驱动程序)直接查找游戏内存分配地址,这种方法需外挂开发人员有良好的编程基础和系统的底层驱动知识,是技术较难的一种方法,门槛较高。
(2)第二种方法就是用 ToolHelp API 函数,该函数是用来枚举进程和模块,获取进程和模块的 ID 与信息。黑客利用 ReadProcess Memory 函数从网络游戏的进程中读取到游戏的内存数据,但是该方法没有修改内存的函数,不能往内存里写数据,所以这种方法需要其他方法的配合,具有一定的弊端。
(3)第三种方法是利用游戏进程的对应函数,这种方法比前两种要方便和简单很多,游戏进程的对应函数很容易就能得到,例如利用:ReadProcessMemory 和 WriteProcess-Memory 两个函数对游戏进程进行读取和写入,这种方法是当下最流行最受欢迎的方法,该方法能修改市面上大多数的游戏内存。
下面是一些例子:
(1)以使命召唤OL卡配件为例。游戏的设定为武器可以装配不同的配件,正常情况下,M4A1只能装配2个配件。使用调试器调试游戏,分析武器的配件逻辑,可以发现:每次装备配件时,都会调用一个游戏函数,定义为AddWeaponAttachment(作者自己的定义,下同),而这个函数的调用参数通过不断的调试分析可以猜测为插槽Index以及配件ID,即:AddWeaponAttachment(SlotIndex, AttachmentID)。额外调用这个函数,即增加一次游戏逻辑的调用,就可以实现M4A1使用多个配件。
(2)以DNF倍攻为例。玩家在攻击的时候会有攻击力的叠加。同样通过调试分析,找到角色攻击函数,定义为Attack(Target, Power),参数表示攻击的对象以及攻击力,外挂可以修改这个Attack函数,使得Target为当前区域内所有怪物,Power为无穷大,那么Attack的效果即为全屏倍攻。
(3)以CF透视为例。游戏在渲染图像的时候会使用Windows的DiretX模块(DX游戏)。一般来说,在渲染每一帧的时候游戏逻辑会根据由远到近的顺序将当前屏幕内所展示的图像渲染出来,在最终呈现时会根据物体的遮挡关系真实的反映出当前场景,最终觉得当前所看到的画面。外挂可以修改DirectX的渲染逻辑,强制将遮挡关系修改,那么原本应该被遮挡的物体会在屏幕上显示出来,形成人物透视。
(4)以棋牌类游戏看牌挂为例。由于游戏逻辑的需要,玩家的底牌会在存放在内存中,而通过内存查看工具不断的变更查看条件,就可以在内存中的找到对应的底牌记录,知道别人的底牌之后,玩法就非常随意了。
窜改网络数据的“封包挂”“协议挂”
封包类外挂是难度较高的一种外挂技术,涉及多个技术问题,网络游戏的服务器端和客户端通信是利用 socket ,服务器端申请一个 socket 监听消息,并绑定到一个对应的 IP 地址和端口上,等待游戏客户端的连接,外挂制作者利用封包截取工具截取通信数据包,经过多次截取封包,分析数据,得到封包数据对应的人物操作或属性,若封包加密则分析其加密算法,网络游戏的前期由于其服务器功能的限制,一般封包都不加密或者采用异或加密很好破解,修改对应的数据,再利用封包截获工具转发给服务器,通过篡改通信数据来实现作弊。WPE是外挂玩家常用的封包编辑工具,下图是WPE工具示意图。可以抓到并修改游戏进程发出的封包,如果游戏自身存在封包方面的漏洞,就有可能被外挂作者发现并利用。
图2. WPE示意图。
其他类外挂
除了上面的“模拟挂”、“内存挂”、“封包挂”之外,市面上还存在一些比较小众的外挂。
(1)显卡驱动级别的外挂,直接修改显卡驱动。
(2)硬件外挂。定制鼠标芯片、鼠标高级宏、定制键盘或机械手等。
(3)AI外挂。基于深度学习、强化学习的人工智能外挂。表现形式类似模拟挂。
2. 防御外挂的一些方法
2.1 检测外挂的常见方法
(1)变量检测。设置一个全局变量。在游戏关键功能函数的外层函数赋值,在功能函数内部检测。正常游戏调用肯定是一步一步执行的,必然会对变量赋值,但是游戏外挂会直接调用功能函数,函数内部发现变量没有被赋值,而检测到外挂。
(2)堆栈检测。变量检测有一个弱点,那就是必须设置一个全局变量来传递信息,有可能被外挂作者利用内存扫描工具来回扫描发现变量,在调用前提前赋值规避检测。堆栈检测避免了这一点,实现原理是在游戏功能函数内部读取堆栈信息,以此得到调用函数的代码来源,如果发现并非正常代码调用的堆栈,那就是外挂程序了。
(3)数据检测。不断读取关键数据以查看是否被外挂篡改,不过直接查看太过容易被外挂作者发现,一般混在游戏正常读取数据的代码中间接查看是否异常。
(4)CRC检测。CRC检测主要是保护游戏代码不被外挂程序篡改,游戏中有一些关键逻辑代码,比如如果血量为0的话会判断人物死亡,外挂课程可以恶意篡改判断逻辑,让程序无论怎样都不会执行死亡代码,从而实现无敌效果。CRC检测的原理是,不断的读取关键代码的值,以此查看代码是否被篡改。CRC之类算法对自身的完整效验勾挂函数的完整效验,一些重要代码段另外单独校验,校验相关代码段VMP,必要的话返回服务器中验证。
(5)进程检测。获取系统进程列表,检测是否有常见外挂的进程名,如果检测到存在外挂进程。直接强制下线。
(6)行为检测。现在大力发展的新兴检测 如某企鹅的DXF就有此保护机制 效果甚好 甚至连图色辅助都无法在其幸存 搞得 一些人直接上机械臂,与上面几种方式不同:此种检测主要是检测用户的行为,主要是利用深度学习人工智能大数据对玩家的行为数据进行分析。比如一局游戏中一位玩家爆头和击杀率都特别的高,鼠标移动的轨迹几乎为直线,那么就可以把这些数据异常的玩家抽调出来转入人工检测,或者极为异常的直接封号处理。
2.2 防篡改思路
(1)游戏登陆相关封包处理。游戏的登录封包尽量复杂化,不同的封包类型中部分数据采用多重加密是必要的,多个端口乱序通讯,这些登陆分包是一次性的不用太担心算法效率问题,而此操作却可以大大增加逆向难度。
(2)游戏反调试保护。主流思想是驱动层进行调试器进程检测、标志位检测,HOOK重要函数等方法以及给游戏执行文件加猛壳利用壳的功能实现反调。
(3)服务器数据校验。收到客户端发来的消息后,对消息的合法性进行验算。比如上面提到的秒通关封包漏洞。服务器可以针对战斗数据做校验来进一步判断是否真的通关成功。
(4)快速小规模更新游戏。更新内容是代码混淆,基址变更。
(5)协议非对称加密交换密钥,对称加密传输内容,保护好服务端私钥,防止中间人攻击。流式加密,同样包发两次内容不一样。
(6)不定期弹出反外挂答题,答正确奖励经验,错误就掉线。
(7)客户端加密加壳防止调试和注入,程序签名防止篡改二进制。
(8)重要代码放虚拟机或者脚本里运行(脚本字节码需需改),一般黑客主要分析反汇编,复杂逻辑多套几层黑客就晕了。
(9)关键数据不落内存,一律使用getxx,setxx之类的接口,后面将真实数据经过变换以后才落内存。
(10)守护进程动态跟踪监控情况。
(11)决定性逻辑永远放在服务端。
(12)发现某黑客/外挂工具利用某漏洞破解了游戏,先看影响大不大,再看他挣不挣钱,影响一般又不挣钱的话可以先养着他,等他挣钱了用户多了,大型活动之前,一条指令就把它封了,用户退款都可以弄得他爬不起来。
(13)必须要放在客户端计算的逻辑将输入和结果hash同步给其他客户端验算,不对就踢掉。
(14)当检测到客户端触碰到某规则不要急着踢掉它,而是有概率踢掉,还要随机几秒踢掉,这样黑客发现一会这里断一会那里断,就蒙圈了。
3. 总结
现如今游戏外挂越来越多,网络开发商和玩家饱受困扰,任何一款相对火爆的游戏,都会成为外挂制作者重点关注的对象,从而造成外挂泛滥,玩家流失,致使游戏缩短运营时间。网络游戏安全问题日益严重,由于本人的能力和时间有限,本文提出的外挂检测机制和防篡改思路还有很多需要修改和完善的地方,因此希望有更多的人能够更加深入研究,早日净化当今的网络游戏环境,能够让后来的研究者少走弯路。
我们是行者AI,我们在“AI+游戏”中不断前行。
前往公众号 【行者AI】,和我们一起探讨技术问题吧!