Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309994
  • 博文数量: 42
  • 博客积分: 2718
  • 博客等级: 少校
  • 技术积分: 467
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-19 10:23
个人简介

青 田 酒 店 服 务 小 姐 价 格 186-6531-7773

文章分类

全部博文(42)

文章存档

2011年(36)

2010年(6)

分类: C/C++

2010-12-08 15:46:49

要做网站IP的解析,因此花了点时间构造DNS查询包,并且解析DNS响应报文,在此做个总结吧。
 
首先
打开wireshark抓包,选择协议为dns,然后打开dos,ping一个网站,这样就能抓到DNS的请求和响应报文了,然后根据DNS报文的格式拼写数据就是了。报文格式的拼凑不难,要注意的就是网络字节学的问题。
动工
请求包的构造:
首先根据wireshark看到的格式,定义dns请求的头结构和DNS响应的头结构,如下:
  1. typedef struct
  2. {
  3.         u_int16_t id;
  4.         u_int16_t flag;
  5.         u_int16_t question;
  6.         u_int16_t answer;
  7.         u_int16_t auth;
  8.         u_int16_t addition;
  9. }dns_query_t;
  10. typedef struct
  11. {
  12.         u_int16_t name;
  13.         u_int16_t type;
  14.         u_int16_t class1;
  15.         u_int32_t ttl;
  16.         u_int16_t len;
  17. }dns_respons_t;
  18. dns_query_t * p_query = 0;

创建udp的socket之后,发送数据用的缓冲区为:

 

  1. char send_buf[1500] = {0};

初始化时赋值目的端口为53,目标地址为我们要查询的DNS服务器,初始化DNS头结构指针,如下:

 

  1. addr.sin_family = AF_INET;
  2.                 addr.sin_port = htons(53);
  3.                 addr.sin_addr.s_addr = dns_server;
  4.                 p_query = (dns_query_t*)send_buf;
  5.                 printf ("p_query=%p\n", p_query);
  6.                 p_query->id = 1024;
  7.                 p_query->flag = 1;
  8.                 p_query->question = 256;
  9.                 p_query->answer = 0;
  10.                 p_query->auth = 0;
  11.                 p_query->addition = 0;

要查询的域名地址存放在szdomain中,比如,查询的代码如下:

 

阅读(8904) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

duanjigang2010-12-24 14:03:41

CU博客有问题,贴不上来代码

riribi2010-12-08 18:12:08