如何提高游戏的安全性

发表于2015-06-24
评论0 1.3k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594

       从网络游戏诞生开始,游戏的各种安全问题就层出不穷。至今为止还未曾出现过没有安全问题的游戏,然而因为安全问题而死掉的游戏却是不胜枚举。

 

一、网络游戏常见的安全问题有哪些?

         首先,我们先来看一下游戏面临着哪些安全问题?换句话说也就是游戏自身存在着哪些安全风险。这里,先罗列一下做游戏的都具备的四条安全基本常识:


         1.1、客户端的逻辑一定是不可相信的。

         因为可能是外挂功能。如图1中所示。由于DNF游戏的碰撞探测逻辑以及伤害计算逻辑都是在客户端进行的,那么外挂就实现了全屏秒杀怪物的功能。

1

         1.2、操作游戏客户端的不一定是人类

         因为可能是打金机器人。如图2中所示,这是七雄争霸的一个外挂截图。基本上所有的存在金币交易的游戏都会存在自动游戏类型的挂机外挂。因此玩游戏的不一定是玩家,很有可能是这样的挂机外挂在自动游戏。

2

1.3、就算是人类也不一定是玩家本人

         因为玩家的帐号可能被盗。如图3所示,在DNF中玩家帐号被盗以后,非法玩家进行的一次恶作剧。

3

         1.4、是玩家本人也不一定是在玩游戏。

         因为玩家不是来玩游戏的,而是利用游戏中的信息平台进行非法信息传递,进行一些诈骗,或是游戏相关的广告牟利。如图4所示,CF游戏中,非法玩家利用游戏的短信息功能,冒充官方发送消息进行诈骗。

4

         以上的4条游戏安全基本常识其实也就对应了游戏外挂、游戏工作室、游戏木马、游戏内诈骗这四大游戏安全问题(私服也是游戏安全问题,属于网络盗版,主要依靠法务打击)。

 

1.5、放bin就是放源码

         另外,在这里也补充一个在黑客圈逆向界里面被广大分析人员所认同的一条真理“放bin就是放源码”。

这意思就是只要能够接触到bin文件(二进制文件,计算机的所有文件存储都是以二进制的形式存储的),那么对应bin文件的逻辑都是可以通过逆向分析而最终还原成源代码的,因为CPU是人类所设定的,那么所有经过CPU所执行的代码都是人类所能理解的,因此依据二进制文件而还原成源代码的一定是可以完成的任务,只不过其影响其难度的仅仅是时间问题。对我们游戏来说,也就意味着敌人一定是可以将游戏中设计在客户端的所有逻辑分析清楚的,同时也包括了客户端与服务器之间的通信协议。因此,游戏必然会存在安全问题。

 

二、常见的攻击方法有哪些

         第一步,游戏逻辑确认

         敌人在接触到游戏以后,往往第一步要确认哪些游戏逻辑是放在客户端的,哪些游戏逻辑是放在服务器的,从而确定可以实现的外挂功能。如果发现,玩家攻击的数据包中含有怪物的伤害数值,那么敌人就一定会尝试修改伤害数值去实现伤害类的外挂功能,而如果玩家攻击的数据包中仅仅只有一个攻击操作指令的话,那么敌人也就清楚了要做变态功能可能难以实现,但是可以通过尝试加速发送攻击操作的指令来进行加速攻击类型的外挂功能。

 

         在协议分析的过程中,有以下三点的小技巧可以加速分析过程。

1.           网络阻塞:利用windows提供的防火墙过滤接口(关键APIPfAddFiltersToInterface)对网络包进行拦截。敌人可以将所有的网络包都进行规则过滤而不让发出或接收,使得游戏产生网络阻塞。

假如,在网络阻塞状态下,敌人尝试攻击一个怪物,如果怪物仍然会掉血量的话,那么很有可能伤害计算的逻辑就是在客户端进行的。接下来敌人就会重点在伤害计算的逻辑部分想办法开发外挂功能。

 

