Laan's steps..

Feed Rss

swf代码混淆的心得

12.17.2008, flash, by .

这是一个比较折磨人的过程。到目前而言,60%的工作已经完成。演示地址请查看:http://www.laan.so/?p=422

目前做到的程度:

1:对类名进行混淆;包名称统统去除——这样的话反编译出来的类就没有包结构了。

2:混淆类的常量、静态方法。

3:混淆实例常量、变量以及方法。

大的过程:

过程是一个比较复杂的过程。基本工作很多,比如swf文件的解析及拼凑,比如abc文件的解析及拼凑。其中涉及的内容比较多。其实最基础的还是二进制操作以及位操作。像UB, SB, FB的读取等都是比较基础。

接着是需要了解整个swf中视觉元素和abc代码的关联。这个过程我刚开没有太注重,结果最后遇到了很大问题。比如swf标签中的SymbolClass标签中,存在类链接信息。

接下来就是从abc文件中提取类名、变量、方法等元素,进行混淆操作。

细节:

1:混淆操作是将所有需要混淆的字段添加到一个列表。然后混淆为a_0,a_1…. 这个过程比较简单。就是一个变量递增。考虑到以后的扩展,就把整个混淆数据都保存下来了。作为一个标签加入到了swf文件中。

2:类名的混淆是难一点。由于库中原件可以链接到一个类,当这个类类名被更改时,需要相应的更改连接名称。这个时候需要提取出SymbolClass信息——一个swf中有可能会存在多个SymbolClass。将SymbolClass中绑定的类名提取出来。这是,当混淆一个类时,同时更改相应的绑定类名称。

3:方法的混淆是目前遇到的最难的一步操作了。有方法是可以override的;而且还有可能是一个接口的实现。比如一个类实现了接口IEventDispacher。这个时候这个类实例是有方法addEventListener。在混淆操作时,方法addEventListener被提取出来做混淆操作——其实是一个错误的过程。但是在abc文件中,这些是没有任何特殊标记的。无法判断该方法是否是接口方法。于是需要一个特殊字符集:处在该字符集中的字符是不会被混淆的。

这个时候有会遇到一个问题:字符集怎么来收集。

我的操作是将abc文件中所有的flash自带类的方法名作为特殊字符。比如你的程序用到了Timer,此时reset,start,stop等关键字被收集到特殊字符集;比如你用到了IEventDispatcher, 则addEventListener,removeEventListener等关键字被列为特殊字符。

这个过程是一个相对死过程。主要目的是让混淆过程忽略一些关键字。

这个时候又会遇到一个问题:比如说你的程序是从外部加载数据解析数据:xml.imageURL。而,此时你恰好有一个类中存在方法imageURL。由于所有字符在字符池里面是单一存在的,你将方法imageURL混淆为a_123时,对xml.imageURL的解析便变为了xml.a_123。这种情况是混淆程序是无法预知的。此时就需要让用户建立一个特殊字符集。http://www.laan.so/?p=422中的演示就已提供一个特殊字符集输入过程。

4:到这个步骤后,大多是swf已经安全混淆了。但是,还存在个别问题:动态获取类的问题。有的时候程序还存在这样的语句getDefinitionByName(“laan.config::Config”);由于类名及包名已被混淆,因此需要将”laan.config::Config”这样的字符更改为对应的混淆后的字符。这时回到类混淆——在类名混淆时,需要记录下原始类名及混淆后类名的对应关系。待到最后,对整个字符池进行遍历,找出这样的字符,替换。阿弥陀佛~~~

唉~~~ 过程真的是比较痛苦。就此中告一小段落了。

swf代码混淆的心得 有 5 条回应

  1. 哈!
    了哥,
    代码混淆,反破解。强悍。

    回复
  2. 复杂一点的基本上运行不了,之前的加密也一样.加油~

    回复
  3. 呵呵 正在努力中啊~~~~~~~ 比较痛苦

    回复
  4. 2009-02-20 在 09:26 tian1boy

    呵呵昨晚不是取出类包成功了吗!

    回复
  5. 2009-03-31 在 12:44 闪刀浪子

    现在看明白了。呵呵。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>