一直想寫一個DoABC的解析,不過是一個比較大的工程,接上次的這個 解析SWF底層 寫,例子仍是test.swf。css
如今開始:html
仍是先上圖:linux
選中的部分就是要解析的DoABC,這個標籤是存儲as3.0代碼的地方,下面看一下結構:spring
先解析開始的 BF 14 ,二進制爲 0001 0100 10 @ 11 1111,高10位82,即爲DoABC,低6爲0x3F,爲長類型,接着讀取,u32,F0 01 00 00 ,就爲01 F0,十進制爲496個字節,內容長度。ide
Flags,u32,01 00 00 00,flags = 01 00 00 00 = 00 00 00 01 =1ui
Name,String,爲00.this
ABCData,byte[],由10 00 2E … … … … 47 00 00,這部分爲代碼塊。即DoABC的數據部分。spa
下面看下DoABC的結構:.net
u16 minor_version,10 00,minor_version = 00 10 = 16code
u16 major_version,2e 00,major_version = 00 2e = 46
下面的 cpool_info constant_pool:
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的例子:
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>
u30 namespace_count,08,就是有8個namespace
namespace_info namespace[namespace_count],結構
同String,
u8 kind,16
u30 name,01
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>
u30 ns_set_count ,00,表示沒有
即ns_set_info ns_set[ns_set_count],也沒有
u30 multiname_count,11,有17個multiname
multiname_info multiname[multiname_count],如圖
u8 kind,0x07,即07,CONSTANT_QName
u8 data[],關於Qname,以下:
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>
u30 method_count , 04,說明有4個method_info
method_info method[method_count],看圖:
u30 param_count ,00
u30 return_type ,00
u30 param_type[param_count],無
u30 name,00
u8 flags,00
option_info options
u30 option_count,00
param_info param_names
<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>
u30 metadata_count,00
metadata_info metadata[metadata_count],沒有
u30 class_count,01
instance_info instance[class_count],如圖
u30 name,01,在multiname中的01,就是 Qname:MainTimeline ,ns:test_fla
u30 super_name,02,index into the multiname,就是 Qname:MovieClip,ns:flash.display
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]:如圖
u30,name,multiname,03,txt
kind,高4 attributes of the trait 低4 kind of this trait
u8 kind,00,爲Slot
/////////////////////////////////////////////////////////////////////////////////////
0001 表示 是 final 不是 override 沒有 metadata
0011 表示 是 final 是 override 沒有 metadata
0111 表示 是 final 是 override 有 metadata
////////////////////////////////////////////////////////////////////////////////////
u8 data[],Solt:
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
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>
code:
class_info class[class_count]
u30 cinit,00,in_method
u30 trait_count,00,無
traits_info traits[trait_count]
u30 script_count,01
script_info script[script_count]
u30 init,03,into the method
u30 trait_count,01
traits_info trait[trait_count]
u30 name,01,in multiname,MainTimeLine
u8 kind,04,0000 0010,Class
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>
u30 method_body_count,04,說明有4個方法
method_body_info method_body[method_body_count]
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,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]