这几天在实验室敲了几天代码,开始一直不知道怎么捕获DNS包,参考了许多的资料,终于弄明白了,现在和还不明白的朋友分享一下。。。
1.关于适配器那一块就跳过了,网上程序写的很清楚。
2.如何获得IP?port?
这个很简单,只需要把指针定义到IP首部,根据IP头部的结构输出相应的源和目的IP,PORT即可。
3.如何捕获DNS查询包?
这个对像我一样开始学的菜鸟比较头疼,其实很简单的额,打开wireshark,用它来分析。对wireshark捕获的包进行过滤(DNS过滤),你会发现所有DNS数据包的端口号都是53,那么DNS包找到了,查询包呢?很简单,查询包源IP和本地IP肯定是一样的喽!这下通过以上俩点就可以在程序里过滤得到查询包了。
4.如何获得域名?
这个和IP,port获取类似,了解DNS包结构(很重要,不然没法整),发现域名在查询数据包的第3部分,定义指针到DNS那个部分就可以了,因为最后有'/0',所以你懂得。。。
本人超级菜鸟,如有错误,欢迎指正,谢谢!
程序如下:
#include "pcap.h"
#include <string.h>//memcpy()所需头文件
#include "remote-ext.h"
#include <stdio.h>
//包含SQLite3头文件
#include "sqlite3.h"
//连接sqlite3库文件
#pragma comment(lib,"sqlite3.lib")
#define DNSPORT 53
/* 4字节的IP地址 */
typedef struct ip_address{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;