2015-10-18 2 views
1

J'essaye d'écrire un encodeur/décodeur python3 pour AMF.Sérialisation AMF pour python3

La raison pour laquelle je le fais est parce que je n'ai pas trouvé une bibliothèque appropriée qui fonctionne sur python3 (je cherche une bibliothèque non-intrusive - celle qui me fournira les méthodes et laissez-moi gérer le passerelle moi-même)

Bibliothèques Avaialble J'ai testé pour python sont amfast, pyamf et amfy. Alors que les 2 premiers sont pour python2 (plusieurs forks de pyamf suggèrent qu'ils supportent python3 mais je n'arrive pas à le faire fonctionner), amfy a été conçu pour python3 mais manque de certaines fonctionnalités dont j'ai besoin (en particulier la sérialisation d'objets). En lisant les spécifications de AMF0 et AMF3, j'ai pu ajouter un encodeur/décodeur de paquet mais je suis tombé sur la sérialisation des objets et la documentation disponible n'était pas suffisante (j'aimerais voir quelques exemples). Les bibliothèques existantes n'étaient d'aucune aide non plus.

L'utilisation RemoteObject (flex), je réussi à envoyer la requête suivante à mon analyseur:

b'\x00\x03\x00\x00\x00\x01\x00\x04null\x00\x02/1\x00\x00\x00\xe0\n\x00\x00\x00\x01\x11 
\n\x81\x13Mflex.messaging.messages.CommandMessage\x13operation\x1bcorrelationId\x13 
timestamp\x11clientId\x15timeToLive\tbody\x0fheaders\x17destination\x13messageId\x04\x05 
\x06\x01\x04\x00\x01\x04\x00\n\x0b\x01\x01\n\x05\tDSId\x06\x07nil%DSMessagingVersion\x04 
\x01\x01\x06\x01\x06I03ACB769-9733-6A6C-0923-79F667AE8249' 

(notez que les nouvelles lignes ont été introduites pour rendre la demande plus lisible)

Les en-têtes sont analysés OK mais quand j'arrive au premier objet (\ n vers la fin de la première ligne), il est marqué comme une référence (LSB = 0) alors qu'il n'y a aucun autre objet auquel il puisse faire référence.

Ai-je mal lu? Est-ce une requête d'octets malformés? Toute aide décodant ces octets sera la bienvenue.

Répondre

1

De l'AMF3 spec, section 4.1 NetConnection et AMF3:

Le format de cette structure de messagerie est AMF 0 (Voir [AMF0] Une valeur d'en-tête de contexte ou le corps du message peut passer à l'AMF 3 encodage. en utilisant le type avmplus-marqueur d'objet spécial.

ce que cela signifie est que par défaut, le corps du message doit être analysé comme AMF0. Seulement lors de la rencontre d'un marqueur de avmplus-objet (0x11) si vous passer à AMF3 En conséquence, leLe marqueur de typedans votre valeur n'est pas réellement un marqueur d'objet AMF3, mais un marqueur de tableau strict AMF0.

Regarder section 2.12 Tableau strict type dans le AMF0 spec, nous pouvons voir que ce type est simplement défini comme un compte de tableau-U32, suivi ce nombre de types de valeur.

Dans vos données, le nombre de cellules est 0x00, 0x00, 0x00, 0x01 (c'est-à-dire 1) et la valeur suivante a un marqueur de type 0x11 - qui est le marqueur d'objet avmplus mentionné ci-dessus. Ainsi, seulement après avoir commencé à analyser le contenu du tableau AMF0, vous devriez passer à AMF3 pour analyser l'objet suivant.

Dans ce cas, l'objet est alors un objet AMF3 réel (marqueur de type 0x0a), suivi d'un caractère U29O non dynamique avec 9 éléments scellés. Mais je suis sûr que vous pouvez le prendre d'ici. :)

+0

Merci. Peu importe combien de fois je l'ai vu, il n'a pas coulé ... – Ofir