gpt4 book ai didi

c - 解析 DNS 响应

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:37 24 4
gpt4 key购买 nike

我在解析 DNS 响应时遇到了一些问题。以下是我的代码。以下是结构。我在尝试打印 QNAME 的 printf() 中遇到段错误。

在 C 编程方面,我非常业余,所以我不确定我哪里出错了。任何帮助/提示或有用资源/教程的链接,将不胜感激。函数 verfify_header() 工作正常。我不确定为什么使用 memcpy() 可以正确提取 HEADER。而其他字段则不是。

struct HEADER{    
unsigned short ID;
unsigned char RD:1;
unsigned char TC:1;
unsigned char AA:1;
unsigned char Opcode:4;
unsigned char QR:1;
unsigned char RCODE:4;
unsigned char Z:3;
unsigned char RA:1;
unsigned short QDCOUNT;
unsigned short ANCOUNT;
unsigned short NSCOUNT;
unsigned short ARCOUNT;
};

struct REQ_DATA{
unsigned short qtype;
unsigned short qclass;
};

struct QUESTION{
char* qname;
struct REQ_DATA field;
};

struct RES_DATA{
unsigned short type;
unsigned short class;
unsigned int ttl;
unsigned short rdlength;
};

struct RESPONSE{
char* name;
struct RES_DATA field;
char* rdata;
};

下面是解析dns响应的函数。

void parse_response(char *recvbuf, struct result *res)     
{
struct HEADER *rechd = (struct HEADER*) malloc(sizeof(struct HEADER));
struct QUESTION qst;
struct RESPONSE *rp = (struct RESPONSE*) malloc(sizeof(struct RESPONSE));
struct RES_DATA fld;

char* rname = (char*)malloc(sizeof(char));
int hlen,qlen,rlen;
hlen = sizeof(struct HEADER);

memcpy(rechd,recvbuf,hlen);

verify_header(rechd); //This function works correctly
qlen = sizeof(struct QUESTION);

//RESPONSE is after QUESTION and HEADER
rlen = sizeof(struct RESPONSE);

int length = hlen + qlen;
rp = (struct RESPONSE*)(recvbuf + length);
//memcpy(rp, recbbuf + length, sizeof(struct RESPONSE));

memcpy(rname, rp, strlen(rname) + 1);

printf("QNAME: %s\n", *rname); //Segmentation Fault occurs over here!!!!!

}

谢谢,钱德

最佳答案

问题是您正在尝试使用 C 结构来解析来自网络的数据。如果您的机器是大字节序的,并且您的编译器碰巧按照您希望的方式对位域进行排序,那么这可能没问题(直到您到达指针字段......),但它非常脆弱。您应该将数据包解析为 unsigned char 数组。

现在,看看这个:

struct QUESTION{
char* qname;
struct REQ_DATA field;
};

这是一个 8 或 16 字节的结构(取决于您的平台),与实际 DNS 数据包中的可变长度字段完全不同。而且您肯定无法从网络外的数据中获取有效指针(对于您自己的机器和进程的地址空间而言是本地的)。

关于c - 解析 DNS 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4229632/

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