code-cleanup

Flash 网页游戏制作的加密的设计思路与手段

1468443935812105.png

本文原作者与所有权归属:张左峰,现任有妖气总裁

本文目的:


  希望通过本文章,来全面的阐述基于 Flash 网络游戏的加密安全方案,从思想,到技术,到实现手段的一个完整的、有效的全面介绍。


设计目的:

  

  加密方案最强大的永远是人的大脑与逻辑,而非技术手段!

  首先我要说的是,这是一套方案,由各个环节来完成各自的使命,使其成为一套有点点复杂的加密方案,当初设计设套方案时,也参考了 Flash 独有的一些特性,希望这套方案可以完成如下使命:


    1. 客户端尽可能进行保护,防止泄露后第三方开私服。

    2. 客户端进行二进制保护,防止进行静态反编译(硕思、ASV)等。

    3. 客户端预埋暗桩,即时可以发现有外挂或第三方工具作祟,事先防御永远比事后再查效率高。

     4. 防止脱机外挂出现。

    5. 其他防护目的(下面都会具体说明)。


开发必备工具:Doswf


功能说明:


体外环节:

      在这套方案的最外部,有平台来进行一些安全防护的实现,他们的目标是为了保护平台用户利益不受损失,具体的方案如下:

    1. 登录时间戳:在 Web 平台,有具体的登录时间戳,有时间有效期验证,具体可以防止别人截获了 http 的字符串,用别人账号登录。

    2. http 地址加密:具体使用了 MD5 串与 Base64,防止进行明文穷举。

    3. 前台挂 iframe:这么做,是可以让浏览器的地址栏,只看到一个不变的地址,防小白用的。


     体外环节的安全保护,我们不做具体讨论,知道有这个东西即可!


    OK,我们正式开始介绍


Flash 环节:

      首先,我们要把所有的东西都介绍一遍


     gameBase.swf     这个是通过 http 来调用的最初始 SWF,它是所有 SWF 的壳,或者理解为加载器。

    Encrypted.swf    这是一个通过 GameLogin 服务器端 Socket 传过来的一个 SWF 这里利用到了 Flash 的一个特性,Socket 传输的 SWF 没有浏览器缓存实体增加了破解难度。


     gameLobby.pbj     这是游戏的主文件,也是最核心的执行程序,Flasher 看到这里是不是会说,哎,这不就是用 Pixel Bender 处理了一下吗?


     其实并不是这样的,起名 Pbj,就是为了迷惑你,让你简单的以为他是 PB 生成的,这样让你进入思维误区,让你顺着我的思路去研究,结果发现,这根本就不是一个正常的 PB 文件。


     它其实是一个经过外部软件处理的特殊的 SWF 文件,我们有一个小工具配合这套方案,他的作用是,对 gameLobby.swf 进行二进制的位移进行,二进制都位移了,你就算用 ASV 搞它,我相信只有 ASV 崩溃一条途径……


     好了,我们来梳理一下流程


    1. 通过本地工具,对 FB 编译好的 gameLobby.swf 进行二进制位移,生成对应的 PBJ 文件

    2. 这个位移算法的恢复算法,放到了 Encrypted.swf 里

    3. 现在开始加载网页,调用 root.swf,得到了 GameLoginServer 的参数

    4.root 开始 corssdomain,开始 843

    6.root 使用参数链接 GameLoginServer

    7. 认证完毕后,服务器通过 Socket 传给 root 一个 Encrypted.swf 文件

    8.root 读取,并使用它恢复 gameLobby.pbj

    9.gameLobby.swf 开始执行

    10. 正式开始游戏逻辑


     这也是图上的中间那条线的流程,在这个过程中,还会有跟服务器校验的环节


     工具的使用,使用 Doswf,来对 Root 进行加密具体功能请看图中最上角的图片    


服务器环节:

     1. 服务器知道 root 的版本,与一些文件特征,这样防止被篡改或旧版的来连接服务器

    2. 服务器知道 root 的加载域,服务器有个白名单,非此域用户不允许链接

    3. Encrypted.swf 有多个,对应不同的 gameLobby.pbj,服务器根据不同的条件来下发 (时间等动态数据),扰乱破解思路

    4. 服务器所使用的校验的 MD5 串,取自 http 客户端某个文件资源的 MD5 值,防护脱机外挂


