【问题标题】:How to represent DNS Resource Records in a structure?如何在结构中表示 DNS 资源记录?
【发布时间】:2015-11-01 10:01:52
【问题描述】:

我正在制作一个使用 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* 一样处理它,但它似乎不起作用(段错误),这是我所做的:

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,因为网络字节顺序与我的不同,但我不确定它是否适用于指针。

【问题讨论】:

    标签: c dns pcap libpcap


    【解决方案1】:

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

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

    (事实上,包解析中的每件事都比人们第一次尝试编写代码来解析包时所想的要难。)

    【讨论】:

    • 您对指针的解释很有道理!我不知道我在想什么。谢谢您,我会阅读并最终回复您
    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 2020-04-24
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多