(转载)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

原文地址:https://www.cnblogs.com/finger/p/2519600.html