Flash发送的未知数据包

时间:2016-05-24 17:58:09

标签: java sockets flash blazeds amf

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

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

1 个答案:

答案 0 :(得分:3)

您获得的数据包似乎是以AMF3 AmfObject为前缀的长度。

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

查看前几个字节,您会看到0x00重复三次。如果我们假设AMF3,那么这将是3 undefined s,后跟一个类型为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。< / p>

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

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

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

1:唯一的其他选择是对象实例的向量 - 它需要某个地方的"syncServerTime"类型标记 - 或AMF0数据包。对于AMF0数据包,您还必须在数据包中的某处具有URI样式的路径,这不是这里的情况。

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