[转载]SWF文件格式和ABC代码混淆工具的开发(二) – SWF和ABC文件格式

[转载]SWF文件格式和ABC代码混淆工具的开发(二) – SWF和ABC文件格式 – Tony Huang 的编程园地 – 博客园.

在2010年11月28日,我在盛大举办的WeDoSwf会议上,我做了一个演讲,主题就是关于Swf的文件格式和Abc文件的混淆。

最近一个多月的时间里面,各种零零总总的事情特别多,一直没有时间把这个东西整理好放到博客中。

首先呢,把我的演讲的视频的ppt放上来:
视频:
http://v.ku6.com/show/MwjMgfhEgUFoiZhx.html

PPT:
http://www.slideshare.net/swfsh/swfabc

然后呢,经过我们的努力,我们已经将这个东西做成了一个产品,有兴趣的朋友可以去我们的公司主页上下载试用:
http://www.orandea.com/product?lang=cn

回到正题。在上一篇博客中,我已经说明了为什么需要对Swf文件进行加密,那接下来说说Swf文件和Swf内嵌的Abc文件的文件格式:

Swf文件格式

Swf文件格式呢,是Flash Player所使用的文件格式。Swf文件格式具有一下几个特点:

  • 基于Tag的流媒体技术
  • 内建压缩支持

这两个技术,尤其是第一个技术对于Flash的发展起到了至关重要的作用。

基于Tag的流媒体技术

Swf文件是由文件头和一系列的Tag组成的,下面这张图很好的说明了Flash的文件结构:

我们可以将Swf文件看成一个串流,然后顺序的从头读到尾来进行播放。
那么有那些种类的Tag呢?
这里说几个经典的:

  • SetBackgroundColor这个顾名思义就是设定swf的背景颜色的,我们在编译Flash的时候,设定的背景颜色最终就会生成这个Tag
  • ShowFrame接触Flash比较早的朋友应该都知道,在很久很久以前(我是慢羊羊村长),网络上的大部分Flash是可以一边下载一边播放的,这在当初 56kbps的小猫时代可谓是惊天地泣鬼神的功能啊,当时互联网上涌现出了一大批的优秀的Flash动画作品;哎呀,扯远了,回来回来。说说 ShowFrame的用途吧:在Flash里面,你可以通过其他的Tag定义位图,定义图形,定义补间动画,然后再放到舞台上去,而这个 ShowFrame的作用就是把这一帧的画面显示出来,意义重大吧:)
  • DoAbc我们都知道,从Flash 9开始,Flash引入了Avm2虚拟机、Abc文件格式和AS3语言,大大提高了Flash中脚本的执行效率。所以Flash9应该算是划时代的一个版本啊。DoAbc类型的Tag的作用就是把Abc文件嵌入到Flash中

我们先来用Swfspy看看,我们的Swf文件到底包含些什么东西:

具体Tag的定义,大家可以参考一下参考文件中的“swf_file_format_spec_v10.pdf”。

内建压缩支持

从Flash6开始Swf文件格式开始支持压缩功能,主要的压缩算法采用的是zlib中的deflate算法。
通过Swf文件的第一个字节我们就可以分辨出这是压缩的Swf文件还是平铺的Swf文件。
第一个字节是Signature byte,如果是’F’表示该Swf文件没有压缩过,如果是’C’表示该Swf文件采用了deflate算法压缩。
这里需要注意的是,Swf文件的压缩从容是从SWF File Header的第9个字节开始的,也就是从FrameSize字段开始,就全是压缩的内容了。
这里同时给大家提供一个建议就是,对于纯位图的资源文件,建议不要采用压缩的文件。因为本身所有的位图数据不是采用JPEG格式压缩的就是采用zlib格式压缩的,如果再采用压缩格式的Swf,那就会导致用户的Flash Player需要解码两次才能访问图片数据。

Abc文件格式

Adobe在设计Avm2和Abc文件格式的时候,大量参考了Java的设计。Abc文件格式几乎是Java中的class文件格式的翻版。
此外Adobe在Swf文件格式和Abc文件格式使用了大量的相似但是不同的基本数据格式,最典型的例子就是可变长无符号整形的存储,在Swf文件格式中 是U30格式,最多使用4个字节,但是到了Abc文件里面就变成了AbcU30,最多使用5个字节。给开发工作带来了很多麻烦。
Abc文件格式是一种结构化的文件格式,主要由以下几个部分组成:

  • 版本号Abc文件格式的版本号,现在只有一种可能,就是16.20
  • 常量池常量池是Flash为了减小Swf的体积,加快Swf的运行速度设计的一个基础设施,主要包括了“整形常量”、“无符号整形常量”、“双精度浮点常 量”、“字符串常量”、“命名空间常量”、“命名空间集常量”、“Multiname常量”,非常多,但是对于咱们程序员而言并不复杂。
  • 元数据主要是各种类、方法、函数、常量、属性等等等等的声明信息
  • 方法体方法具体包含的的指令都在这个部分保存。

Abc文件格式的具体内容,限于篇幅就放到下篇文章里面吧!

参考资料

快速连接

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