如何在结构中表示DNS资源记录?

时间:2015-10-31 23:24:46

标签: c dns pcap libpcap

我正在使用pcap编写程序来解析.pcap文件。

我实际上在使用DNS协议,我能够获取标头并显示其信息。现在我想显示其资源记录(问题,答案,权限,附加)。

我找到了这个有趣的文档:http://www.zytrax.com/books/dns/ch15/

而且,正如我之前解析不同标题所做的那样,我想创建一个结构并在其中投射我的数据包。

按照这个文档,我创建了我的结构如下:

struct question_s {
  u_short  *qname;
  u_short   qtype;
  u_short   qclass;
}

我正在施展:

struct question_s *record = (struct question_s*)(data + offset);

其中 data 是数据包表示,offset是先前协议的总大小。

现在我无法理解某些要点,而且由于我的英语不够完美,我可能错过了文档中的内容。以下是我的问题:

由于qname的大小可变,我是通过将其作为指针放在u_short上来做的吗?

所有指针都是8个字节长,所以我的结构应该是12个字节长,但内存中的名称是什么?我应该在不考虑名称长度的情况下将12添加到我的偏移量中吗?

我试图显示qname,就像它是一个char *一样工作,但它似乎不起作用(seg。fault),这就是我所做的:

void test(u_short *qname) {
  for (int c = 0; qname[c] != 0; ++c)
    write(1, &qname[c], 1);
}

但也许没有' \ 0'在字符串?

这可能是一个结束问题吗?我在所有u_short和u_int值上都使用了htons和htonl,因为网络字节顺序与我的相同,但我不确定它是否适用于指针。

1 个答案:

答案 0 :(得分:2)

如果您想了解如何剖析DNS记录,请先阅读并理解RFC 1035,然后查看the tcpdump code to dissect DNS records。这比你想象的要难;你不能只是在原始数据包数据之上覆盖一个结构。

并且您不能在原始数据包数据的顶部覆盖带有指针的结构。指针几乎肯定会指向地址空间中的某个虚假位置;协议不通过网络发送原始指针,因为指针是特定地址空间中的指针,网络上的两个进程将具有不同的地址空间。

(事实上,在他们第一次尝试编写代码来剖析数据包时,只是数据包解析中的所有比人们想象的更难。)

相关问题