要做网站IP的解析,因此花了点时间构造DNS查询包,并且解析DNS响应报文,在此做个总结吧。
首先
打开wireshark抓包,选择协议为dns,然后打开dos,ping一个网站,这样就能抓到DNS的请求和响应报文了,然后根据DNS报文的格式拼写数据就是了。报文格式的拼凑不难,要注意的就是网络字节学的问题。
动工
请求包的构造:
首先根据wireshark看到的格式,定义dns请求的头结构和DNS响应的头结构,如下:
- typedef struct
- {
- u_int16_t id;
- u_int16_t flag;
- u_int16_t question;
- u_int16_t answer;
- u_int16_t auth;
- u_int16_t addition;
- }dns_query_t;
- typedef struct
- {
- u_int16_t name;
- u_int16_t type;
- u_int16_t class1;
- u_int32_t ttl;
- u_int16_t len;
- }dns_respons_t;
- dns_query_t * p_query = 0;
创建udp的socket之后,发送数据用的缓冲区为:
- char send_buf[1500] = {0};
初始化时赋值目的端口为53,目标地址为我们要查询的DNS服务器,初始化DNS头结构指针,如下:
- addr.sin_family = AF_INET;
- addr.sin_port = htons(53);
- addr.sin_addr.s_addr = dns_server;
- p_query = (dns_query_t*)send_buf;
- printf ("p_query=%p\n", p_query);
- p_query->id = 1024;
- p_query->flag = 1;
- p_query->question = 256;
- p_query->answer = 0;
- p_query->auth = 0;
- p_query->addition = 0;
要查询的域名地址存放在szdomain中,比如,查询的代码如下:
阅读(8904) | 评论(2) | 转发(0) |