wKiom1TaLMrxWfDzAAXEYf-f4CM449.jpg

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


本文目的:


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


设计目的:

  

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

                    ——自恋的张左峰


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


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

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

    3.客户端预埋暗桩,即时可以发现有外挂或第三方工具作祟

        事先防御永远比事后再查效率高

                  ——自恋的张左峰

    4.防止脱机外挂出现

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


    这套东西,是我与王旭东(PowerBoy)同学合作完成,我负责设计、技术思路,他负责技术实现与具体算法,本套东西是2010年的研究成果,现在5年过去了,不知道Flash特性是否有更好玩的东西出现,也许可以做更多的东西。


———————————必火无敌分割线———————————


必备工具:Doswf 好朋友Laan开发,请自行百度搜索


功能说明:


    体外环节:

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

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

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

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


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


    OK,我们正式开始介绍


    Flash环节:


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


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

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


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


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


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


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


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

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

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

    4.root开始corssdomain,开始843

    6.root使用参数链接GameLoginServer

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

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

    9.gamemain.swf开始执行

    10.正式开始游戏逻辑


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


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



    服务器环节:


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

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

    3.entype.swf有多个,对应不同的GameMain.PBJ,服务器根据他的条件来下发,扰乱破解思路

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


    通讯协议环节:


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


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


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


    简单说就是,你要付出体力,来把这几十个算法,一一进行破解,才能正常的和服务器通讯,其实没啥难度的啊,加减乘除,一个大学生一天能写出来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%的大牛们,没来折腾我们,实在感谢 :)


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


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


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


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


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


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


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


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