关于Flash(swf),我们需要明确一点:
***Flash字节码的意义都是公开的 所以如果cracker真的有足够的耐心他最终还是可以破解掉你的Flash。我们能做的只是尽量提高Flash被破解的门槛让cracker破解它需要消耗的时间大于自己更新版本的间隔就好了。
一般而言,对于游戏,无非是为了防止cracker修改游戏数据,制作外挂,当然也有人为了破解游戏,提取素材,提取音频,提取音乐等等。
现在Flash页游已经走下坡了,没多少人关注了,而且这种加密方案也比较成熟了。但是,正因为Flash小游戏很多,这里边大量的素材资源,也许就是非常不错的资料来源。
先简单回顾一下怎么做游戏的加密,防止破解或外挂:
1、关键数据加密
适用防范对象 使用内存修改工具妄图直接修改关键数据的初级cracker 原理 关键数据不使用明文保存 具体做法 对关键数据的存取使用AES或XOR等算法进行处理保证关键数据在内存中不以明文保存(做一个类用于存取,每次把数据取出后用临时变量做加密解密)
2、修改数据包
适用防范对象 使用Fiddler等各种工具篡改回包或使用假数据发包的初中级cracker 原理 加密数据包并在数据包里面加入防伪信息 具体做法 对数据包内容进行简单的AES或XOR加密并在其中加入类似TCP/IP协议的Sequence ID前后台共同对数据包进行校验。
3、Flash初级加密
适用防范对象 会用Flash破解工具破解之后尝试对Flash源码进行修改的中高级cracker 原理 提高使用工具破解Flash之后读懂源码并进行修改的门槛 具体做法 直接使用工具如DoSWF等对Flash的关键代码进行加密和混淆 4、Flash高级加密 适用防范对象 没有足够的时间和耐心的高级cracker 原理 使用各种恶心的技巧对自己的Flash关键内容进行保护 具体做法 (1)对关键代码进行混淆 ——提高破解后读懂代码的门槛 (2)将保有关键逻辑的main.swf以二进制形式嵌入到工程里在外层使用loader的loadBytes()方法进行读取并实例化 ——提高直接被抓包抓到关键SWF的门槛需要cracker解析文件二进制内容才能拿出来关键的swf (3)加载main.swf之前检测关键类是否已经被定义过并且将main.swf加载到与loader.swf不同的ApplicationDomain ——防止cracker用preloader等方法事先定义关键类用来顶替main.swf中的同名关键类提高类替换的门槛(父程序域覆盖子程序域)
(4)关于第2点,还可以把二进制做得更绝一些,例如把二进制加密了,然后再在程序里边解密,而解密程序,又可以用Pixelbender来做(Pixelbender的破解又难了很多)。当然,最重要的是,必须先把loader部分混淆,让反编译软件无法直接得到可运行代码,这样cracker就失去耐心了。
好了,说完加密,那么现在这么多flash小游戏,破解一下,拿点素材来使用也是不错的选择。
反编译提取素材,当然要依赖于Sothink等反编译软件了,但是很多游戏的素材和主swf都以二进制形式嵌入的,这样对于sothink swf decompiler来说是无能为力的。反编译出来只有这样的空类:
这时候需要自己根据swf格式说明,写个程序提取出对应的二进制数据,再用sothink来反编译。