2.           聊天协议:利用聊天协议来分析游戏的客户端协议发送机制、游戏协议加密算法等。因为对于协议加密算法的破解来说,分析聊天协议是属于选择明文攻击类型的。在密码分析中按破解难度从难至易的排序为:唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击。

由于利用聊天协议,敌人可以自由的输入任何需要加密的原始明文,可以自己控制时间频率的方式来出发协议交互。因此,敌人很容易在众多的协议中迅速的定位到聊天协议,从而破解游戏的通信机制和协议加密算法。

 

3.           协议明文点:对于游戏逻辑确认来说,实际上最快速的方法还是寻找到游戏协议明文点。这样可以不用关心游戏协议是如何加密,如果组包,如何发送的。只需要在游戏协议加密前,分析游戏明文协议内容即可。

 

第二步,游戏函数分析

         在确认了游戏的那些逻辑在客户端以后,敌人接下来就需要通过对具体的函数分析来实现外挂功能。在这个阶段,敌人除了老老实实的利用ODIDA这类分析工具进行动态的调试分析或是静态的代码分析以外,仍然存在一些小技巧,可以有效的加速游戏函数的分析过程。

1.      明文字符串:明文字符串信息可以让外挂制作者比较容易的定位到游戏的关键逻辑。格式化字符串的输出也使得外挂作者分析参数含义和参数类型(浮点数、十进制、字符串等)变得容易。游戏逻辑信息暴露的越多,游戏客户端被逆向分析的速度就会越快。

FPS游戏,通过OutputDebugString输出了如下的字符串信息。

将游戏的EXE进程内存dump存储以后,使用IDA软件协助分析,首先可以找到OutPutDebugStringW的系统API函数。依据该API的调用关系,找到了函数地址。再依据该函数的交叉引用关系,非常快速的定位到了调试信息输出的函数。

对函数分析分析,很快找到了影响了parts 输出相关函数逻辑和关键的内存数据。通过修改该内存数据,实现了枪枪爆头的外挂功能。

 

2.      DLL模块的导出函数名DLL的导出函数会暴露游戏的函数名。

使用PE工具可以很方便的查找到DLL模块的导出函数名,从而可以非常方便的分析出对应函数的游戏逻辑。

MMO游戏,其协议保护的逻辑实现的非常复杂。但是由于其通信模块的DLL直接导出了相关的函数:

使得可以外挂通过直接call函数的方式就可以实现游戏相关的功能。而减去了分析游戏的时间。对于MMO游戏来看,越多类似的函数暴露,脱机外挂、自动挂机外挂的实现就越容易。

 

3.      内存明文数值:如果游戏中的关键数值在内存中是未加密存储的,那么使用类似CheatEngine的工具,可以非常容易的搜索到这些数值,在定位到这些数值的内存地址以后,利用CPU的特性,设置内存访问断点,定位到对这些已知意义的数值进行读写操作的代码。如果这类数值的逻辑是客户端处理的,那么敌人可以直接修改这些数值实现外挂功能。

 

第三步、外挂功能制作

         在这一阶段,敌人需要将分析的结果转换为实际的外挂功能。从游戏的层面来讲,可以将这些外挂功能分为如下的四个层面:

         1游戏之上:

         这一层面的外挂功能大多是实现在游戏的外层,并没有影响到游戏本身的逻辑。主要包括了以下三种类型的外挂:

         模拟按键:例如较为通用的按键精灵软件。外挂通过模拟鼠标、键盘的操作实现自动游戏的功能。

         标记感知:例如CF游戏中的方框透视外挂,外挂通过读取敌人的坐标,然后将其绘制到屏幕中。

         游戏多开:大部分游戏或多或少玩家都可以通过一台物理机进行多开的方式来获取利益。

 

         2游戏之下:

         这一层的外挂功能,主要实现在游戏的下层,主要是指在操作系统层面来进行外挂功能的实现。主要包括以下三种类型的外挂:

         系统加速:通过修改操作系统的时间,CPU的时钟频率达到对游戏客户端的时间相关逻辑的控制。例如通用的变速齿轮软件就可以实现对大部分游戏的变速处理。

 

         渲染效果:在FPS类型的游戏中,大多都可以通过对D3D这类系统函数的修改,甚至是在显卡驱动层进行相关渲染效果的修改,从而实现透视功能。例如下图中CF游戏中的人物透视功能。

 

         网速控制:利用下图中的NetSuspender软件,可以对数据报进行阻塞和发送。

