python3 的 AMF 序列化

AMF serialization for python3

我正在尝试为 AMF 编写 python3 encoder/decoder。

我这样做的原因是因为我没有找到适用于 python3 的合适库(我正在寻找一个 non-obtrusive 库 - 一个可以为我提供方法,让我自己处理网关)

我为 python 测试的可用库是 amfast、pyamf 和 amfy。虽然前 2 个用于 python2(pyamf 的几个分支建议它们支持 python3 但我无法让它工作),amfy 是为 python3 设计的但缺少一些功能我需要的(特别是 object 序列化)。

通读了 AMF0 和 AMF3 的规范,我能够添加一个包 encoder/decoder 但我偶然发现了 object 序列化并且可用的文档不够(希望看到一些示例).现有的图书馆也无济于事。

使用 remoteObject(在 flex 中),我设法将以下请求发送到我的解析器:

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'

(注意引入换行符是为了使请求更具可读性)

headers 解析正常,但是当我到达第一个 object(\n 在第一行末尾附近)时,它被标记为参考(LSB = 0)而没有其他 object 可以参考。

我读错了吗?这是格式错误的字节请求吗? 欢迎任何帮助解码这些字节。

来自 AMF3 spec 部分 4.1 NetConnection 和 AMF3

The format of this messaging structure is AMF 0 (See [AMF0]. A context header value or message body can switch to AMF 3 encoding using the special avmplus-object-marker type.

这意味着默认情况下,消息正文必须解析为 AMF0。只有在遇到 avmplus-object-marker (0x11) 时才应该切换到 AMF3。因此,您值中的 0x0a 类型标记实际上不是 AMF3 对象标记,而是 AMF0 严格数组标记。

查看 AMF0 spec 中的 2.12 严格数组类型 部分,我们可以看到这种类型被简单地定义为一个 u32 数组计数,后面是值类型。

在您的数据中,数组计数为 0x00, 0x00, 0x00, 0x01(即 1),其后的值具有类型标记 0x11 - 即上述的 avmplus-object-marker。因此,只有在开始解析 AMF0 数组内容后,您才应该真正切换到 AMF3 来解析以下对象。

在这种情况下,对象是一个实际的 AMF3 对象(类型标记 0x0a),后跟一个具有 9 个密封成员的非动态 U29O 特征。但我相信你可以从这里拿走它。 :)