热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

swf文件数据格式分析

由于最近项目需要对swf文件进行分析,在网上找了不少资料,也参照了adobe官方发布的swffileformat文档,但是并不是很明白。后



由于最近项目需要对swf文件进行分析,在网上找了不少资料,也参照了adobe官方发布的swf file format文档,但是并不是很明白。后来经过几天的努力,终于有所顿悟(可怜天生迟钝,领悟能力比较差吧,那只有勤能补拙,多花点时间了)。下面把这几 天的努力成果和大家分享一下(其中部分资料是整理自网友,不过由于分不清谁是原创,我也没法给出完整的原文地址了,部分是经过自己修正的)。在整理网友的 资料时,大部分人的都是在对没有压缩的swf文件进行分析的,弄得我自己在测试的时候怎么总感觉出不来结果。后来继续查资料才弄明白了怎么对swf文件进 行解压缩。自flash 6以后的版本,生成的swf文件都支持压缩了,所以对于未压缩的swf文件解析实在是没有什么多大用处了。

    下面我们来看一下如何分析的吧!我以经过压缩的文件进行分析。(其实我也找不到那么低版本未压缩的swf文件了)

    swf文件头信息

   swf文件头包含的信息量巨大。告诉了人们SWF文件工作的方式方法等基本信息。

       Macromedia Flash文件格式是Macromedia Flash播放器在互联网上进行矢量图形和动画发布的文件格式。

      SWF文件格式不是为图像编辑器之间共享图像而是为高效的解释格式设计的,它的设计是为了满足以下条件:

      A:在屏幕上即时显示:此格式的最主要目标是在屏幕上即时显示和支持实例,彩色图像的快速播放,动画和交互式按钮。

      B:可扩展性:此格式为标签式格式,因此其播放器能够通过增加新的特性来进行升级而兼容其播放器的早期版本。

      C:网络发布:此格式能够在有限的网络资源和不可预测的网络状况下进行传输,文件被压缩到很小并且支持流式播放。SWF文件是一种二进制格式的文件,它不 能像HTML文件一样可以直接阅读和理解。SWF文件使用了诸如位压缩、可选字段式结构等方法来减小文件的尺寸。

      D:简易性:此格式简单的结构使Flash播放器变得很小且便于携带。另外,Flash播放器仅仅依赖操作系统特性中有限的集合。

      E:文件独立性:文件的显示不依赖任何诸如字体之类的扩展资源。

      F:可变性:文件能够在有限的硬件环境下很好的工作,而且能够尽可能的利用更好的硬件,这一点很重要,因为用户的计算机有着不同的显示器设置和色彩深度。

      G:速度:文件能够以很快的速度和很高的质量播放。

      H:支持脚本:此格式包含了约定格式的标签,标签规定了堆栈式机器解释字节码的顺序。字节码支持一种叫做ActionScript(动作脚本)的语言。 Flash播放器规定了运行时的ActionScript(动作脚本)模式,此模式允许原始的绘制、服务和Flash播放器特性之间相互作用。

     SWF文件的扩展名为.swf,它是一种MIME(多用途的网际邮件扩充协议)类型的应用程序(X-Shockwave-Flash)。

     SWF格式经历了若干个版本。在第5个版本中,SWF的标签设置经过了一次较大规模的充实和完善。从第6个版本之后,文件格式变化较小,例如仅在 ActionScript中越来越多的Flash新特性部分或者完全的被实现。因此,如果打算增加SWF文件中使用较新特性的内容,那么就应该熟悉 Flash播放器提供的ActionScript对象模型,对于这些最好的参考是O’Reilly的《ActionScript: the Definitive Guide》,由科林·莫克出版社出版。

     SWF文件头:所有的SWF文件均以以下头部开始:

     

文件头部是由一个三字节的标识符开始,为0x46、0x57、0x53(“FWS”)或者0x43、0x57、0x53(“CWS”)其中之一。 “FWS”标识符说明该文件是未压缩的SWF文件,“CWS”标识符则说明该文件前8个字节之后(即文件长度字段之后)的全部数据为开源的标准ZLIB方 式压缩。

ZLIB库所使用的数据格式在1950至1952年的请求注解, Internet标准文档(RFCS)中被详细说明。CWF文件压缩形式仅适用于版本6或者更高。

