DoABC完全解析,接test.swf

一直想写一个DoABC的解析,不过是一个比较大的工程,接上次的这个  解析SWF底层 写,例子还是test.swf。

现在开始:

还是先上图:

DoABC完全解析,接test.swf_第1张图片

选中的部分就是要解析的DoABC,这个标签是存储as3.0代码的地方,下面看一下结构:

DoABC完全解析,接test.swf_第2张图片

先解析开始的 BF 14 ,二进制为 0001 0100 10 @ 11 1111,高10位82,即为DoABC,低6为0x3F,为长类型,接着读取,u32,F0 01 00 00 ,就为01 F0,十进制为496个字节,内容长度。

Flags,u32,01 00 00 00,flags = 01 00 00 00 = 00 00 00 01 =1

Name,String,为00.

ABCData,byte[],由10 00 2E … … … … 47 00 00,这部分为代码块。即DoABC的数据部分。

下面看下DoABC的结构:

DoABC完全解析,接test.swf_第3张图片

u16 minor_version,10 00,minor_version = 00 10 = 16

u16 major_version,2e 00,major_version = 00 2e = 46

下面的 cpool_info constant_pool:

DoABC完全解析,接test.swf_第4张图片

u30 int_count,00,即没有int

即s32 integer[int_count],也不存在了

u30 uint_count,00,也没有

即u32 integer[uint_count],也不存在了

u30 double_count,00,也没有

d64 double[double_count],不存在

u30 string_count,18 = 24个string字符串

string_info string[string_count]:结构如下:

string_info 

举几个string的例子:

08 74 65 73 74 5F 66 6C 61 0C 4D 61 … … … …

u30 size , 08 ,8个字节

u8 utf8[8] = 74 65 73 74 5F 66 6C 61 =test_fla

继续:

0C 4D 61 69 6E 54 69 6D 65 6C 69 6E 65 0D .. .. .. ...

u30 size , 0C,12个字节

u8 utf8[12] = 4D 61 69 6E 54 69 6D 65 6C 69 6E 65 0D  = MainTimeline

… … … … …

一直到 53 70 72 69 74 65 = Sprite

<stringList count="24">
            <string value="test_fla"/>
            <string value="MainTimeline"/>
            <string value="flash.display"/>
            <string value="MovieClip"/>
            <string value="test_fla:MainTimeline"/>
            <string value=""/>
            <string value="txt"/>
            <string value="flash.text"/>
            <string value="TextField"/>
            <string value="frame1"/>
            <string value="HelloWorld!"/>
            <string value="text"/>
            <string value="x"/>
            <string value="y"/>
            <string value="addChild"/>
            <string value="addFrameScript"/>
            <string value="Object"/>
            <string value="flash.events"/>
            <string value="EventDispatcher"/>
            <string value="DisplayObject"/>
            <string value="InteractiveObject"/>
            <string value="DisplayObjectContainer"/>
            <string value="Sprite"/>
</stringList>
 
DoABC完全解析,接test.swf_第5张图片 
 

DoABC完全解析,接test.swf_第6张图片

u30 namespace_count,08,就是有8个namespace

namespace_info namespace[namespace_count],结构

namespace_info

同String,

u8 kind,16

u30 name,01

DoABC完全解析,接test.swf_第7张图片

kind = 0x16 = CONSTANT_PackageNamespace,说明他是一个包名字,对应的名字是string池中的01,即为test_fla

继续 u8 kind,16

u30 name,03,kind = 0x16 = CONSTANT_PackageNamespace,说明他是一个包名字,对应的名字是string池中的03,即为flash.display

一直到 16 12,

u8 kind,16

u30 name,12,kind = 0x16 = CONSTANT_PackageNamespace,说明他是一个包名字,对应的名字是string池中的,18即为flash.events

<namespace_infoList count="8">
            <namespace_info class="Namespace_info" kind="PackageNamespace" name="1"/>
            <namespace_info class="Namespace_info" kind="PackageNamespace" name="3"/>
            <namespace_info class="Namespace_info" kind="ProtectedNamespace" name="5"/>
            <namespace_info class="Namespace_info" kind="PackageNamespace" name="6"/>
            <namespace_info class="Namespace_info" kind="PackageNamespace" name="8"/>
            <namespace_info class="Namespace_info" kind="PackageInternalNs" name="1"/>
            <namespace_info class="Namespace_info" kind="PackageNamespace" name="18"/>