比较经典的外挂功能就是利用该软件实现的“断网瞬移”功能。玩家在自己移动的时候将网络包给阻塞掉,假设阻塞时间为5秒。在这5秒的时间内,玩家的坐标未能够同步到服务器和其他玩家的客户端。当玩家将网络恢复以后,对于服务器来说延迟了5秒以后才收到客户端坐标变化的数据包,并在0.1秒内完成了逻辑处理,并同步到其他玩家。这样在服务器和其他玩家的表现上来就是:该玩家在5秒前在某地,而现在类似瞬间移动地出现在另一个地方。

 

         3游戏之中:

这一层面的外挂功能则实际影响了游戏的执行逻辑,改变了游戏玩法或者说是游戏规则的原有设定。主要包括以下三种类型的外挂:

修改内存:外挂通过修改游戏的内存,包括内存运行期的数据或是游戏的代码指令。实现外挂功能。如下图中所示,为LOL中的外挂修改了视距数值,实现了比游戏设定更大更远的第一人称屏幕距离,扩大了玩家的视野,使得玩家在被gank的时候,能够提前发现。

 

 

         修改文件:大部分的渲染相关的资源都是从文件中读取的,外挂通过修改这些文件,或是替换这样的文件,就可以实现这类外挂功能。例如下图中的LOL多玩盒子,通过修改本地文件的方式,实现玩家可以使用需要点券购买到的英雄皮肤(虽然仅仅玩家本人可以看到)。

         函数调用:在外挂分析清楚函数的逻辑,以及函数的参数以后,外挂就可以通过直接调用函数的方式实现外挂功能。下图中的例子,就是DNF的外挂通过调用召唤逻辑的函数,实现召唤出无数的魔剑,实现轻松刷图。

 

         4游戏之路:

这一层面的外挂功能就是在客户端与服务器的通信过程中实现外挂功能。主要包括了以下三种类型:

协议篡改:如下图所示,玩家仓库中有多把CF的“黄金枪”,而玩家获取这些稀缺品的方式,就是修改购买道具的ID为指定武器的ID。从而实现功能。

 

协议重发:如下图所示,外挂直接重发游戏中的攻击操作包,实现玩家一次攻击操作,造成怪物三次伤害的外挂功能。

 

         协议拦截:如下图所示,外挂将服务器对怪物的动作控制指令给拦截掉,从而实现怪物不动,只被挨打的“锁定怪物”的外挂功能。

 

第四步,外挂产品运营

         外挂为了获取收益,同样也需要运营他们自己的产品。除了外挂自身的一些渠道以外,有以下的两点,是值得做游戏的所注意到的。

1.       利用游戏环境信息:利用游戏的信息发布,信息交流渠道进行获利。如下图中的挂房外挂,利用外挂的方式占据游戏房间数靠前的房间资源进行广告盈利。或者可以进行外挂获取渠道的宣传。

2.       利用游戏自身功能:在DNF游戏中,曾出现过外挂利用游戏中的邮件功能,将外挂使用者的虚拟财产进行自动转移,获取收益。

 

三、如何提升游戏安全性

         在明确了常用的手段以后,我们再来看看可以如何提高游戏的安全性。除了将游戏逻辑更多的放入到服务器进行以外,有以下三点建议值得实施。


         第一,客户端隐藏信息——提高分析门槛

         虽然游戏被敌人分析是难以避免的,但是我们通过增加敌人的分析门槛,可以降低敌人的产出效率,加大敌人的分析成本。

         1.去除敏感字符串明文信息。在游戏发布版本中将明文字符串给去除掉,或是进行加密处理,可以有效的防止敌人通过这些字符串信息迅速的定位游戏逻辑。另外,dll模块尽量使用lib库的方式静态链接到exe中,减少暴露在文件中的导出函数名。敌人知道得越少,对游戏安全越有利。

         2.      通信协议的保护设计。以下简单的对三种协议加密模型的风险进行描述:

