利用Winpcap捕获发送数据包.doc
《利用Winpcap捕获发送数据包.doc》由会员分享,可在线阅读,更多相关《利用Winpcap捕获发送数据包.doc(47页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date利用Winpcap捕获发送数据包利用Winpcap捕获发送数据包利用winpcap捕获数据包、发送数据包 在上一章里面,我们学会了如何获取适配器的相关配置信息,在这一章里面,我们将继续更有意义的内容,就是捕获和发送数据包。3.1 winpcap捕获数据包流程与相关函数计算机是通过网卡和网络中其他的主机进行通信的,网卡相当于数据包进出的大门,我们平时讲的数据包的捕获相当
2、于大门的门卫在检查进出的行人一样。在网络基础我们学习过,数据包的发送是一个封装的过程,而数据包的接收则是解封装的过程,但是封装和解封装都是在OS内核来完成的,一般的应用程序没办法获取数据包原始的内容,而Winpcap却能提供这样的功能,在数据链路层捕获数据包,提供最原始的信息。其中Winpcap捕获数据的原理在第一章已经介绍过了,大家可以回顾下。 另外,数据捕获只能捕获通过本主机网卡的数据,没法捕获其他主机上网卡的数据。 下面先看看Winpcap捕获数据时的工作流程。 数据捕获的流程1. 发现网络设备的函数(find_dev_ex)以前已经介绍过了。2打开网卡的函数打开设备的函数是 pcap_
3、open()。下面是参数 snaplen, flags 和 to_ms 的解释说明pcap_t* pcap_open ( const char * source, / 指定的网卡的名称 int snaplen, / 帧的长度 int flags, / 网卡捕获的模式 int read_timeout, / 超时 struct pcap_rmtauth * auth, / 是否要求认证 char * errbuf / 错误信息存储 )snaplen 制定要捕获数据包中的哪些部分。 在一些操作系统中 (比如 xBSD 和 Win32), 驱动可以被配置成只捕获数据包的初始化部分: 这样可以减少应用
4、程序间复制数据的量,从而提高捕获效率。本例中,我们将值定为65535,它比我们能遇到的最大的MTU还要大。因此,我们确信我们总能收到完整的数据包。flags: 最最重要的flag是用来指示适配器是否要被设置成混杂模式。 一般情况下,适配器只接收发给它自己的数据包, 而那些在其他机器之间通讯的数据包,将会被丢弃。 相反,如果适配器是混杂模式,那么不管这个数据包是不是发给我的,我都会去捕获。也就是说,我会去捕获所有的数据包。 这意味着在一个共享媒介(比如总线型以太网),WinPcap能捕获其他主机的所有的数据包。 大多数用于数据捕获的应用程序都会将适配器设置成混杂模式,所以,我们也会在下面的范例中
5、,使用混杂模式。 to_ms 指定读取数据的超时时间,以毫秒计(1s=1000ms)。在适配器上进行读取操作(比如用 pcap_dispatch() 或 pcap_next_ex() 都会在 to_ms 毫秒时间内响应,即使在网络上没有可用的数据包。 在统计模式下,to_ms 还可以用来定义统计的时间间隔。 将 to_ms 设置为0意味着没有超时,那么如果没有数据包到达的话,读操作将永远不会返回。 如果设置成-1,则情况恰好相反,无论有没有数据包到达,读操作都会立即返回。3.通过回调方式捕获数据的函数 程序功能:打开指定的网卡捕获数据帧,输出数据帧的捕获时间和数据帧的大小等信息。程序运行结果如
6、下图所示:代码如下:/filename: PacketCap1.cpp/程序功能:在指定的网卡上捕获数据帧,并输出数据帧的长度和捕获时间#include pcap.h#include remote-ext.h#pragma comment(lib, wpcap)/ 包处理函数void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);/ 主函数int main()pcap_if_t *alldevs; / 设备列表pcap_if_t *d; / 网卡节点指针int in
7、um;int i=0;pcap_t *adhandle; / 要打开的网卡句柄char errbufPCAP_ERRBUF_SIZE; / 错误消息 / 获取本机设备列表 if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) = -1) fprintf(stderr,Error in pcap_findalldevs: %sn, errbuf); exit(1); / 打印列表 for(d=alldevs; d; d=d-next) printf(%d. %s, +i, d-name); if (d-descri
8、ption) printf( (%s)n, d-description); else printf( (No description available)n); if(i=0) printf(nNo interfaces found! Make sure WinPcap is installed.n); return -1; / 选择监听的网卡 printf(Enter the interface number (1-%d):,i); scanf(%d, &inum); if(inum i) printf(nInterface number out of range.n); / 释放设备列表
9、pcap_freealldevs(alldevs); return -1; / 跳转到选中的适配器 for(d=alldevs, i=0; inext, i+); / 打开设备 if ( (adhandle = pcap_open(d-name, / 设备名 65536, / 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 0, / 0表示普通模式,1表示混杂模式 1000, / 读取超时时间 NULL, / 远程机器验证 errbuf / 错误信息缓存 ) = NULL) fprintf(stderr,nUnable to open the adapter. %s is not
10、 supported by WinPcapn, d-name); / 释放设备列表 pcap_freealldevs(alldevs); return -1; printf(nlistening on %s.n, d-description); / 释放设备列表 pcap_freealldevs(alldevs); / 开始捕获 pcap_loop(adhandle, 0, packet_handler, NULL); return 0;/ 每次捕获到数据包时,libpcap都会自动调用这个回调函数 void packet_handler(u_char *param, const struct
11、 pcap_pkthdr *header, const u_char *pkt_data) struct tm *ltime; char timestr16; time_t local_tv_sec; / 将时间戳转换成可识别的格式 local_tv_sec = header-ts.tv_sec; ltime=localtime(&local_tv_sec); strftime(timestr, sizeof timestr, %H:%M:%S, ltime); printf(%s,%.6d len:%dn, timestr, header-ts.tv_usec, header-len);函数
12、pcap_loop用户捕获数据,有一个回调 参数, packet_handler指向一个可以接收数据包的函数。这个函数会在收到每个新的数据包并收到一个通用状态时被libpcap所调用 ( 与函数 pcap_loop() 和 pcap_dispatch() 中的 user 参数相似),数据包的首部一般有一些诸如时间戳,数据包长度的信息,还有包含了协议首部的实际数据。 注意:冗余校验码CRC不再支持,因为帧到达适配器,并经过校验确认以后,适配器就会将CRC删除,与此同时,大部分适配器会直接丢弃CRC错误 图1 Winpcap捕获数据帧时的过程其中pcap_pkthdr为Winpcap添加上的头部,
13、在pcap.h头文件中定义,其定义如下: Struct pcap_pkthdr struct timeval ts; / 时间 bpf_u_int32 caplen; / 长度 bpf_u_int32 len; / 帧长度 ;其中timeval的结构如下:struct timeval long tv_sec; /* seconds */ long tv_usec; /* and microseconds */;Bpf_u_int32 结构如下:typedefu_int bpf_u_int32;为了以后简化相关的程序编写过程,我们对上述程序的相关功能做了一个函数封装,简化了主函数的代码。主要包含
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 Winpcap 捕获 发送 数据包
限制150内