免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享

SWF结构详析

本文来自:★flash之路-flash技术交流★ 转帖请注明出处! 作者:flashroad 您是第2897个浏览者

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
flashroad友情提示:
“点评”不是“回帖”!
【声明】非原创,转自:

本帖隐藏的内容需要回复才可以浏览


注:本文是先自己创建一个超级简单的flash程序,发布为swf格式,然后使用十六进制编辑器(比如winhex)工具解析该swf文件,进行分析的。
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

友情提示:单击下列任意一个表情,即可瞬间自动回复本帖!

好贴......
郁闷......
开心......
擦汗......
鄙视......
狂怒
谢谢
爱你呦
拜托了
嗯嗯
OMG
求关注
伤心......
无奈.....
无奈.....
无奈.....
无奈.....
无奈.....
哈哈哈
NO
OK
what
我来了

最近访问本帖者列表:

虚心
访问时间:2019-04-21 19:17
flashroad
访问时间:2019-01-01 22:04

打赏

取消

感谢您的支持,我会继续努力的!

扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by 爱秀代码,分享从这里开始,精彩与您同在

点评
B Color Smilies

您还可以输入:个字符
X

X

原文超级费解,本帖暂时搁浅
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

获得 土地神卡 一张

卡片说明:flashroad照顾了失踪的小狗,主人付出了5金钱以作感谢

卡片效果:+5

点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

回帖看看超级费解的内容
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

解析SWF底层

写一个例子,来解析一下swf的结构。

as3.0代码部分:


  1. var txt:TextField;
  2. //
  3. txt = new TextField();
  4. txt.text = "HelloWorld!";
  5. txt.x=0;
  6. txt.y=0;
  7. this.addChild(txt);
复制




///////////////////////////////////////////////////

这面这段代码写在这里即可,只做测试使用:


////////////////////////////

格式为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
08的二进制0000 1000
Reserved UB[1] =0 Must be 0
UseDirectBlit  UB[1]=0  will not use hardware accelerated graphics facilities
UseGPU  UB[1]=0 will not use hardware  accelerated graphics facilities
HasMetadata UB[1] = 0 ,说明没有Metadata
////////////////////
ActionScript3 UB[1] = 1,说明为as3
Reserved UB[2] Must be 0
UseNetwork UB[1] =0 说明为本地访问
///////////////////////////
Reserved UB[24] Must be 0

43 02 FF FF FF


同上一个解读一样就是43 02,倒着读02 43转成2进制0000 0010 0100 0011,高10为0000 0010 01 = 9,低6为00 0011 =3,
tagid=9,为SetBackgroundColor,3为长度,即FF FF FF,BackgroundColor RGB Color of the display background,就是RGB啦

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



您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

本帖最后由 虚心 于 2019-1-1 20:32 编辑

这里面有个EncodedU32,比较特殊的一个东西,看说明:




SceneCount EncodedU32 Number of scenes,这个就是读取了 01 转成2进制就是0000 0001,第8位为0,结束,SceneCount =1
Offset1 EncodedU32 Frame offset for scene 1 这个就是读取了 00 转成2进制就是0000 0000,第8位为0,结束,Offset1= 0
Name1 STRING Name of scene 1
E5 9C BA E6 99 AF 20 31 == 场景 1 后面的00 表示string结束,最后的00 应该表示这个tag结束

下面的那一段就是DoABC,也就是存储代码的地方,单拿出来写吧,跳过去先,看下面的那段字节吧。
3F 13 1A 00 00 00 01 00 00 00 74 65 73 74 5F 66 6C 61 2E 4D 61 69 6E 54 69 6D 65 6C 69 6E 65 00
3F 13,13 3F转成2进制 0001 0011 0011 1111,高10 为0001 0011 00 = 76,为SymbolClass,低6为11 1111,0x3F长类型,length = 1A 00 00 00,也就是00 00 00 1A = 26,有26个字节,取后26个字节为01 00 00 00 74 65 73 74 5F 66 6C 61 2E 4D 61 69 6E 54 69 6D 65 6C 69 6E 65 00



NumSymbols UI16 = 01 00 就是00 01 = 1,说明就一个关联型tag
Tag U16  = 00 00,就是第一个的编号,0开始,id=0
Name STRING = 74 65 73 74 5F 66 6C 61 2E 4D 61 69 6E 54 69 6D 65 6C 69 6E 65 (test_fla.MainTimeline)00(表示结束)
一般这个为文档类,这个比较重要

40 00 00 00 最后的这几个字节其实就是表示swf的结尾部分,40 00 其实就是 showFrame,这个标签很关键,虚拟机在解析swf时,检测到这个showframe标签,才会解析这个标签前面的部分,showframe代表一帧,00 00 是end标签,就是表示结束。

未完待续。。。 。。。(DoABC单独拿出来写!)

您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

 

B Color Image Link Quote Code Smilies
高级模式 | 发新话题

您需要登录后才可以回帖 登录|立即注册

快速
返回顶部
返回首页