A Problem in Parsing CNAME with Libpcap: 一些 CNAME 似乎缺少 TLD

A Problem in Parsing CNAME with Libpcap: some CNAMEs seems missing TLD

我正在使用 libpcap 编写 DNS 回复解析器,发现某些 CNAME 的 TLD 似乎从相应的 DNS 数据包负载中丢失。示例数据包的 wireshark dissection 中显示了一个示例,其中 wireshark 显示实际的 CNAME 是

prd-push-access-net5-175542503.us-east-1.elb.amazonaws.com

但我只能找到

prd-push-access-net5-175542503.us-east-1.elb.amazonaws

(即没有“.com”)在有效载荷的相应部分。我想知道一个人(以及 wireshark 如何)如何从这个有效负载中解析完整的 CNAME(带有“.com”)?

(此 CNAME 似乎格式不正确,因为根据 RFC1035,有问题的 QNAME 部分应该 "terminates with the zero length octet for the null label of the root",我想这同样适用于 CNAME?)

DNS 数据包使用名称压缩,参见 https://www.rfc-editor.org/rfc/rfc1035 4.1.4 节

在许多地方(名字出现的地方),每个标签都可以用一个指针来表示,该指针指向数据包中它已经出现的以前的位置,而不是字符串。

在你的例子中,我们可以清楚地看到数据包前面的 myfoscam.com 中的 com

所以对于内容(只使用结尾因为从图像中提取数据很繁琐,你应该把东西复制为文本)03656c6209616d617a6f6e617773c019c02e00我们必须这样分析它:

  • 03:下面是长度为3
  • 的字符串
  • 656c62:这是字符串 elb,广告长度为 3
  • 09:下面是长度为9
  • 的字符串
  • 616d617a6f6e617773:这是字符串amazonaws
  • c0 :前两位为 1(因为它的值为 192,所以大于或等于 128+64),这意味着它是两字节指针的一部分。因此,c019 是一个指向数据包中十进制偏移量 25(十六进制中的 19)的指针。

所以如果你从整个数据包开始,并切换到偏移量 25,你应该找到序列 03636f6d,它是 com(前缀长度为 3)。

或者可能是别的东西,因为实际上你还有另一个指针:c02e,所以这是消息中的偏移量 46。或者那部分完全是为了别的东西,它实际上取决于前一个指针指向的内容,它是否以空标签结束(如果它在偏移量 25 处是否为 03636f6d00)。请参阅 RFC 中的示例(and/or 在您的问题中将所有数据包内容作为文本提供)

然后它以00空标签结束,这意味着根(隐藏在任何名称末尾的.)。