[英]unknown packets sent by Flash
您收到的數據包的長度似乎是AMF3 AmfObject的前綴。
通常,每當您看到一個遵循完全合格的類名的常規命名約定(即,像反向域)的字符串時,您就有可能在處理object
實例1 。
查看前幾個字節,您會看到0x00
重復了3次。 如果我們假設AMF3 , 0x3e
3 undefined
s,后跟一個標記類型為0x3e
的對象-該對象不存在。 如果我們改為假設AMF0 ,那么我們將首先有一個數字( 0x00
類型標記,后跟8個字節的數據),然后是一個對象,其類型標記為0x6d
再次不存在。
因此,您獲得的數據不能僅包含AMF有效負載。 但是,如果我們將前4個字節解釋為網絡字節順序(即大端字節序)整數,則會得到0x3E = 62
恰好是剩余數據的長度。
假設前4個字節只是長度前綴,則下一個字節必須是類型標記。 在AMF3中, 0x0a
表示object
實例。 因此,讓我們嘗試解碼其余數據(如果要遵循2 ,則是AMF3規范的 3.12節):下一個字節必須指示對象特征。 0x23
表示我們在該字節中具有特征的直接編碼,這與對較早提交的特征的引用相反。
由於第四位(從最低有效位開始算起)為0,因此該對象不是動態對象-例如某個類的實例,而不僅僅是普通對象實例。 剩余的位向右移動4,表示此實例具有的密封屬性的數量為2。
接下來,我們希望類名稱以UTF-8-vr
編碼-即長度前綴(當右移1時),是UTF-8編碼的字符串。 下一個字節是0x1d
,這意味着長度是0x1d >> 1 = 14
。 接下來的14個字節編碼common.net.APC
,這就是實例的類名。
之后,我們得到了兩個密封的屬性名稱,也被編碼為UTF-8-vr
。 第一個具有0x15
的前綴,因此長度為10(為我們提供了parameters
,后跟一個0x19
(長度為12)和有效載荷functionName
的前綴。
此后,您將以相同順序獲得與這些密封屬性相對應的值。 第一個具有類型標記0x09
,它對應於一個數組。 長度標記是0x03
,這意味着數組包含一個元素,下一個字節是0x01
,表明我們沒有關聯成員。 唯一的元素本身具有類型標記0x04
,這意味着它是一個integer
-在這種情況下,其值為0。
這之后是類型標記0x06
一個長度為14的字符串。該字符串-您可能現在已經猜到了-是syncServerTime
。
因此,總而言之,您的數據包是common.net.APC
帶前綴前綴的實例,其parameters
屬性設置為[0]
,而functionName
屬性設置為"syncServerTime"
。
1:唯一的其他選擇是對象實例的矢量-這將需要的類型的標記0x10
某處-或AMF0分組。 對於AMF0數據包,您還必須在數據包中的某處具有URI樣式的路徑,在此情況並非如此。
2:請注意,本節末尾給出的EBNF並不完全正確-語法或語義上都沒有...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.