2015-10-18 3 views
1

Я пытаюсь написать кодировщик/декодер python3 для AMF.Сериализация AMF для python3

Причина, по которой я делаю это, потому что я не нашел подходящую библиотеку, которая работает на python3 (я ищу не-навязчивую библиотеку, которая предоставит мне методы и позвольте мне обработать gateway)

Библиотеки Avaialble, которые я тестировал для python, являются amfast, pyamf и amfy. В то время как первые 2 для python2 (несколько вилок pyamf предполагают, что они поддерживают python3, но я не могу заставить его работать), amfy был разработан для python3, но мне не нужны некоторые функции, которые мне нужны (в частности, сериализация объектов).

Чтение через спецификацию AMF0 и AMF3, я смог добавить кодировщик/декодер пакетов, но я наткнулся на сериализацию объектов, и доступной документации было недостаточно (хотелось бы увидеть некоторые примеры). Существующие библиотеки тоже не помогли.

Использование RemoteObject (в прогибается), мне удалось отправить следующий запрос на мой парсер:

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' 

(обратите внимание, что новые строки были введены, чтобы сделать запрос более читаемый)

Заголовки разобранную OK, но когда я добираюсь до первого объекта (\ n ближе к концу первой строки), он помечен как ссылка (LSB = 0), в то время как нет другого объекта, к которому он может обратиться.

Я читаю это неправильно? Это неправильный запрос байта? Любая помощь, декодирующая эти байты, будет приветствоваться.

ответ

1

С AMF3 spec, раздел 4.1 NetConnection и AMF3:

Формат этой структуры обмена сообщениями является АМФ 0 (см [AMF0] Значение заголовка контекста или тело сообщения может переключиться на AMF 3 кодирования. используя специальный тип avmplus-объект-маркер.

что это означает, что по умолчанию, тело сообщения должно быть разобрано как AMF0. только при столкновении с avmplus-объект-маркер (0x11) вы должны переключиться на AMF3 . В результате 0x0a маркер типа в вашем значении на самом деле не является маркером AMF3, а маркером строгого массива AMF0.

Глядя на секции 2.12 Строгого массива типа в AMF0 spec, мы можем видеть, что этот тип просто определяются как U32 массива подсчет, а затем это количество оценочных типов.

В ваших данных счетчик массивов равен 0x00, 0x00, 0x00, 0x01 (т. Е. 1), а следующее значение имеет маркер типа 0x11 - это маркер avmplus-object, упомянутый выше. Таким образом, только после начала анализа содержимого массива AMF0 вы должны перейти на AMF3 для анализа следующего объекта.

В этом случае объект тогда является фактическим объектом AMF3 (маркер типа 0x0a), за которым следуют нединамические U29O-признаки с 9 запечатанными членами. Но я уверен, что вы можете взять это отсюда. :)

+0

Спасибо. Независимо от того, сколько раз я его видел, он не утонул ... – Ofir