艾格拉斯张鹏:重度手游防外挂及安全
图/文 游戏茶馆
前言
1月10日,【问道一线】品牌沙龙第一期,有幸邀请到的艾格拉斯创始人之一、CTO张鹏先生,以《游戏防外挂及安全》为主题,进行了近60分钟的线下分享。在文前,再次向艾格拉斯,及张鹏先生本人表示诚挚的谢意。
张鹏以艾格拉斯自研、自运营,7月上线,目前支持8个语种的重度手游《英雄战魂》为背景,对游戏安全做以下五个大类做分享:游戏服务器防外挂、游戏服务器防黑、web平台的api安全、客户端防外挂和备份。
(注:【问道一线】是游戏茶馆和CSDN共同主办,独属于开发者的纯技术小型手游分享会,每期一个主题,根据主题邀请一线人物献身说案,讲述开发,运营中,跳过的那些“坑”。俗称,开发纯干货。)
一、游戏服务器防外挂
1、客户端的安全和网络连接
做ARPG,通信这块儿是要非常注重安全的,曾经我们遇到过,有用户用截包器把包拦下来了,然后把数据改了,再发过来。其实现在,在手机游戏上,之前游戏的外挂、黑客,都能遇到。我们在通信这块儿,是强链接,在加密的方式上,你的密钥不能是固定的,我们使用的是一个有序的秘钥,比如,这次我们是“1”,下次是“2”,在下次是“3”……当然,这只是举了一个例子。
这样做的好处是,一旦你的游戏包被用户截住以后,他没有把办法通过这个包的秘钥或固定方式去破解。当然,他要是看到了你游戏的原码或者是分析了代码的工作方式,那也没辙。因为这是在客户端做的事情。
更加完整的加密方式,需要非对称加密。服务端和客户端约定一个钥匙,这个钥匙需要一个公钥和次钥进行匹配,通过约定的钥匙双方进行通信。每个包在发送之前,都是用不同的钥匙加密,每次加密通过错位等方式,将相同数据加密的结果每次都不一样,这样他们就很难分析。
以前在PC活跃的外挂开发者,在做手游外挂的时候,基本是无所不用其极,我们遇到最严重的,是直接把安卓包,直接把里面的SO这个文件破解,反编译把其中一个指令给改了。
首先第一点,在游戏过程中得把大门守好。
2、防加速
加速是最影响用户体验的行为。也是对游戏影响最直接的。之前,《英雄战魂》也遇到过这样的问题,有一个玩家,他发某一个技能的频率就很高,游戏是10秒发一次,他是1秒发一次;另外是对其他用户,两个人PK,用户花的钱比对手多,却一秒钟被打死了。这个怎么解决?由客户端向服务器,定期的发一个数据包,这个包的内容是当前时间。这样子可以做2各方面的事情:一方面是服务器能根据包,接收到这个包的频率,这个包发过来监测客户端,如果加速了,客户端频率会升高(当然会有一个误差值),如果过高我们会给他暗地里记上一笔,如果持续增高,那么这个用户就是在作弊了。还有一种加速是,不改发包频率,改客户端某一个操作的频次,提高频次,服务器通过频率没法解决,可以客户端的时间来监测。
一般加速外挂,不是针对某一游戏设计的,是通用的,把整个系统或者是进程的速度提升上来。通过客户端第一个包和最后一个包的时间差,与服务器第一个包和最后一次接受的包的时间做比较,如果时间差越来越大,那么这个玩家就是在作弊。
3、账号登陆校验
账号登陆系统,防止用户被盗号。有时候,游戏设计者会把用户名和密码放在客户端,如果有些用户装着恶意程序,有可能会被盗号,那么验证这一块儿,主要是防止用户的密码在传输的过程中被盗。比如HTTP在传输过程中,密码传输和简单的加密,都很容易被破解。一种方式是,使用HTTPS,现在基本大的网站和安全性比较高的网站,比如淘宝、支付宝这样子的,登陆都使用的是HTTPS,另一个就是,采用服务器与服务器之间的通信,这个是可信的,然后为了使传输过程中,密码不泄露,采用了MD5加密(这个加密是单向加密,只能加不能减),最后匹配这2个MD5的串儿密码是不是一样的。
有一个经验给大家分享:如果你用它的密码,生成了一个MD5的串儿,那这个串儿就会永远有效,用户也可以拿着去登陆,这个是不允许的,所以我们在这个加密MD5的时候,让它加入一个时间戳,这个时间戳,它不能太精准,太精确会有问题。比如你精确到秒级,服务器那端也是秒级, 这2个串儿的验证是通不过的。比如,那个是3秒加密的,到这边也需要3秒加密,而实际上服务器这边是变化的,随着时间增加,所以把时间精确到10分钟以内比较合适,再设置时把时间单位精确到毫秒,但把后面6位都填为0,然后它的时间应该在17分钟左右,往前推17分钟,往后推17分钟,这样产生一个MD码,那么就是加密方和匹配方,这2个只要相差在正负17分钟之内,就是可以验证通过的,这样就能防止用户拿着一个MD5码就去登陆。
4、关键数据服务器校验
关键数据(如技能CD、走路速度及距离)服务器校验,防止技能加速,瞬移,穿墙。部分采信客户端,关键数据以服务器为基准。战斗数值以服务器为准。游戏过程中如果用户采用加速或者是修改客户端的形式,使一些关键数据,比如发招的频率发生改变的时候,你不能无所事事了,这时候你需要去做一个校验,允许这个大招每10秒才能发送一次,那么我就记下,把这个招的上次发生的时间和这次发生的时间,考虑网络传输的时间差(需要有一定误差允许),比如你在7、8秒发过来我也是允许的,但是你要是在5秒或者是更短的时间发过来,就不被允许了。你可以发,但是不会生效,就像某个人打了一拳过去,但是并没有少血。
有时候,你判定太严的话,用户有时候真的是因为是网络原因传输速度的问题,导致用户被踢下线了,打电话过来质问客服。以前,客服就有被骂哭的。其实,我们在验证的时候,不能太严,如果多次被记录有违规的情况,给他再做进一步处理。
主要是说,服务器端对一些关键性的东西,要做一些校验,并且这个在计算过程中,以服务器为准,目前,我们公司的游戏,大多所有战斗、伤害数值等有关的数值,都是以服务器产生的,在最多的时候,服务端会说,我打到谁了,服务端会验证,可不可能打得着。战斗过程的伤害这些,全是由服务器来计算的。客户端,作为一个表现,来反馈给用户。
5、监控指令发送频率
这个监控指令的发送频率,跟刚才那个是有关系的,某一些指令你发送过于频繁的话呢,会导致这个游戏失去平衡,用户在它那儿,只要对他有利的,任何办法,他都可能用得上,所以,是需要监控某一些指令的发送频率。为什么单列出这一点,是有一些指令它其实发送频率本来就很高,有一些是每秒甚至每500毫秒发一次,所以你在校验的时候,很难在2个指令之间判定是否符合条件,因为网稍微卡一下,200毫秒就过去了,如果这个技能是500毫秒的话,它已经超过一半了,所以很难。所以,统计一段时间之内的平均发送频率,这样最终能够判定这个用户是否真正在作弊。一段时间之内平均发送时间超过了一半,那么就是有问题的。
那么,当我们监测到用户可能在作弊的时候,我们就让客户端发回来这个用户的进程列表,然后通过这些进程列表,配置了已知的外挂的进程名字,因为世界上外挂非常多,有些用户可能自己开发了一个外挂,所以,只能对已知的比较知名的,去比较监测,如果说有大量的用户反馈,某一个用户在作弊,然后我们会调出来他的进程列表,看是否有可疑。比如,如果有一个人在每次被反映他在作弊的时候,都有一个进程,并且这个进程是未知的,不知道是干嘛的,那就比较可疑了。那么,这件事情,就变成人工的了。
二、游戏服务器防黑
当游戏相对市场来说,用户比较多的时候,黑客就有利可图。1、操作系统最小化安装
首先,很多公司都是用linux,用windows很少了。在装的时候,最小化安装,然后开放的服务和端口最少,只把我们需要的应用端开了,其他的端口都关着。因为,有些应用它有漏洞,如果你没有专业的技术去处理这些问题,很有可能他就从某一个漏洞进来了。2、 远程操作限制
然后,我们一般是用SSH去登陆远程的计算机,还有呢我们的mysql端口,这些面向公网开放的话,是很不安全的,后来呢我们利用ss5代理登陆ssh,mysql,所有游戏服务器,采用远程终端管理系统进行管理,服务器自上架后,所有的管理操作由此系统完成,管理系统单点登录,仅开放一个服务端口,有效防止黑客入侵。对操作者来说是一样的。当然,如果公司比较有钱,可以搞一个硬件防火墙。ss5代理服务器安全,启用SSH证书登录验证,禁止root密码登陆方式。这样,可以防止密码泄露的情况下被黑。
3、GM远程操作限制
另外一个,远程操作限制。最早的时候,有用户切入到系统里面来了,拿到了我们GM工具,这是给客服用户,它拿到这个东西以后,开始给别人加钱,在淘宝上卖,卖砖石,卖代币这种形式来串改游戏数据。后来,我们在这块儿加入了一个用户验证信息,以服务器到服务器的通信形式。现在登陆的这个用户是否是合法的。4、应用启动权限
在服务器上,起应用的时候,千万不用root,我们最早那波被入侵的时候,就是因为我们的java应用或者是服务什么,都是以root来启动,然后黑客一旦进来以后,什么都看见了,最后把所有的系统整理以后,不能以root方式启动,必须给他创建一个新的用户, 然后用那个用户启动,并且那个用户,只对那个文件夹或某一个应用生效,要不然就很危险。5、数据库管理
mysql用户权限分离:root,操作用户,游戏用户数据库的密码文件采用多次加密方式,系统内不存在明文密码。并且数据库密码周期性的更新。防止侵入后,数据库密码泄露。把操作用户分离,跟系统这块创建新的用户来运行是一样的道理。就是不能把root开放给游戏或者是很多的人。最后,就是系统内核、数据库、jdk及时升级或打补丁。
案例1:
早期,因没有启用socks5单点登陆服务器,服务应用采用root启动,仅使用iptables来限制,遭到了黑客入侵,利用服务漏洞进入我们服务器,并安装木马代码块,利用“中国菜刀” 远程登陆入侵。这个叫“中国菜刀”的黑客工具,入侵进来以后,在我们一个HTTP的一个服务器上,挂了这个东西。这实际上是一个很简单的PHP/JSP 的一个网页,但他能通过这个网页做很多事情。它获取到GM工具以后,拿到了比较高权限的用户密码,把号盗走了。
案例2
早期,黑客利用专有gmtool工具入侵游戏服务端修改数据解决办法,启用了认证服务器,服务器应用https服务,采用s2s通信,避免入侵及损失。
三、web平台的api安全
通常web平台的安全主要指通行证验证系统,充值系统服务端,渠道sdk服务端。1、应用服务器管理功能限制
应用服务器(Glassfish)的管理端口只允许ss5代理服务器的IP访问;应用服务器使用非root用户启动,以防止黑客入侵成功后获得操作系统的控制权限,并通过iptables的端口转发功能,将对80端口的请求转发至应用服务器提供服务的端口;对游戏服务器或渠道方访问的API接口(如:充值回调)设置了IP白名单;我们公司使用的是一个Glassfish集群提供的一些充值等服务,他的管理端口不能对公众开放,必须使用单点登陆的方式去访问,使用非root启动,少开端口,对一些比较特别的IP使用白名单,Ip白名单,比如说:充值回调。百度、360等渠道告诉我们这个游戏充值成功了的时候,只允许它个别的IP来访问,不允许公众来访问。
2、密码别名
在应用服务器内配置需要使用密码的资源时(如:数据库连接池),通过应用服务器提供的密码别名功能,隐藏数据库账号的明文密码。当部署的应用需要使用数据库资源时,只需将别名注入到应用中,应用只能获得数据库连接,无法获取到数据库账号。
防止在开发过程中,数据库还有一些其他的密码泄露。解决密码以明文方式显示。
3、数据库限制
为应用分配账号时,创建独立的表空间,且只对此账号可见,同时收回账号对表、表索引、存储过程、函数的删除权限四、客户端防外挂
1、资源检测机制
由于限制了其他作弊方式,玩家中通过修改客户端的资源来使某些值变化,比如速度值,技能cd等。检测客户端资源文件md5,报告给服务器做验证。
2、内存数据混淆和修改
关键数据内存混淆已及修改检测,玩家位移,玩家位置的检测,跟客户端的关键数据内存混淆相结合,关键数据传送服务器校验,位移位置数据,有效防止玩家穿墙,加速,瞬移等作弊手段。有些用户用疯狗还有其他内存修改器,去改游戏运行过程当中的数,当然怎么改,通过不同的匹配数,改一下匹配一下,改一下匹配一下,最后查找到这个位置是血,然后把它锁定成10万,永远不死的。改了以后,再去和别人PK,把血锁定,就永远不会死。怎么解决?一个是我通过要服务器去验证,另外一个在客户端,在制作的时候,把关键数据在内存里面混淆。
在内存里不是以一个通常的数字放在里面,而是经过加密,用户是找不着这个数的,普通的用户不能通过内存修理器去改这个数据。
3、文本资源加密
通过可逆的加密算法,加密敏感的文本资源,使用户不能通过简单的二进制查看得到具体的内容。这个通常不会对游戏平衡性产生影响,但是也不好。从公司出去的东西,不让用户改,自定义改变格式,用户就不可以用一些普通的方式去窜改。
数据库,主从要分离。当你的用户量很大的时候,主库写,从库读。主库不要做统计功能,比如你要看日活多少,3天内登录多少,不要在主库上去做,在从库上去做,这样不影响主库服务用户。以前,我们尝试过半夜3点钟去做这些统计,但还是有一会儿用户就登不上。
然后把二进制LOG打开,防止在极端的情况下,回档。有时候,硬件坏了的情况,数据配置错了,刷钱,刷物品等。把这些工作做好了,你想恢复到几点几分,都能恢复过去。我们一般是保存10天。
每一天有一个备份,这个东西是实时的,这个是冷备,我可以从某一天备份的时间,和编LOG的时间。每次大家在更新之前,一定要备份,防止策划、程序上的一些BUG,导致用户在上去以后把数据搞乱了。
服务器最好用raid,我们主要的数据库呢都是用raid10,一个是速度快,另外是它安全性很高。
后记
分享这些,是希望大家提一个概念性的东西,知道哪些地方有坑,因为我们做每一件时间、人力和金钱的成本。遇到安全性问题,一定要马上解决,因为用户的信心非常重要,如果用户信心崩塌了,你这个游戏基本就走不远了。今天,我对我们遇到了哪些坑儿,是怎么解决的分享,就到这儿。谢谢。如果觉得《艾格拉斯张鹏:重度手游防外挂及安全》对你有帮助,请点赞、收藏,并留下你的观点哦!