2016-05-24 21 views
0

Ich lerne über Flash (AMF) und Java (BlazeDS) mit dem Projekt, das ich im Internet gefunden, aber ich bemerkte, dass der Server über Socket empfängt die Daten unter:unbekannte Pakete von Flash gesendet

enter image description here Als ich versuchte, das Amf0Input/Amf3Input me zu verwenden, um das Objekt zurückzugeben, erhalte ich einen Fehler, der diesen Pakettyp nicht erkennt. Wer weiß, mit welcher Bibliothek soll ich diese Nachricht entschlüsseln?

Antwort

3

Das Paket, das Sie erhalten, scheint eine Länge Präfix AMF3 AmfObject zu sein.

In der Regel, wenn Sie eine Zeichenfolge zu sehen, die die übliche Namenskonvention vollständig qualifizierten Klassennamen (das heißt wie Reverse-Domains) folgt, die Chancen sind Sie mit einem object Instanz zu tun hat. Die ersten paar Bytes sehen Sie 0x00 wiederholt dreimal. Wenn wir annehmen, AMF3, wäre dies 3 undefined s, gefolgt von einem Objekt mit dem Typ Marker 0x3e - die nicht existiert. Wenn wir stattdessen AMF0 annehmen, hätten wir zuerst eine Nummer (0x00 Typmarker, gefolgt von 8 Datenbytes), gefolgt von einem Objekt mit dem Typenmarker 0x6d - der wiederum nicht existiert.

Daher können die Daten, die Sie dort erhalten, nicht nur AMF-Nutzlast sein. Wenn wir jedoch die ersten 4 Bytes als Netzwerk-Byte-Ordnung (d. H. Big-Endian) interpretieren, erhalten wir 0x3E = 62 - was genau die Länge der verbleibenden Daten ist.

Angenommen, dass die ersten 4 Bytes nur ein Längenpräfix sind, muss das nächste Byte eine Typmarkierung sein. In AMF3 gibt 0x0a eine object Instanz an. Versuchen wir also einfach, die restlichen Daten zu decodieren (Abschnitt 3.12 von , wenn Sie entlang folgen wollen): das nächste Byte muss die Objekteigenschaften anzeigen. 0x23 bedeutet, dass wir eine direkte Kodierung der Merkmale in diesem Byte haben - im Gegensatz zu einem Verweis auf früher übermittelte Merkmale.

Da das vierte Bit (beginnend mit dem am wenigsten signifikanten Wert) 0 ist, ist das Objekt nicht dynamisch - wie in einer Instanz einer Klasse, nicht nur eine einfache Objektinstanz. Die restlichen Bits, die um 4 nach rechts verschoben sind, geben die Anzahl der versiegelten Eigenschaften an, die diese Instanz hat, nämlich 2.

Als nächstes erwarten wir den Klassennamen, codiert als UTF-8-vr - dh Länge vorangestellt (wenn um 1 nach rechts verschoben) , UTF-8-codierte Zeichenfolge. Das nächste Byte ist 0x1d, was bedeutet, dass die Länge 0x1d >> 1 = 14 ist. Die nächsten 14 Bytes kodieren common.net.APC, das ist der Klassenname der Instanz.

Danach haben wir die zwei versiegelten Eigenschaftsnamen, auch codiert als UTF-8-vr. Der erste hat ein Präfix von 0x15, also eine Länge von 10 - geben Sie uns parameters, gefolgt von einem Präfix 0x19 (Länge 12) und Payload functionName.

Danach haben Sie die Werte, die diesen versiegelten Eigenschaften entsprechen, in der gleichen Reihenfolge. Der erste hat einen Typmarker von 0x09, der einem Array entspricht. Der Längenmarker ist 0x03, was bedeutet, dass das Array ein Element enthält, und das nächste Byte ist 0x01, was anzeigt, dass wir keine assoziativen Mitglieder haben. Das einzige Element selbst hat einen Typmarker von 0x04, was bedeutet, dass es ein integer ist - in diesem Fall mit dem Wert 0.

Dies ist gefolgt von einem Typ-Marker von 0x06 - eine Zeichenfolge, mit der Länge 14. Diese Zeichenfolge - Sie haben es wahrscheinlich schon erraten - ist syncServerTime.

So in der Zusammenfassung ist Ihr Paket eine Länge-Präfix Instanz common.net.APC, damit parameters sind Attribut [0] gesetzt und das functionName-"syncServerTime" gesetzt Attribut.


1: Die einzigen anderen Alternativen sind ein Vektor von Objektinstanzen - die eine Art Marker von 0x10 irgendwo erfordern würde - oder ein AMF0 Paket. Im Falle eines AMF0-Pakets müssten Sie auch einen URI-artigen Pfad irgendwo im Paket haben, was hier nicht der Fall ist.

2: Beachten Sie, dass die EBNF am Ende des Abschnitts gegeben ist nicht genau richtig - weder syntaktisch noch semantisch ...

+0

Danke, löste es mein Problem – ExtremsX