【问题标题】:How can I capture dns packets in c?如何在c中捕获dns数据包?
【发布时间】:2020-08-03 21:02:55
【问题描述】:

我正在c 中编写一个数据包嗅探器程序。现在它只能找到HTTP 数据包,但我想以某种方式获取DNS 数据包。我知道DNS 数据包是UDP,但我不知道如何识别DNSDNS 数据包中是否有特定的东西可以检查以找到它们?我知道端口 53 是 DNS 请求的默认端口,但这是找到它们的可靠方法吗?

【问题讨论】:

  • “我知道端口 53 是 DNS 请求的默认端口,但它是找到它们的可靠方法吗?”。是的。这是唯一正确的方法。

标签: c dns libpcap


【解决方案1】:

没有很好的方法来判断UDP 数据包是否包含DNS 数据:UDP 标头或IP 标头中没有任何内容直接告诉您数据是DNS。但是你可以做的是first查看UDP标头中的源端口是否是port 53DNS's标准UDP端口)和second 查看数据是否适合您用于解码标头的数据结构(很可能是结构)。这是一个很好的问题。

要使数据包适合strcut,您可以使用以下代码:

这是在 c: 结构中布局的 DNS 标头数据包的实际结构:

#pragma pack(push, 1)
typedef struct 
{
    uint16_t id; // identification number 2b
    
    uint8_t rd : 1; // recursion desired
    uint8_t tc : 1; // truncated message
    uint8_t aa : 1; // authoritive answer
    uint8_t opcode : 4; // purpose of message
    uint8_t qr : 1; // query/response flag

    uint8_t rcode : 4; // response code
    uint8_t cd : 1; // checking disabled
    uint8_t ad : 1; // authenticated data
    uint8_t z : 1; // its z! reserved
    uint8_t ra : 1; // recursion available 4b

    uint16_t q_count; // number of question entries 6b
    uint16_t ans_count; // number of answer entries 8b
    uint16_t auth_count; // number of authority entries 10b
    uint16_t add_count; // number of resource entries 12b
}Dns_Header, *Dns_Header_P;
#pragma pack(pop)

要对此进行测试,您可以这样做:

Dns_Header_P header = (Dns_Header_P)capture;

capture 是一个带有DNS 标头的字节数组。

根据您捕获数据包的方式以及存储它们的方式,您可能需要更改结构的字节序。如果您使用您的程序对此进行测试,但它似乎没有正确的数据或数据被调换,请告诉我。

【讨论】:

  • 如何在c中查看数据包的结构?你能给我方法或链接如何做到这一点?
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
相关资源
最近更新 更多