通讯协议环节:

      通讯协议的加密非常重要,明文在外那太恐怖了,WPE 就能搞定你


     首先,我们使用最简单的对称算法,那些高级的 Base64 啥的就算了,服务器早崩了


    1. 协议变密文:我们通过客户端的 Encrypted.swf 里的关于协议的 key 进行对称算法的加密,由于我们是弱强度,算法变化多,服务器会根据特定的条件下发这些信息,来跟客户端通讯,具体可以看图中通讯协议的那个大块


     简单说就是,你要付出体力,来把这几十个算法,一一进行破解,才能正常的和服务器通讯,其实没啥难度的啊,加减乘除,一个大学生一天能写出来 100 个。但是嘿嘿,作为研发商可以雇几个大学生来干这事,这就变成了从拼技术到拼资本阶段,这正是公司的强项,破解者累到吐血,你说他还会去破解你的东西么?


    2. 防止加速齿轮:这块要通过客户端和服务器的配合来完成,具体的就是绝对时间与帧频关系的比例,来计算出这家伙有没有加速,但是如果他用 1.1 倍速。。。我还真没办法,因为我们也要预判网络堵塞的情况发生。


    3. 协议序列号:这事为了防止有人用 WPE 截获特定的封包,来进行反复发送的重放攻击,举个例子,破解者抓到了加密过的封包,当然,他肯定改不了,乱码嘛……但是他可以反复发送进行逻辑漏洞的穷举实验,很多卡 BUG 就是这么搞的。所以是很有必要进行这方面的防护,我们的做法是在网络层与服务器进行数据序号的对应,服务器下发给玩家的数据应该是连续的,不可能 230 号封包,在序列号应该是 100 的时候发过来,这样客户端不予回应,同理,服务器收到客户端非连续的数据,也不予回应,这样,那种 WPE 的玩家就无计可施了。


暗桩环节:

     暗桩的目的用于监控、预防、提早发现,千万别让破解者发现你的暗桩,所以一定要隐蔽,不要出现任何 “惩罚” 环节,比如发现了掉线啥对的,你是这次把他搞下线了,但是对方也警觉了!


    1. 检查是否是合法的客户端用户:我们这么实现的,在心跳协议中,我们会随机每间隔 20-30 分钟,会在一个心跳协议中,某一个位上,出现一个小标记,客户端,见到这个标记后,会回应这个协议,也是心跳协议上的小变化,这样做的目的在于,如果他不是合法客户端,他肯定不会注意这种细微的环节,如果连续 3 次,没有得到这个特殊的心跳协议,服务器会记录这个用户的详细数据(ID,行为等等)然后以重要事件来通知管理平台!


     其实我建议,多来点这种检测,真要是有脱机外挂出现了,挺麻烦的


    2. 服务器的指纹:服务器上其实也有类似的设计,目的是为了防止服务器端泄露,如果在运营过程中,出现这种事情,我们可以第一时间知道(毕竟联运有这个风险,Liunx 服务器只要在本地,怎么都能进入,对吧?Windows 就更别提了)


     当然,我们后续的做法更狠一些,服务器启动的时候,一些代码要从我的中心服务器下发,嘿嘿,被我列入黑名单的服务器 ID,那就根本无法启动。所以泄露了,你也运行不了


     暗桩,一定要隐蔽,让人发现了,你就被动了!


未解决的问题:


     这套方案中有一个比较尴尬的地方,也是 C/S 网络结构应用难以避免的地方,就是第一次跟服务器通讯的时候,我不知道你是否是合法的,不知道你的来源是否真实


     因为只要是 C/S 结构,这个问题就可以进行各种的模拟和伪装,这也是我图中那个连接线中间索要表达的意思


     就好像第一次服务器问你,你是合法的客户端么?你可以回答,我是,服务器会继续问你,那你的证据呢,客户端出示证据,但是这些所有的东西,只要搞清楚原理,我都可以模拟出来


     甚至包括大名鼎鼎的 Nprotect,也有这个问题,在 05 年,我们曾经实验过,在脱机外挂后台调用完整客户端用以应付,NP 的客户端合法性检测,呵呵,这么搞谁也没辙,所以我一直不认为,纯技术能解决这些问题,最终还要落实到 “成本” 中。这块我会在另外一个文章具体讲一下我的想法和思路


     如果通过 “成本” 杠杆,让破解者知难而退


     如果大家对这块有好的方案,请给我留言,告诉我,实在感谢!


总结:


     这套方案最大的特色就是,简单、有效、耦合性强


     简单有效就不说了,其实没啥技术含量,比起那些虚拟机、多进程监控、各种反 Anti 的手段,实在是小儿科,但是的确有些效果,我们至少防护住了 90% 的人


     大家可能很奇怪,耦合性强不是不好吗,但是在加密这块,各个环节组成的整套方案,无疑会大大的增加破解难度,因为你无空子可钻,你需要把这套东西的所有环节都打通,都搞明白,才能得到破解者想要的效果,无疑大大的增加了破解的时间和难度


     但是它自身也有自身的问题,环节太多,人工出了错,超级麻烦。但是安全性和便利性本就是双刃剑,对吧?


     其次,在未解决的环节中的确存在了一个困扰了我 10 年的疑问,第一次链接如何判断是真实用户,后续所有的校验,都无法解决这个问题,这可能就是 C/S 结构的特点


     最后,希望这个分享可以帮助大家拓展思路,对安全的投入是无形资产,安全就是保证我们的投资(你花了这么长时间做的游戏,就是你的心血,你的投资)


     但是也别为了安全而精力跑偏,因为世界上没有绝对的安全,防护住 90% 的人就是胜利,大牛年年有,唯有今年多!


     好了,真的是最后了,希望大家的游戏产品都大卖,都财富自由!


     像还继续战斗在游戏研发一线的同学们致敬,共勉!


    PS:钱永远挣不完,身体是自己的,多锻炼,合理安排休息!


分享到:

0 条评论

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

昵称

沙发空缺中,还不快抢~