zoukankan      html  css  js  c++  java
  • (转载)SWF 文件分析(二)

    原文:http://rcant.com/wordpress/archives/278

    上篇文章,我们分析了SWF的文件头,这里我们要分析SWF文件的真实内容:

    首先来说明下SWF文件结构:

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

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

    记录头部(短格式)

    字段 类型 说明
    标签编码和长度 UI16 10位标签类型6位标签长度

    注意:标签编码和长度字段并不是一个10位的位字段后面跟着6位的位字段,而是一个双字节的字,SWF文件不间断的字节排序使得这两者具有不同的布局。
    该字段中的长度并不包含标签开始处的记录头部(即该字段所占有的长度)。
    如果标签的长度大于或者等于63字节,那么它会被存储在长标签头部。长标签头部由一个标识长度为63字节(0x3f)的短标签头部和一个32位的长度组成。

    记录头部(长格式)

    字段 类型 说明
    标签编码和长度 UI16 10位标签类型 6位一定是111111
    长度 UI32 标签长度

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

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

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

    SWF文件标签分类
    通常,SWF文件中的标签可以任意出现。但尽管如此,也必须遵循少数几个规则:
    1、一个标签只能依赖前面定义过的标签。任何一个标签都不能依赖在才后面定义的标签。
    2、描述标签必须在使用它的任何控制标签之前定义。
    3、流式声音标签必须以顺序方式存储。不规范的流式声音标签将会导致声音播放不正常。
    4、结束标签一般是SWF文件的最后一个标签。

    字典
    字典是存放已经定义好的角色的库,它可以被控制标签所应用。字典的建立和使用应遵循以下规则:
    1、描述标签定义了诸如形状、字体、位图或者声音。
    2、每一个描述标签都被指定一个唯一的角色ID
    3、字典中的内容被存储在角色ID之后。
    4、控制标签能够通过角色ID在字典中找到所需内容并对其执行某种操作,例如显示形状或者播放声音。

    每个角色ID必须指定一个唯一的ID,不允许重复ID。例如,第一个角色ID1,第二个是2。角色0被指定为表示空角色的专用ID
    并不是只有控制标签才能引用字典。描述标签同样也可以使用字典中的数据进行更复杂的角色定义。例如,按钮和剪辑标签都使用到了定义它们内容的角色。文本标签也包含了字体角色以便于为文本选择不同的字体。
    以下图表说明了描述标签、控制标签和字典之间的一种典型交互关系:

    好吧,接下来我们就来看看上次的那个SWF的解析内容:

    上次解析到头文件结束  00 18 01 00 位置:

    第一个标签:
    记录头部 44 11 11 44 0001000101 000100
    因为 000100!= 111111 所以是短格式而且这个标签的长度为 4 ,标签的类型为 69

    这里先给出从别人那里得到的一张标签和具体内容对应的一张表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Tag-value     Tag-name
    0            End
    1         ShowFrame
    2         DefineShape
    4         PlaceObject
    5         RemoveObject
    6         DefineBits
    7         DefineButton
    8         JPEGTables
    9         SetBackgroundColor
    10     DefineFont
    11     DefineText
    12     DoAction
    13     DefineFontInfo
    14     DefineSound
    15     StartSound
    17     DefineButtonSound
    18     SoundStreamHead
    19     SoundStreamBlock
    20     DefineBitsLossless
    21     DefineBitsJPEG2
    22     DefineShape2
    23     DefineButtonCxform
    24     Protect
    26     PlaceObject2
    28     RemoveObject2
    32     DefineShape3
    33     DefineText2
    34     DefineButton2
    35     DefineBitsJPEG3
    36     DefineBitsLossless2
    37     DefineEditText
    39     DefineSprite
    43     FrameLabel
    45     SoundStreamHead2
    46     DefineMorphShape
    48     DefineFont2
    56     ExportAssets
    57     ImportAssets
    58     EnableDebugger
    59     DoInitAction
    60     DefineVideoStream
    61     VideoFrame
    62     DefineFontInfo2
    64     EnableDebugger2
    65     ScriptLimits
    66     SetTabIndex
    69     FileAttributes
    70     PlaceObject3
    71     ImportAssets2
    73     DefineFontAlignZones
    74     CSMTextSettings
    75     DefineFont3
    76     SymbolClass
    77     Metadata
    78     DefineScalingGrid
    82     DoABC
    83     DefineShape4
    84     DefineMorphShape2
    86     DefineSceneAndFrameLabelData
    87     DefineBinaryData
    88     DefineFontName
    89     StartSound2

    所有,第一个tag对应的是FileAttributes(文件属性)
    44 11 19 00 00 00 。恩恩,很好很好

    第二个标签
    记录头部 7f 13 13 7f 0001001101 111111
    因为 111111 所以是长格式取后四位作为这个标签的长度 0x000001CB = 459 ,标签的类型为 77
    属性是 Metadata,内容是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
    <rdf:Description rdf:about=''xmlns:dc='http://purl.org/dc/elements/1.1'>
    <dc:format>application/x-shockwave-flash</dc:format>
    <dc:title>Adobe Flex 4 Application</dc:title>
    <dc:description>http://www.adobe.com/products/flex</dc:description>
    <dc:publisher>unknown</dc:publisher>
    <dc:creator>unknown</dc:creator>
    <dc:language>EN</dc:language>
    <dc:date>Dec 212010</dc:date>
    </rdf:Description>
    </rdf:RDF>.

    第三个标签:
    记录头部 44 10 = 10 44 = 0001000001 000100
    短标签: 标签长度为 4  标签65
    标签属性:ScriptLimits
    标签头  内容为  44 10 E8 03 3C 00

    第四个标签:
    记录头部:43 02 = 02 43 = 0000001001 000011
    短标签:标签长度为3,标签类型为9
    标签属性:SetBackgroundColor
    标签头  内容为 43 02 FF FF FF

    第五个标签:
    记录头部:5A 0A = 0A 5A = 0000101001 011010
    短标签:标签长度为26,标签类型为41
    标签属性:未知
    标签头  内容为 5A 0A 03 00 00 00 06 00 00 00 04 00 4F 37 00 00 00 00 00 00 77 C1 FD 06 2D 01 00 00

    第六个标签:
    记录头部:C8 0A = 0A C8 = 0000101011 001000
    短标签:标签长度为8,标签类型为43
    标签属性:FrameLabel
    标签头  内容为 C8 0A 41 53 33 54 65 73 74 00

    第七个标签:
    记录头部:BF 14 = 14 BF = 0001010010 111111
    长标签:标签长度为 00000110 = 272 ,标签类型为82
    标签属性:DoABC
    标签头  内容为 

    1
    2
    3
    4
    5
    6
    7
    BF14 1001 0000 0100 0000 6672 616D 6531 0010 002E 0000 0000 0B00 07415333 5465 7374 0D66 6C61 7368 2E64 6973 
    706C 6179 0653 7072 6974 6506 4F62 6A65 6374 0C66 6C61 7368 2E65 76656E74 730F 4576 656E 7444 6973 7061 7463 
    6865 720D 4469 7370 6C61 794F 626A 6563 7411 496E 7465 7261 6374 6976654F 626A 6563 7416 4469 7370 6C61 794F 
    626A 6563 7443 6F6E 7461 696E 6572 0516 0116 0318 0216 0600 0807 0102 0702 0407 0105 0704 0707 0208 0702 0907
     020A 0300 0000 0000 0000 0000 0000 0000 0101 0209 0300 0100 0000 0102 0101 0401 0003 0001 0108 0903 D030 4700 
    0001 0101 090A 06D0 30D0 4900 4700 0002 0201 0108 23D0 3065 0060 03306004 3060 0530 6006 3060 0730 6002 3060 
    0258 001D 1D1D 1D1D 1D68 0147 0000

    对于这部分内容可以有时间探讨,一般进行反编译 或者加密都是对这部分进行的

    第八个标签:
    记录头部:0C 13 = 13 0C = 0001001100 001100
    短标签:标签长度为12,标签类型为76
    标签属性:SymbolClass
    标签头  内容为 0C 13 0100 0000 4153 3354 6573 7400

    第九个标签:
    记录头部:40 00 = 00 40 = 0000000001 000000
    短标签:标签长度为0,标签类型为1
    标签属性:ShowFrame
    标签头  内容为 40 00

    第十个标签:
    记录头部:00 00 = 00 00 = 0000000000 000000
    短标签:标签长度为0,标签类型为0
    标签属性:End
    标签头  内容为 00 00

  • 相关阅读:
    第二章、Redis入门介绍
    最高的牛
    增减序列
    激光炸弹
    分形之城
    约数之和
    奇怪的汉诺塔
    费解的开关
    递归实现排列型枚举
    递归实现组合型枚举
  • 原文地址:https://www.cnblogs.com/finger/p/2519600.html
Copyright © 2011-2022 走看看