我如何在c中捕获dns数据包?
How can I capture dns packets in c?
我正在 c
中编写数据包嗅探器程序。现在它只能找到 HTTP
个数据包,但我想通过某种方式也能找到 DNS
个数据包。我知道 DNS
个数据包是 UDP
但我不知道如何识别 DNS
个数据包。 DNS
数据包中是否有特定的东西要检查以找到它们?我知道端口 53 是 DNS
请求的默认端口,但它是找到它们的可靠方法吗?
没有很好的方法来判断 UDP
数据包是否包含 DNS
数据:UDP
header 或 IP
中没有任何内容header直接告诉你数据是DNS
。但是你可以做的是 first 查看 UDP
header 中的源端口是否是 port 53 (DNS's
标准 UDP
端口)和 second 查看数据是否符合您用来解码 header 的数据结构(很可能是结构)。这是一个很好的问题。
要使数据包适合 strcut,您可以使用以下代码:
这是在 c:
中的结构中布置的 DNS header 数据包的实际结构
#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
header.
根据您捕获数据包的方式以及存储它们的方式,您可能需要更改结构的字节顺序。如果您用您的程序对此进行测试,但它似乎没有正确的数据或数据被调换了,请告诉我。
我正在 c
中编写数据包嗅探器程序。现在它只能找到 HTTP
个数据包,但我想通过某种方式也能找到 DNS
个数据包。我知道 DNS
个数据包是 UDP
但我不知道如何识别 DNS
个数据包。 DNS
数据包中是否有特定的东西要检查以找到它们?我知道端口 53 是 DNS
请求的默认端口,但它是找到它们的可靠方法吗?
没有很好的方法来判断 UDP
数据包是否包含 DNS
数据:UDP
header 或 IP
中没有任何内容header直接告诉你数据是DNS
。但是你可以做的是 first 查看 UDP
header 中的源端口是否是 port 53 (DNS's
标准 UDP
端口)和 second 查看数据是否符合您用来解码 header 的数据结构(很可能是结构)。这是一个很好的问题。
要使数据包适合 strcut,您可以使用以下代码:
这是在 c:
中的结构中布置的 DNS header 数据包的实际结构#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
header.
根据您捕获数据包的方式以及存储它们的方式,您可能需要更改结构的字节顺序。如果您用您的程序对此进行测试,但它似乎没有正确的数据或数据被调换了,请告诉我。