模型A

         模型A,虽然对游戏协议进行了加密处理,但是由于协议数据的产生与协议数据的发送为同一的调用链关系,外挂作者可以非常容易的通过对Send点的函数调用关系分析而找到Encrypt函数处理,即通过分析发现协议明文点。

模型B

         模型B主要是将协议数据的产生和数据的发送进行了分离。这样外挂作者通过Send点的函数调用关系分析只能找到协议数据的发送线程。为外挂作者分析出协议明文点增加了难度。

模型C

         模型C,对不同的协议进行了不同的加密处理。这样外挂作者难以找到统一的协议明文点,外挂作者需要对不同协议的加密算法分别进行分析。增加了协议分析难度。

         3. 聊天类协议的单独处理。聊天消息与游戏逻辑消息建议按照如下的模型来进行设计。

         聊天消息所进行的协议加密函数,组包函数,发送函数都与游戏自身的发送函数进行隔离。这样也有利于对发言频率进行限制。

4.  界面显示与逻辑处理数据分离。对界面显示的数值在内存逻辑中都需要进行加密存储,即使简单的异或XOR处理,也可以有效的增加分析的难度。使得外挂作者难以通过类似cheat Engine的工具进行相关数值的分析和代码分析,增加了分析的门槛和难度。

5 关键数值的内存加密处理。除了界面显示的数值以外,一些游戏的关键数值都需要进行内存加密处理,如人物属性,背包信息,怪物列表,地图坐标信息等。特别是对于FPS类型的游戏、RTS类型游戏中的坐标数值,如果不进行加密存储,很容易被外挂所利用,实现感知类型的外挂。


         第二,通信之路设立关卡——加强外挂监控

         除了增加敌人的分析门槛以外,在游戏的实际运营中,需要加强外挂的监控,主要从以下的两个方向上来进行。

1.  协议校验。对通信协议的每个字段都必须要进行严格的逻辑边界检查,于此同时需要记录和保留协议边界检查出错的玩家信息。用于监控和了解游戏在外网被敌人分析和攻击尝试的情况。

2.      游戏日志处理。尽可能的详细记录游戏内所有能够反映玩家所有行为的日志。通过对游戏日志分析监控,尽早的发现游戏异常。另外,也可以增加服务器专用于对游戏日志进行延迟的校验,发现一些明显的外挂功能。


         第三,后端服务器实时操纵——增加控制手段

         在游戏的实际运营阶段,服务器可以通过增加控制手段,通过一些实时的操纵来降低外挂对游戏带来的影响,或是有效对外挂进行打击和控制。

         1.  游戏日志级别的实时控制。服务器需要对游戏的日志输出级别进行实时的控制的功能。在正常的情况下,留存游戏运营所必须的日志即可,但是在有异常的时候,可以通过对一些测试号玩家的日志级别进行实时的控制,用于不同级别的日志分析,从而找到游戏外挂功能的数据特征,进行有效打击。

2.  服务器功能实时的关闭或开启。例如物品产出、任务副本、角色等级等逻辑。常见的功能可以是关闭某道具的产出。这样利用一些特殊道具进行金币复制的外挂功能(严格意义上来讲可以认为是游戏bug,但是往往需要利用外挂才能触发),都可以在发现的时候实时的控制影响,而降低因为修复bug而带来的服务器停机时间。

3.      对非RPG类型的游戏进行等级限制。由于非RPG类型的游戏,缺少了玩家帐号的成长成本,往往一个低等级的帐号也能够体验到游戏的核心玩法和功能。使得外挂玩家并没有号码成本,使得封号策略对这些玩家没有实际的效果。例如对游戏房间的进入等级进行设定的话,会使得一些高等级的房间中使用外挂的玩家减少,提高高等级用户玩家的游戏体验感。

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台