</namespace_infoList>

DoABC完全解析,接test.swf_第8张图片

ns

u30 ns_set_count ,00,表示没有

即ns_set_info ns_set[ns_set_count],也没有

u30 multiname_count,11,有17个multiname

multiname_info multiname[multiname_count],如图

DoABC完全解析,接test.swf_第9张图片

u8 kind,0x07,即07,CONSTANT_QName

u8 data[],关于Qname,如下:

DoABC完全解析,接test.swf_第10张图片

u30 ns,0x01 ,即为ns中的01,test_fla

u30 name,0x02,在String中的02,MainTimeline

继续,u8 kind,0x07,即07,CONSTANT_QName

u8 data[]:

u30 ns,0x01 ,即为ns中的02,flash.display

u30 name,0x02,在String中的04,MovieClip

<multiname_infoList count="17">
            <multiname_info class="Multiname_info" kind="QName" ns="1" name="2"/>
            <multiname_info class="Multiname_info" kind="QName" ns="2" name="4"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="7"/>
            <multiname_info class="Multiname_info" kind="QName" ns="5" name="9"/>
            <multiname_info class="Multiname_info" kind="QName" ns="6" name="10"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="12"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="13"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="14"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="15"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="16"/>
            <multiname_info class="Multiname_info" kind="QName" ns="4" name="17"/>
            <multiname_info class="Multiname_info" kind="QName" ns="7" name="19"/>
            <multiname_info class="Multiname_info" kind="QName" ns="2" name="20"/>
            <multiname_info class="Multiname_info" kind="QName" ns="2" name="21"/>
            <multiname_info class="Multiname_info" kind="QName" ns="2" name="22"/>
            <multiname_info class="Multiname_info" kind="QName" ns="2" name="23"/>
 </multiname_infoList>
 
DoABC完全解析,接test.swf_第11张图片 
 
DoABC完全解析,接test.swf_第12张图片 
 

u30 method_count , 04,说明有4个method_info
method_info method[method_count],看图:

DoABC完全解析,接test.swf_第13张图片

u30 param_count ,00
u30 return_type ,00
u30 param_type[param_count],无
u30 name,00
u8 flags,00
option_info options

DoABC完全解析,接test.swf_第14张图片 

u30 option_count,00
param_info param_names

DoABC完全解析,接test.swf_第15张图片 

<method_infoList count="4">
            <method_info class="Method_info" return_type="0" name="0" flags=""/>
            <method_info class="Method_info" return_type="0" name="0" flags=""/>
            <method_info class="Method_info" return_type="0" name="0" flags=""/>
            <method_info class="Method_info" return_type="0" name="0" flags=""/>
</method_infoList>

method_info_code

DoABC完全解析,接test.swf_第16张图片

u30 metadata_count,00
metadata_info metadata[metadata_count],没有

u30 class_count,01
instance_info instance[class_count],如图

DoABC完全解析,接test.swf_第17张图片

u30 name,01,在multiname中的01,就是 Qname:MainTimeline ,ns:test_fla

u30 super_name,02,index into the multiname,就是 Qname:MovieClip,ns:flash.display

u8 flags,08,DoABC完全解析,接test.swf_第18张图片

08,CONSTANT_ClassProtectedNs

u30 protectedNs,03,in namespace,即:ns3:test_fla:MainTimeline ,protected

u30 intrf_count,00

u30 interface[intrf_count],无

u30 iinit,02,This is an index into the method array of the abcFile,method 02

u30 trait_count,02

traits_info trait[trait_count]:如图

DoABC完全解析,接test.swf_第19张图片

u30,name,multiname,03,txt

kind,高4 attributes of the trait   低4 kind of this trait

u8 kind,00,为Slot

DoABC完全解析,接test.swf_第20张图片

DoABC完全解析,接test.swf_第21张图片

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

0001 表示 是 final 不是 override 没有 metadata
0011 表示 是 final 是 override 没有 metadata
0111 表示 是 final 是 override 有 metadata

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

u8 data[],Solt:

DoABC完全解析,接test.swf_第22张图片

u30,slot_id,00

u30 type_name,04,multiname,Qname:"TextField" ns:"flash.text"

u30 vindex,00,指向constant pool,表示这个参数的值。

u8 vkind,取决于vindex,若果其不存在,就忽略,如存在See the “Constant Kind” table above for details

