继上周陆续发布了一些防外挂的措施后,打金工作室(英文叫:Gold Farmer,真是太形象了)仅用了一天左右的时间就破解了客户端的通信秘钥生成算法,这个速度完全有点出乎我的意料,当然我也仅仅是猜测,工作室使用的是脱机外挂,否则很难同时登陆上万客户端,需要大量的硬件资源才可以做到。最近一段时间,打金工作室外挂集中在新开游戏服里面,大量创建角色并且登录游戏进行打金,有些游戏服外挂达到2W多,而正常用户仅有3-4K左右,同时进行操作时,对游戏服务器造成巨大压力,严重影响正常用户的游戏体验。本周在服务器端做了一些处理,效率有所好转,还有一点不理想的地方,下周还需进一步优化。
到底是哪里出了问题?
到底是什么原因造成外挂成灾呢?
客户端安全的失败
各种尝试一再证明,如果我们不是软件安全的专家,或者是破解软件的高手,客户端所做的任何措施都于事无补。通信加密仅仅能保障用户的账号和通信安全,不被中间监听或消息篡改。通信加密必须使用对称秘钥,也就意味着客户端和服务器两端都需要知道秘钥或者秘钥的生成算法,然而我们的客户端却是丢给用户的,而破解高手会通过脱壳、反汇编、动态调试等手段来推算秘钥的生成过程。
大家会有疑惑,那网银又是怎样保证通信安全的?为什么不使用非对称加密算法,不是更安全码?为什么不能借鉴呢?网银一般采用的是非对称加密和对称加密一起来解决安全问题的。非对称加密指的是公钥体系,如:RSA,对称加密算法,如:DES、3DES、AES等。在和网银建立连接的时候一般第一步先是使用公钥体系传输通信秘钥,然后用该秘钥来进行对称加密和网银服务器通信。但是,网银也仅仅保证的是个人用户的安全,保证个人用户的密码,通信不被监听和破解。而脱机外挂对于游戏服务器来说,它本身就是正常的游戏用户,它知道自己的账号和密码信息,就算使用银行的这种模式也是于是无补,因为你无法拒绝一个正常的用户的操作。只不过银行系统逻辑比较简单,限制比较严格,比如输错密码三次锁定,网络转账设上限等。而游戏就不能这样做,往往为了用户的便捷性,会让系统变的比较脆弱,容易被攻破。
账号注册太过便捷
大家会注意到,一般网站的账号的注册旁边总有一个奇形怪状的图形验证码,注册的账号的时候需要仔细辨认填写正确才能注册成功,现在图形识别越来越准了,图形验证码也是各种新招式,比如给你一个1+1请填写结果,或者需要提供手机号码,通过短信发送验证码。这样做的目的就是为了防止外挂自动注册,造成后台数据里面全是垃圾账户。
而网络游戏在运营的过程中,为了用户的便捷,吸引更多的玩家家,验证码都不需要填,这导致外挂可以随意创建账号。当然也有很多游戏的注册比较严格,不仅要正确输入验证码,还需要提供身份证信息,连接公安系统的网络进行验证。
免费的利益
工作室外挂一般都是奔着游戏系统免费产出的货币或道具而来,一般的MMORPG都会支持交易,而这些工作室外挂就通过大量的小号收集这些资源,最后以真实的RMB卖给游戏玩家。
能否砍掉免费的利益呢?能否关闭交易系统呢?多数游戏的答案都是NO,为了吸引真实的玩家,不得不赠送免费的利益,为了游戏经济系统的流通性,必须开放交易系统。当然也有游戏为了防止打钱工作室,而关闭交易系统,如著名的Diablo III,国服关闭了拍卖行,限制了玩家之间的交易。
游戏开发者能做些什么?
客户端安全是一场和破解高手的技术较量,如果我们都不知道破解,何谈对决?往往人家专门一心研究这方面的,而游戏开发者日常的功能开发早已身心疲惫,哪里还有心思去琢磨这些纷繁复杂的破解方法。这一场势不均力不敌的战争,往往以游戏开发者失败而告终。再加上需要长期坚持不断了解对手并思考改进之法,更是力不从心。
对于游戏服务端来说,现在面临的问题是:客户端可以随意被破解,账号可以随意被创建,系统又有巨大的利益诱惑。我们能做些什么呢?下面大概介绍一下我的思路:
1. 识别工作室外挂
识别外挂是第一步,而外挂往往就像正常用户一样,很难识别。
但作为工作室外挂,它们往往硬件和网络资源有限,导致同IP会登录很多用户,我们可以基于这个假设来进行识别。当然如果工作室搞一个巨大的机房,每台机器就跑一两个游戏客户端或脱机外挂,那就暂时没辙了。
问题来了,有些同学会说,脱机外挂就不会修改一下IP包里面的源地址吗,欺骗一下游戏服务器不就完了,这就是所谓的IP地址欺骗(IP Address Spoofing)。
IP地址欺骗是指行动产生的IP数据包为伪造的源IP地址,以便冒充其他系统或发件人的身份。这是一种黑客的攻击形式,黑客使用一台计算机上网,而借用另外一台机器的IP地址,从而冒充另外一台机器与服务器打交道。
在网络安全领域,隐藏自己的一种手段就是IP欺骗——伪造自身的IP地址向目标系统发送恶意请求,造成目标系统受到攻击却无法确认攻击源,或者取得目标系统的信任以便获取机密信息。这两个目的对应着两种场景:
场景一,常用于DDoS攻击(分布式拒绝攻击),在向目标系统发起的恶意攻击请求中,随机生成大批假冒源IP,如果目标防御较为薄弱,对收到的恶意请求也无法分析攻击源的真实性,从而达到攻击者隐藏自身的目的。
。场景二,原本A主机信任B主机,也就是B可以畅通无阻地获取A的数据资源。而恶意主机C为了能同样获取到A的数据,就需要伪装成B去和A通信。这样C需要做两件事:第一、让B“把嘴堵上”,不再向A吐请求,比如向B主机发起DoS攻击(拒绝服务攻击),占用B的连接使其无法正常发出网络包;第二、伪装成B的IP和A交互。
IP地址欺骗对于需要和游戏服务器进行正常通信的脱机外挂来说是不可能的,就算它修改源地址,这个地址也必须是一个合法的IP地址,并且对应的IP地址上面也需要跑着脱机外挂,否则无法进行通信。
为了简单快速地识别工作室外挂,我们就基于上面所说的简单假设:
工作室外挂的网络资源是有限的,同IP会登录大量用户。
基于这个假设的外挂识别会非常简单,只需要设定一个阈值,同IP登录超过N就认定是工作室外挂。但是要注意的是,如果在一个局域网内(出口IP相同)正常用户的数量超过这个N就会被误判,如网吧通常只有一个IP出口,如果大量玩家玩这个游戏就会被误判,所以N的取值要谨慎,假设需要加强一下:
1> 工作室外挂的网络资源是有限的,同IP会登录大量用户
2> 同一局域网内玩此游戏的数量超过N的可能性极低
上述两条任何一个不满足就可能会被误判。
2. 降低外挂请求处理的优先级
既然不能将这些工作室外挂拒之门外,那我们只好让它以不影响正常游戏玩家的情况下存在,不会因外挂太多造成正常玩家卡住。对用户请求的优先级做出调整,由上面判定的工作室外挂的消息处理优先级要低于正常用户,在服务器空闲的时候才去处理外挂的消息。这样就算服务器性能有问题了,率先卡住的是外挂,而不是正常用户。
3. 限制外挂用户发送消息的频率
一般游戏客户端给游戏服务器发送的消息是有频率限制的。若不做限制,真有外挂想捣乱,瞬间向服务器连续发送大量请求,那服务器是肯定吃不消的。工作室外挂一般会登陆大量虚假用户,整体的请求量还是很大的,为了降低整体请求量,可以限制外挂的消息发送频率,让该频率值小于正常用户。对于那些发送过快的直接进行踢线。
4. 限制外挂用户的登录
最直接的一招莫过于此,凡是判定为外挂的IP直接加入黑名单,禁止和游戏服务器建立连接,或者同IP同时登陆超过N个就拒绝登录。这一招效果肯定好,但是要慎用,除非有99.9%的把握能正确识别外挂,否则很有可能造成正常用户被拒之门外,万一是个大R玩家,那损失就大了。还有个原因游戏公司不想彻底把工作室外挂打掉:一方面是为了虚假繁荣,给正常用户造成一种错觉,这游戏真TM火爆,里面全是人;一方面是为了经济系统的平衡,给正常用户以非官方渠道以低价获得游戏中的虚拟货币的方式,只要不是太过分或者利用游戏漏洞去刷东西就行。
本周回顾
优化防外挂机制并持续观察外挂动态
这是一个持久的过程,与其奋斗,其乐无穷。抽空了可以研究一下软件破解相关的技术,知己知彼,才可百战不殆。
略读了一遍之前收集的论文,整理出比较重要的篇章
情绪有点低落
周四又加了一个通宵;身边又有一位战友离职;自行车又被玩爆胎;手腕腱鞘炎再次发作。我去,都TM用到了“又”字,难怪心情不好。