【声明】非原创,转自:
本帖隐藏的内容需要回复才可以浏览 注:本文是先自己创建一个超级简单的flash程序,发布为swf格式,然后使用十六进制编辑器(比如winhex)工具解析该swf文件,进行分析的。
| |||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
解析SWF底层
写一个例子,来解析一下swf的结构。 as3.0代码部分:
/////////////////////////////////////////////////// 这面这段代码写在这里即可,只做测试使用:
//////////////////////////// 格式为FWS,即为解压格式,下面上一段字节码的解析图:
下面来一步一步的解析这些字节码: 先看头部: 46 57 53 0A 4B 02 00 00 70 00 0B B8 00 00 BB 80 00 1E 01 00 看结构部分:
46 57 53 即为FWS,解压模式 0A 为Version,为flashplayer播放器的版本号,为10版本 FileLength 为UI32 ,即4B 02 00 00,倒着读取为 00 00 02 4B = 587,就是swf有587个字节
FrameSize,为Rect类型: 看Rect类型
70 转成2进制为 0111 0000 ,取UB[5] = 0111 0 = 14,取4个SB[14] 00 转成2进制为 0000 0000 0B 转成2进制为 0000 1011 B8 转成2进制为 1011 1000 00 转成2进制为 0000 0000 00 转成2进制为 0000 0000 BB 转成2进制为 1011 1011 80转成2进制为 1000 0000 剩下 00 1E 01 00 0111 0 @ 000 0000 0000 000 @ 0 1011 1011 1000 0 @ 000 0000 0000 000 @ 0 1011 1011 1000 0 @ 000 Xmin = 000 0000 0000 000 =0 Xmax =0 1011 1011 1000 0 =6000/20 = 300 Yminx=000 0000 0000 000 =0 Ymax=0 1011 1011 1000 0 =6000/20 = 300 分辨率为300*300 继续,FrameRate为U16,00 1E = 30,帧频30 FrameCount为U16,01 00 = 01,为一帧 头部信息解析完毕。 ////////////////////////////////////////////////////// 下面为44 11,倒着读,11 44,转成2进制为 0001 0001 0100 0100,高10(0001 0001 01=69),tagid=69,为FileAttributes,低6(00 0100=4),长度为短类型,读取后4位,即为数据。数据为08 00 00 00
08 00 00 00 43 02 FF FF FF
同上一个解读一样就是43 02,倒着读02 43转成2进制0000 0010 0100 0011,高10为0000 0010 01 = 9,低6为00 0011 =3, BF 15 0C 00 00 00 01 00 E5 9C BA E6 99 AF 20 31 00 00
解析一下 BF 15,倒着读 15 BF转成2进制为0001 0101 1011 1111,高10为0001 0101 10 = 86,tagid=86,为DefineSceneAndFrameLabelData,低6为11 1111,为长类型,读取后4位为:0C 00 00 00 ,还是倒着读 就是00 00 00 0C=12,数据就是后12个字节,为01 00 E5 9C BA E6 99 AF 20 31 00 00 | |
本帖最后由 虚心 于 2019-1-1 20:32 编辑
这里面有个EncodedU32,比较特殊的一个东西,看说明: ![]() SceneCount EncodedU32 Number of scenes,这个就是读取了 01 转成2进制就是0000 0001,第8位为0,结束,SceneCount =1 下面的那一段就是DoABC,也就是存储代码的地方,单拿出来写吧,跳过去先,看下面的那段字节吧。
NumSymbols UI16 = 01 00 就是00 01 = 1,说明就一个关联型tag 40 00 00 00 最后的这几个字节其实就是表示swf的结尾部分,40 00 其实就是 showFrame,这个标签很关键,虚拟机在解析swf时,检测到这个showframe标签,才会解析这个标签前面的部分,showframe代表一帧,00 00 是end标签,就是表示结束。 未完待续。。。 。。。(DoABC单独拿出来写!) | |