标识符之后是一个字节的版本号,这个版本号并不是一个ASCII码,而是一个8位的数字,比如,版本4用0x04标识,而不是ASCII码“4”(0x35)。

文件长度字段是整个包含文件头在内的文件字节长度,如果是未压缩的SWF文件(标识符FWS),那么长度字段应该是和文件大小恰好匹配,如果是一个 经过压缩的SWF文件(标识符CWS),那么文件长度字段是指文件经过解压缩之后的总长度,因此它一般不会和文件大小匹配,使用未压缩的文件尺寸能够让解 压过程获得更高的效率。

帧尺寸字段定义了影片的宽度和高度,它使用了RECT结构进行存储,这就意味着它的尺寸能够根据坐标编码所需的位数变化。帧尺寸的RECT结构使用的X和Y轴的最小值总为0。而X和Y轴最大值分别表示了宽度和高度(参阅位值的使用)

帧率是以帧每秒为单位的帧回放比率,此比率在SWF文件包含流式声音数据或者Flash播放器运行在低速CPU下时并不会得到保证。

帧数是整个SWF影片帧的总数量。

SWF文件结构

文件头之后是一系列连续的标签数据块,所有的标签都共享一种通用格式,因此任何解析SWF文件的程序都能跳过它不能识别的数据块。块内数据能够指向当前一个块内的偏移量,但不能指向其它数据块内的偏移量。这就使得标签能够被处理SWF文件的工具进行移除、插入或修改操作。

SWF文件格式

===============================================

标签格式

每个标签都是由一个类型和一个长度值开始的,存在两种标签头部格式:短格式和长格式。短标签头部用于62字节或者更小的标签数据,长标签头部能够用于任何大小不超过4GB的标签数据,从长远来看这将会是非常实用的。

注意:标签编码和长度字段并不是一个10位的位字段后面跟着6位的位字段,而是一个双字节的字,SWF文件不间断的字节排序使得这两者具有不同的布局。

该字段中的长度并不包含标签开始处的记录头部(即该字段所占有的长度)。

如果标签的长度大于或者等于63字节,那么它会被存储在长标签头部。长标签头部由一个标识长度为63字节(0x3f)的短标签头部和一个32位的长度组成。

描述标签和控制标签

SWF中的标签分描述标签和控制标签两种:

描述标签这种标签描述了SWF影片的内容—形状、文本、图像、声音等等。每个定义标签都为其描述的内容指定了一个被称为“角色ID”的唯一ID。Flash播放器把这些角色存放在一种叫“字典”的库里。描述标签本身不能驱动某个事件的产生。

控制标签这种标签可以创建和驱动字典中角色的实例,控制影片的播放。

SWF文件标签分类

通常,SWF文件中的标签可以任意出现。但尽管如此,也必须遵循少数几个规则:

1、一个标签只能依赖前面定义过的标签。任何一个标签都不能依赖在才后面定义的标签。

2、描述标签必须在使用它的任何控制标签之前定义。

3、流式声音标签必须以顺序方式存储。不规范的流式声音标签将会导致声音播放不正常。

4、结束标签一般是SWF文件的最后一个标签。

字典

字典是存放已经定义好的角色的库,它可以被控制标签所应用。字典的建立和使用应遵循以下规则:

1、描述标签定义了诸如形状、字体、位图或者声音。

2、每一个描述标签都被指定一个唯一的角色ID。

3、字典中的内容被存储在角色ID之后。

4、控制标签能够通过角色ID在字典中找到所需内容并对其执行某种操作,例如显示形状或者播放声音。

每个角色ID必须指定一个唯一的ID,不允许重复ID。例如,第一个角色ID是1,第二个是2。角色0被指定为表示空角色的专用ID。

并不是只有控制标签才能引用字典。描述标签同样也可以使用字典中的数据进行更复杂的角色定义。例如,按钮和剪辑标签都使用到了定义它们内容的角色。文本标签也包含了字体角色以便于为文本选择不同的字体。

以下图表说明了描述标签、控制标签和字典之间的一种典型交互关系:

===============================================

* 详见显示列表

处理SWF文件

Flash播放器会在遇到“显示帧”标签之前处理SWF文件中所有的标签。这样,显示列表将被复制到场景中,在处理下一个帧之前Flash播放器会 一直处于空闲状态。第一帧的内容是第一个显示帧之前的所有控制标签操作所积累的效果。而第二个帧的内容是第二个显示帧之前的所有控制标签操作所积累的效 果,依此类推。