然后读取下一个traits_info ,

u30,name,multiname,05,Qname frame1,ns:test_fla

u8 kind,01,为Method

DoABC完全解析,接test.swf_第23张图片

u30 disp_id,00

u30 method,01

//traits_info中 ,in the metadata array

u30 metadata_count,

u30 metadata[metadata_count] 取决于kind中的attributes of the trait  

//

<instance_infoList count="1">
 <instance_info class="Instance_info" name="1" super_name="2" flags="ClassProtectedNs" protectedNs="3" iinit="2">
   <itraits_infoList count="2">
        <itraits_info class="Traits_info" name="3" kind_attributes="" 
                      kind_trait_type="Slot" slot_id="0" type_name="4" vindex="0"/>
        <itraits_info class="Traits_info" name="5" kind_attributes="" 
                      kind_trait_type="Method" disp_id="0" methodi="1"/>
    </itraits_infoList>
 </instance_info>
</instance_infoList>
 
DoABC完全解析,接test.swf_第24张图片 
code:
DoABC完全解析,接test.swf_第25张图片 
class_info class[class_count]
 

 DoABC完全解析,接test.swf_第26张图片

u30 cinit,00,in_method
u30 trait_count,00,无
traits_info traits[trait_count]

u30 script_count,01
script_info script[script_count]

DoABC完全解析,接test.swf_第27张图片

u30 init,03,into the method

u30 trait_count,01

traits_info trait[trait_count]

DoABC完全解析,接test.swf_第28张图片

u30 name,01,in multiname,MainTimeLine

u8 kind,04,0000 0010,Class

DoABC完全解析,接test.swf_第29张图片

u30 cinit,01

u30 trait_count,00,无

traits_info traits[trait_count]

<script_infoList count="1">
   <script_info class="Script_info" init="3">
       <traits_infoList count="1">
          <traits_info class="Traits_info" name="1" kind_attributes="" kind_trait_type="Clazz" 
                                                    slot_id="1" classi="0"/>
       </traits_infoList>
   </script_info>
</script_infoList>
 

script

DoABC完全解析,接test.swf_第30张图片

u30 method_body_count,04,说明有4个方法
method_body_info method_body[method_body_count]

DoABC完全解析,接test.swf_第31张图片 

u30 method,00                                      ==========         method=0
u30 max_stack,01
u30 local_count,01
u30 init_scope_depth,09
u30 max_scope_depth,0A
u30 code_length,03
u8 code[code_length],code[3] = D0 30 47
u30 exception_count,00,无
exception_info exception[exception_count]
u30 trait_count,00,无
traits_info trait[trait_count]

u30 method,01                                      ==========         method=1
u30 max_stack,02
u30 local_count,01
u30 init_scope_depth,0A
u30 max_scope_depth,0B
u30 code_length,0x27
u8 code[code_length],code[0x27] = D0 30 D0 5D 04 4A 04 00 68 03 D0 66 03 2C 0B 61 06 D0 66 03 24 00 61 07 D0 66 03 24 00 61 08 D0 D0 66 03 4F 09 01 47
u30 exception_count,00,无
exception_info exception[exception_count]
u30 trait_count,00,无
traits_info trait[trait_count]

 

u30 method,02                                      ==========         method=02
u30 max_stack,03
u30 local_count,01
u30 init_scope_depth,0A
u30 max_scope_depth,0B
u30 code_length,0x10
u8 code[code_length],code[0x10] = D0 30 D0 49 00 5D 0A 24 00 D0 66 05 4F 0A 02 47
u30 exception_count,00,无
exception_info exception[exception_count]
u30 trait_count,00,无
traits_info trait[trait_count]

u30 method,03                                     ==========         method=03
u30 max_stack,02
u30 local_count,01
u30 init_scope_depth,01
u30 max_scope_depth,09
u30 code_length,0x27
u8 code[code_length],code[0x27] = D0 30 65 00 60 0B 30 60 0C 30 60 0D 30 60 0E 30 60 0F 30 60 10 30 60 02 30 60 02 58 00 1D 1D 1D 1D 1D 1D 1D 68 01 47
u30 exception_count,00,无
exception_info exception[exception_count]
u30 trait_count,00,无
traits_info trait[trait_count]

 

 

你可能感兴趣的:(DoABC完全解析,接test.swf)