gpt4 book ai didi

c - 如何在c中捕获dns数据包?

转载 作者:行者123 更新时间:2023-12-04 13:34:06 25 4
gpt4 key购买 nike

我正在 c 中编写数据包嗅探器程序.现在只能找到HTTP包,但我想以某种方式让它也得到 DNS数据包。我知道 DNS数据包是 UDP但我不知道如何识别DNS那些。 DNS有没有具体的东西数据包检查找到它们?我知道端口 53 是 DNS 的默认端口请求,但这是找到它们的可靠方法吗?

最佳答案

没有好的方法可以判断 UDP数据包包含 DNS数据:UDP中什么都没有标题,或 IP直接告诉你数据的header是DNS .但是你可以做的是第一 查看源端口是否在UDP标题是 端口 53 ( DNS's 标准 UDP 端口)和 第二个查看数据是否适合您用来解码 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标题。
根据您捕获数据包的方式以及存储它们的方式,您可能需要更改结构的字节顺序。如果您用您的程序对此进行测试,但它似乎没有正确的数据或数据被切换,请告诉我。

关于c - 如何在c中捕获dns数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63236914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com