文件压缩策略

由于SWF文件在网络中的传输日趋频繁,那么文件被尽可能的压缩将是非常重要的。有几种方法可以达到此目的。以下提到几种方法:

复用角色字典的结构能够让SWF文件的元素很方便的得到复用。例如,形状、按钮、字体或者位图可以被一次存储,多次引用。

压缩当一条线的起始坐标被假定是前一条线的结束坐标的时候,形状能够使用一种非常有效的三角编码方式压缩。距离一般也使用与最后位置的相对关系来表示。

默认值矩阵和颜色转换式通常拥有比其他结构更为通用的字段。例如:对于矩阵,转换字段是它最常用的字段,而缩放比例和旋转使用比较少。因此如果缩放字段没有出现,那么它会被默认为100%。如果旋转字段没有出现,那么就假定没有旋转。使用默认值能够缩小文件尺寸。

改变编码按规定,SWF文件只能将变化存放在状态之间。但显示列表使用的形状数据结构和位置、运动、移动模型却是相反的。

形状数据结构形状数据结构使用了唯一的结构来减小文件的尺寸以及非常有效的在场景中播放实名形状。

概要

SWF文件由头部和其后的许多标签组成。有描述标签和控制标签两种。描述标签定义了被视为角色的对象,它被定义在字典中。控制标签操作和使用角色,以及控制影片的流程。

下面来看一个例子,下面是经过压缩的一个swf文件的二进制文件截图:

其中的CWS表示文件是经过压缩的,0A表示文件版本号是10(即flash10)。这是前面四组数字的意思。后面的64 05 00 00四组数字表示了文件的大小。但是这里它是倒序的,所以其实是00 00 05 64,转换成10进制就是1380字节了。

现在我们已经解析了前面8个字节,从第9个字节开始,我们来看一下文件的尺寸吧。但由于版本6以后版本的swf文件从第9个字节开始进行了Zlib 压缩,而我们这里是flash10因此也是经过Zlib压缩的。我们对它做Zlib解压缩一下得到的一连串字节如下(从第9字节开始):

第9字节

 

 

 

 

 

 

 

 

 

 

 

第21字节

78

00

05

5F

00

00

0F

A0

00

00

18

01

00

这样的话,我们可以来看看文件尺寸了。swf文件的尺寸是采用RECT存储的,RECT是flash存储结构的一种。下面来具体看看怎么获取尺寸吧。

1.首先把第9个字节转换成二进制,即为01111000,取其中前5位数(01111),得到15,这里为什么要取前5位呢?主要是因为这5位数 存放是RECT结构的各个属性值的位数,说白一点就是:后面的X轴方向最小值、X轴方向最大值、Y轴方向最小值和Y轴方向最大值需要多少位二进制位存放数 据,这里得到的是01111(15)。由于尺寸需要存放的数据有X轴方向最小值、X轴方向最大值、Y轴方向最小值和Y轴方向最大值,并且每个数据的位数是 15位,再加上5位表示位数。因此我们至少需要4*15+5=65位来表示文件尺寸,用65/8=8.125,所以我们至少需要9个字节来表示文件的尺 寸。

2.把78 00 05 5F 00 00 0F A0 00等9个字节转换成二进制为:

   01111000 00000000 00000101 01011111 00000000 00000000 00001111 10100000 00000000

   先取前5位为属性值位数存放数据,然后每15位分隔一下,剩余的位数为多余,舍弃。如下

  

转换成十进制得到:

X轴方向最小值=0

X轴方向最大值=11000

Y轴方向最小值=0

Y轴方向最大值=8000

所以宽度(width)=(X轴方向最大值-X轴方向最小值)/20=(11000-0)/20=550,高度(height)=(Y轴方向最大值-Y轴方向最小值)/20=(8000-0)/20=400

PS:这里为什么要除以20呢?因为swf文件中的长度单位是twip,而20twip=1像素。

下面来看一下帧频,帧频是用2个字节表示的,即这里的00 18,转换成十进制数为24,则此处帧频是24。

再来看看下一个帧数吧,帧数也是用2个字节表示的,即这里的01 00,但是这里必须采用倒序方式解析,则帧数为1。



推荐阅读
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
author-avatar
璋houge
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有