我目前正在开发一个小型的AMF3适配器,因此正在尝试实现AMF3协议。不幸的是,现有的规范似乎与现实有很大的不同(Captre的AMF与BlazeDS的通信,并查看BlazeDS的源代码)。
AMF0规格:http://opensource.adobe.com/wiki/download/attachments/1114283/amf0_spec_121207.pdf AMF3规格:http://opensource.adobe.com/wiki/download/attachments/1114283/amf3_spec_05_05_08.pdf
遗憾的是,两者都没有指定实际的消息格式(Header、Body等)。所以我又搜索了一下,找到了维基百科上的一篇文章:http://en.wikipedia.org/wiki/Action_Message_Format
本文,尤其是示例部分,似乎描述了一种完全不同的格式。
在查看通信并逐步执行BlazeDS代码时,我可以看到消息声称是AMF3,但使用了AMF0中定义的类型代码(0x0a是一个严格的数组,而不是AMF3中定义的对象)。
有人能给我解释一下这个乱七八糟的东西吗?目前我可能只是简单地使用wireshark和BlazeDS代码来以某种方式对协议描述进行逆向工程,但我不知道为什么没有一个有效的规范可用。
发布于 2012-09-06 09:26:33
AMF的核心只是一种ActionScript对象序列化格式。
Flash的RPC对这种格式进行了扩展,通过一个简单的头/消息体请求/响应结构添加了基本的NetConnection功能,该结构在AMF0规范的第4节中进行了描述。我认为这个RPC添加可能会让您感到困惑,因为它是定义如何从服务器发送和接收AMF数据的各个有效负载的基础架构。例如,对于通过ByteArray.writeObject进行的基本ActionScript对象序列化,此包装器并不起作用。它是用于与服务器进行基于NetConnection的通信的附加逻辑。
请参阅:http://download.macromedia.com/pub/labs/amf/amf0_spec_121207.pdf
实际为标头值或消息正文值发送的ActionScript数据以AMF格式编码。出于兼容性考虑,所有数据值都以AMF 0开头。这可能是在查看基本的AMF序列化与基于NetConnection的通信时,人们一开始会被绊倒的另一个点。由于向AMF 0添加了一个特殊的扩展,引入了一个新的0x11 "AMF 3“模式标记,它将序列化模式切换到AMF 3。不支持AMF 3的旧客户端将无法理解这个新标记,并将停止处理数据。这在AMF 0规范的第3节中提到。
AMF3规范在这里:http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf
发布于 2011-12-06 23:33:47
有两种常见的AMF消息传递类型: AMF0风格的RPC调用和RTMP。AMF0 RPC调用由版本、标头列表和消息列表组成,它们大致相当于要调用的方法。这在AMF0规范的末尾有说明,可以用来进行AMF0或AMF3远程调用。如果你正在使用Flex RemoteObject,那么Flex会在消息传递中使用一些额外的包装器对象。第二种类型是RTMP使用的消息格式,这是您在Wikipedia文章中找到的参考,它是AMF和它自己的自定义格式的组合。据我所知,没有这种格式的规格。
作为一个构建了可以解析AMF和进行RPC调用(RocketAMF)的库的人,我建议您使用现有的库之一,而不是编写自己的库,如果您只需要远程处理支持的话。下面是一些用于按语言进行AMF解析的库的列表,还有更多库,只需简单搜索即可。您可能还想看看Charles,它能够对通过它代理的AMF请求进行反序列化,从而使逆向工程变得更容易一些。
PyAMF
:
https://stackoverflow.com/questions/8389461
复制相似问题