Laan's steps..

Feed Rss

谈谈加密和混淆吧

04.15.2009, flash, by .

还是谈谈自己一直在做的一个应用:flash加密及混淆。从去年8,9月份开始研究。先是研究swf的文件结构,然后是abc的结构。慢慢也明了swf运 行的原理。特别是研究abc结构后,收获很多。然后在写as代码的时候会联想到这些会编译后对应的指令。比如 var a:Number = 3。对应指令就先在local数据中设置一个空间:null,接着一个指令将该空间转换为Number类型,然后添加一个byte数据3到scope,最 后才是指令将3复制到给先前的空间。a字段是不会被编译进去的,这就是为什么用编译软件看到的临时变量都不是原先的名称;再引申下,你可以尽量明了的命名 临时变量,比如:var theFirstValue:Number = 0, 而不用var b:Number = 0。很明显theFirstValue很适合阅读,而且反正也不会编译到swf中去,不用担心太长而增加swf体积。

接下来自己便开始做 加密。先想到的是加壳的方法。后来和别人一交流,才发现,这种方法其实已经早已不是什么新想法了。只要你研究写swf的文件结构,就很容易想到这个方法。 虽然后来想久,尝试很久,还是没有更好的加密方法。其实对于swf而言,已没有加密可言。除非借助与第三方交互。或者adobe自己的人去加密——毕竟 swf文件结构白皮书公布的信息只是一部分而已。所以,最好还是混淆。

加密完成之后,我就开始研究混淆。研究过abc结构的人,应该都很 清楚:要混淆一个方法、一个类名其实很容易。比如你有一个类ABCD,这时候你只要在abc数据中找到这个ABCD,替换为你想混淆成的样子,比如 aaa1。重新组装abc,就完成了混淆。但是如果你有一个类alpha呢?你将alpha混淆成aaa1了。然后你会发现你的代码:(new MovieClip).alpha = 0.3;变成了(new MovieClip).aaa1= 0.3;——swf是一个高压缩的文件格式,abc也是如此。它不可能为同一个字段保存两字。也就是说你的类名alpha和属性alpha引用的是同一数 据,当这个数据被改变是,一切引用该数据的地方都改变了。于是,你需要一个操作:将不混淆字段复制。就上面这个例子:将alpha数据复制一份给“new MovieClip”使用,而类alpha使用的一份进行混淆。
好,这样完成了一小部分。但是还会有问题。比如你从服务器接受了一个xml数据:
<root>
<title>best wish to demi</title>
</root>
然 后你会通过xml.title来得到这个数据。但是你恰恰这个时候有类方法:public function get title():String。然后你混淆了title为aaa1,然后xml.titlt变为xml.aaa1了,就获取不到数据了。于是又涉及到一个 问题了:特殊字段。还比如:
getDefinitionByName(“MainAPP”); MainAPP是特殊字
ExternalInterface.call(“eval”, “alert(‘asdf’);”); eval是关键字
等等。有了这些特殊字和copy字段后,就可以进行大力混淆了。当然本人研究也是有限,很多情况没有遇到过,所以肯定会漏掉一些情况。

以上只是自己的对加密和混淆的一些心得。有不对的地方,敬请指正。
另外就是可以下载DoSWF,里面有上面谈到的加密和混淆功能。

谈谈加密和混淆吧 有 2 条回应

  1. 了哥
    学习了这种“一直”的态度

    我不知道自己要学的东西太多还是缺乏耐性
    很难像你“一直”的去完成一些想法
    真的感觉要学的太多

    回复
  2. 我混淆的思路是traits提取到swf中所有的类名、方法名和属性,和这些信息在常量池strings里的位置,再替换掉,应该可以避免一些特殊字

    回复

发表评论

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

*

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