Flash发送的未知数据包

Posted

技术标签:

【中文标题】Flash发送的未知数据包【英文标题】:unknown packets sent by Flash 【发布时间】:2016-09-22 02:05:42 【问题描述】:

我正在使用我在互联网上找到的项目学习 Flash (AMF) 和 Java (BlazeDS),但我注意到服务器正在通过套接字接收以下数据:

当我尝试使用 Amf0Input/Amf3Input 我返回对象时,我收到一个无法识别此类包的错误。有人知道我应该使用哪个库来解码此消息吗?

【问题讨论】:

【参考方案1】:

你得到的数据包似乎是一个以 AMF3 AmfObject 为前缀的长度。

一般来说,每当您看到一个遵循完全限定类名(例如反向域)的通常命名约定的字符串时,您很可能正在处理object 实例1

查看前几个字节,您会看到 0x00 重复了 3 次。如果我们假设AMF3,这将是 3 个undefineds,后跟一个带有类型标记0x3e 的对象——它不存在。如果我们改为假设 AMF0,我们将首先有一个数字(0x00 类型标记,后跟 8 个字节的数据),然后是一个类型标记为 0x6d 的对象 - 这又不存在。

因此,您在那里获得的数据不能仅是 AMF 有效负载。但是,如果我们将前 4 个字节解释为网络字节顺序(即大端)整数,我们会得到 0x3E = 62 - 这正是剩余数据的长度。

假设前 4 个字节只是一个长度前缀,那么下一个字节必须是一个类型标记。在 AMF3 中,0x0a 表示 object 实例。因此,让我们尝试解码剩余的数据(AMF3 spec 的第 3.12 节,如果您想继续2):下一个字节必须指示对象特征。 0x23 表示我们对该字节中的特征进行了直接编码 - 而不是对早期提交的特征的引用。

由于第四位(从最低有效位开始计算)为 0,因此对象不是动态的 - 例如,某个类的实例,而不仅仅是普通的对象实例。剩下的位,右移 4 位,表示此实例具有的密封属性的数量,即 2。

接下来,我们期望类名,编码为UTF-8-vr - 即长度前缀(右移 1 时),UTF-8 编码字符串。下一个字节为0x1d,表示长度为0x1d >> 1 = 14。接下来的 14 个字节编码 common.net.APC,所以这是实例的类名。

之后,我们有两个密封的属性名称,也编码为UTF-8-vr。第一个前缀为0x15,因此长度为10 - 给我们parameters,后跟前缀0x19(长度为12)和有效载荷functionName

在此之后,您将拥有与这些密封属性相对应的值,顺序相同。第一个有一个类型标记0x09,它对应一个数组。长度标记为0x03,表示数组包含一个元素,下一个字节为0x01,表示我们没有关联成员。唯一的元素本身有一个类型标记 0x04,这意味着它是一个 integer - 在本例中值为 0。

后面是0x06 的类型标记 - 一个长度为 14 的字符串。该字符串 - 您现在可能已经猜到了 - 是 syncServerTime

因此,总而言之,您的数据包是common.net.APC 的长度前缀实例,其parameters 属性设置为[0]functionName 属性设置为"syncServerTime"


1:唯一的其他选择是对象实例的向量 - 这将需要在某处使用 0x10 的类型标记 - 或 AMF0 数据包。在 AMF0 数据包的情况下,您还必须在数据包的某处有一个 URI 样式的路径,但这里不是这种情况。

2:请注意,本节末尾给出的 EBNF 并不完全正确——无论是语法上还是语义上...

【讨论】:

以上是关于Flash发送的未知数据包的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flash、XMLSocket 中拆分数据包

QT NetworkAccessManager 未知错误

如何在 linux C 中解除对 recv() 或 recvfrm() 函数的阻塞

未知故障(cmd:调用服务包失败:Broken pipe (32))

Linux网络 - 数据包在内核中接收和发送的过程(转)

为啥无线网卡发送数据包为0,连上了说受限制