簡體   English   中英

Flash發送的未知數據包

[英]unknown packets sent by Flash

我正在使用在Internet上找到的項目來學習Flash(AMF)和Java(BlazeDS),但是我注意到服務器正在通過套接字接收以下數據:

在此處輸入圖片說明 當我嘗試使用Amf0Input / Amf3Input返回對象時,出現錯誤,無法識別這種類型的程序包。 有人知道我應該使用哪個庫來解碼此消息嗎?

您收到的數據包的長度似乎是AMF3 AmfObject的前綴。

通常,每當您看到一個遵循完全合格的類名的常規命名約定(即,像反向域)的字符串時,您就有可能在處理object實例1

查看前幾個字節,您會看到0x00重復了3次。 如果我們假設AMF30x3e 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM