网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc

上传人:爱问知识人 文档编号:3291220 上传时间:2019-08-08 格式:DOC 页数:21 大小:685.51KB
返回 下载 相关 举报
网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc_第1页
第1页 / 共21页
网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc_第2页
第2页 / 共21页
网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc_第3页
第3页 / 共21页
网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc_第4页
第4页 / 共21页
网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc》由会员分享,可在线阅读,更多相关《网络编程课程设计-基于WinPcap技术的网络--数据包捕获,过滤和分析技术.doc(21页珍藏版)》请在三一文库上搜索。

1、 网络编程论文学 号:4090220姓 名:雷诺提交日期:2011.12.10成 绩:东北大学秦皇岛分校目录1、 WinPcap概述12、 Winpcap驱动各项功能13、 Winpcap的主要功能14、 Winpcap网络编程21) WinPcap获取与网络配置器绑定的设备列表2 2) 获取网络适配器的高级属性信息33) 打开网络适配器并实现抓包功能64) 不使用事件处理器进行抓包95) 过滤数据包12五、NIC驱动器和NDIS17 注:与4090225韩雪同学合作完成 基于WinPcap技术的网络 数据包捕获,过滤和分析技术摘要:在当今的互联网时代里,网络中丰富多彩的各种应用已经彻底改变了

2、人们的工作和生活方式,Internet在给人们带来方便的同时,也给网络管理员带了一些困扰。比如,一些单位的员工在工作期间炒股,玩网络游戏等,面对这些问题,基于WinPcap技术的网络数据包捕获,过滤和分析技术。如果在网络的出口位置对网络中的数据包进行捕获和分析,就可以统计出流量是基于哪些应用的,有了流量便可以成功的进行管理。1、 WinPcap概述:winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:1 捕获原始数据报,包括在共享

3、网络上各主机发送/接收的以及相互之间交换的数据报;2 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3 在网络上发送原始的数据报;4 收集网络通信过程中的统计信息。 2、 Winpcap驱动各项功能1 捕获原始数据包:包括在共享网络上各主机发送/接收的以及相互之间交换的数据包; 2 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉; 3 在网络上发送原始的数据包; 4 收集网络通信过程中的统计信息。 3、 winpcap的主要功能 在于独立于主机协议(如TCP-IP)而发送和接收原始数据包。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的

4、发收,它仅仅只是监听共享网络上传送的数据包。因此,它不能用于QoS调度程序或个人防火墙。目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me,并且MS也已经放弃了对win9x的开发。因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。其实winpcap中的面向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使用Unicode编码。有个软件叫sniffer pro.可以作网管软件用,有很多功能,可监视网络运行情况

5、,每台网内机器的数据流量,实时反映每台机器所访问IP以及它们之间的数据流通情况,可以抓包,可对过滤器进行设置,以便只抓取想要的包,比如POP3包,smtp包,ftp包等,并可从中找到邮箱用户名和密码,还有ftp用户名和密码。它还可以在使用交换机的网络上监听,不过要在交换机上装它的一个软件。还有一个简单的监听软件叫Passwordsniffer,可截获邮箱用户名和密码,还有ftp用户名和密码,它只能用在HUB网络上。著名软件tcpdump及ids snort都是基于libpcap编写的,此外Nmap扫描器也是基于libpcap来捕获目标主机返回的数据包的。 winpcap提供给用户两个不同级别的

6、编程接口:一个基于libpcap的wpcap.dll,另一个是较底层的packet.dll。对于一般的要与unix平台上libpcap兼容的开发来说,使用wpcap.dll是当然的选择。4、 winpcap网络编程1. WinPcap获取与网络配置器绑定的设备列表在开始捕获数据包之前,通常需要获取与网络适配器绑定的设备列表。通俗的说,就是获取当前计算机中安装的网卡列表,这样用户就可以选择在哪块网块上捕获数据包了。代码:/ FindAllDevs.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include pcap.h#include remote-ext.h#

7、include stdlib.hint _tmain(int argc, _TCHAR* argv) pcap_if_t *alldevs; pcap_if_t *d; int i=0; char errbufPCAP_ERRBUF_SIZE; /* 获取本地机器设备列表*/ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) = -1) fprintf(stderr,Error in pcap_findalldevs_ex: %sn, errbuf); exi

8、t(1); /* 打印列表*/ for(d= alldevs; d != NULL; d= d-next) printf(n%d. %sn, +i, d-name); if (d-description) 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; /* 不再需要设备列表了,释放它*/ pcap_freealldevs(al

9、ldevs);system(pause);return 0;2. 获取网络适配器的高级属性信息除了网络适配的名称和描述信息外,pcap_if_t结构体中还应包含网络适配器上定义的地址列表,子网掩码列表,广播地址列表和目的地址列表。代码:/ FindAllDevs.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include pcap.h#include remote-ext.h#include stdlib.h/ 将数字IP地址转换为字符串#define IPTOSBUFFERS12char *iptos(u_long in)static char output

10、IPTOSBUFFERS3*4+3+1;static short which;u_char *p;p = (u_char *)∈which = (which + 1 = IPTOSBUFFERS ? 0 : which + 1);sprintf(outputwhich, %d.%d.%d.%d, p0, p1, p2, p3);return outputwhich;#ifndef _MINGW32_ /* Cygnus doesnt have IPv6 */char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen

11、)socklen_t sockaddrlen;#ifdef WIN32sockaddrlen = sizeof(struct sockaddr_in6);#elsesockaddrlen = sizeof(struct sockaddr_storage);#endifif(getnameinfo(sockaddr, sockaddrlen, address, addrlen, NULL, 0, NI_NUMERICHOST) != 0) address = NULL;return address;#endif /* _MINGW32_ */ 打印指定接口的信息,参数d指定要打印的接口void

12、ifprint(pcap_if_t *d) pcap_addr_t *a; char ip6str128; / 打印名称 printf(%sn,d-name); / 打印描述信息 if (d-description) printf(tDescription: %sn,d-description); / 打印环回信息 printf(tLoopback: %sn,(d-flags & PCAP_IF_LOOPBACK)?yes:no); / 打印地址信息 for(a=d-addresses;a;a=a-next) printf(tAddress Family: #%dn,a-addr-sa_fam

13、ily); switch(a-addr-sa_family) case AF_INET: printf(tAddress Family Name: AF_INETn); if (a-addr) printf(tAddress: %sn,iptos(struct sockaddr_in *)a-addr)-sin_addr.s_addr); if (a-netmask) printf(tNetmask: %sn,iptos(struct sockaddr_in *)a-netmask)-sin_addr.s_addr); if (a-broadaddr) printf(tBroadcast Ad

14、dress: %sn,iptos(struct sockaddr_in *)a-broadaddr)-sin_addr.s_addr); if (a-dstaddr) printf(tDestination Address: %sn,iptos(struct sockaddr_in *)a-dstaddr)-sin_addr.s_addr); break; case AF_INET6:/ IPv6 printf(tAddress Family Name: AF_INET6n);#ifndef _MINGW32_ /* Cygnus doesnt have IPv6 */ if (a-addr)

15、 printf(tAddress: %sn, ip6tos(a-addr, ip6str, sizeof(ip6str);#endifbreak; default: printf(tAddress Family Name: Unknownn); break; printf(n);int _tmain(int argc, _TCHAR* argv)pcap_if_t *alldevs;/ 获取的所有网络设备链表pcap_if_t *d;/ 指向一个网络设备char errbufPCAP_ERRBUF_SIZE+1;/ 错误缓冲区/ 获取网络设备列表if(pcap_findalldevs_ex(P

16、CAP_SRC_IF_STRING, NULL, &alldevs, errbuf) = -1)fprintf(stderr,Error in pcap_findalldevs: %sn, errbuf);exit(1);/ 打印每个网络设备的信息for(d=alldevs;d;d=d-next)ifprint(d);/ 释放网络设备链表pcap_freealldevs(alldevs);system(pause);return 0;3. 打开网络适配器并实现抓包功能 要获得网络适配器绑定的设备列表后,可以要求用户选择一个设备用于捕获数据包。在捕获数据包之前,还需要打开设备。代码:/ pcap

17、_loop.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include pcap.h#include remote-ext.h#include stdlib.h/* packet handler 函数原型*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int _tmain(int argc, _TCHAR* argv)pcap_if_t *alldevs;/ 获取到的设备列表int inum;int i=0;pcap_t

18、 *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); /* 打印设备列表*/pcap_if_t *d; for(d=alldevs; d; d=d-next) printf(%d. %s, +i, d-name); if (d-description) printf(

19、 (%s)n, d-description); else printf( (没有有效的描述信息)n); / 如果没有找到网络适配器 if(i=0) printf(n未发现网络接口!请确定WinPcap被正确安装。n); return -1; printf(请输入要捕获数据包的网络接口编号(1-%d):,i); scanf(%d, &inum); if(inum i) printf(n接口编号越界.n); /* 释放设备列表*/ pcap_freealldevs(alldevs); return -1; /* 跳转到选中的适配器*/ for(d=alldevs, i=0; inext, i+);

20、 /* 打开设备*/ if ( (adhandle= pcap_open(d-name,/ 设备名 65536,/ 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, / 混杂模式 1000,/ 读取超时时间 NULL,/ 远程机器验证 errbuf/ 错误缓冲池 ) ) = NULL) fprintf(stderr,n无法打开网络适配器。WinPcap不支持%s n, d-name); /* 释放设备列表*/ pcap_freealldevs(alldevs); return -1; printf(n在%s上启动监听.n, d-

21、description); /* 释放设备列表*/ pcap_freealldevs(alldevs); /* 开始捕获*/ pcap_loop(adhandle, 0, packet_handler, NULL); return 0;/* 每次捕获到数据包时,WinPcap都会自动调用这个回调函数*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) struct tm *ltime; char timestr16; time_t local_tv_sec;

22、/* 将时间戳转换成可识别的格式*/ 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); 4. 不使用事件处理器进行抓包Pacp_next_ex()函数是基于回调技术来捕获数据的,当数据到达时,系统会自动调用指定的回调函数,处理捕获的数据。但使用回调方式编写的程序

23、可读性不够好,不理解这种编程思想的人很难解程序的运行轨迹。代码:/ pcap_next_ex.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include pcap.h#include remote-ext.h#include stdlib.hint _tmain(int argc, _TCHAR* argv)pcap_if_t *alldevs;/ 获取的设备列表pcap_if_t *d;/ 用于遍历设备列表int inum;/ 用户选择的用于监听的int i=0;pcap_t *adhandle;/ 打开设备后返回的WinPcap会话句柄char errbu

24、fPCAP_ERRBUF_SIZE;struct tm *ltime;/ 读取数据包的时间char timestr16;struct pcap_pkthdr *header;/ 数据包头const u_char *pkt_data;/ 数据包内容 /* 获取本机设备列表*/ 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

25、; d; d=d-next) printf(%d. %s, +i, d-name); if (d-description) 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

26、(nInterface number out of range.n); /* 释放设备列表*/ pcap_freealldevs(alldevs); return -1; /* 跳转到已选中的适配器*/ for(d=alldevs, i=0; inext, i+); /* 打开设备*/ if ( (adhandle= pcap_open(d-name, / 设备名 65536, / 要捕捉的数据包的部分 / 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, / 混杂模式 1000, / 读取超时时间 NULL, / 远程机器验证

27、 errbuf / 错误缓冲池 ) ) = NULL) fprintf(stderr,nUnable to open the adapter. %s is not supported by WinPcapn, d-name); /* 释放设列表*/ pcap_freealldevs(alldevs); return -1; printf(nlistening on %s.n, d-description); /* 释放设备列表*/ pcap_freealldevs(alldevs); /* 获取数据包*/int res; while(res = pcap_next_ex( adhandle,

28、&header, &pkt_data) = 0) if(res = 0) /* 超时时间到*/ continue; /* 将时间戳转换成可识别的格式*/ time_t 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); if(res = -1) printf(Error reading

29、 the packets: %sn, pcap_geterr(adhandle); return -1; return 0;5. 过滤数据包NFS模块中德数据包过滤引擎是WinPcap最强大的功能之一,它可以提供有效的方法获取网络中具有特性的数据包,这也是WinPcap数据包捕获机制的一个组成部分。可以通过调用Pcap_compile()和pcap_setfilter函数来实现过滤数据包的功能。代码:/ UDPdump.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include pcap.h#include remote-ext.h/* 4字节的IP地址*/t

30、ypedef struct ip_address u_char byte1; u_char byte2; u_char byte3; u_char byte4;ip_address;/* IPv4 首部*/typedef struct ip_header u_char ver_ihl; / 版本(4 bits) + 首部长度(4 bits) u_char tos; / 服务类型(Type of service) u_short tlen; / 总长(Total length) u_short identification; / 标识(Identification) u_short flags_

31、fo; / 标志位(Flags) (3 bits) + 段偏移量(Fragment offset) (13 bits) u_char ttl; / 存活时间(Time to live) u_char proto; / 协议(Protocol) u_short crc; / 首部校验和(Header checksum) ip_address saddr; / 源地址(Source address) ip_address daddr; / 目的地址(Destination address) u_int op_pad; / 选项与填充(Option + Padding)ip_header;/* UD

32、P 首部*/typedef struct udp_header u_short sport; / 源端口(Source port) u_short dport; / 目的端口(Destination port) u_short len; / UDP数据包长度(Datagram length) u_short crc; / 校验和(Checksum)udp_header;/* 回调函数原型*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int _tmain

33、(int argc, _TCHAR* argv)pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;char errbufPCAP_ERRBUF_SIZE;u_int netmask;char packet_filter = ip and udp;struct bpf_program fcode; /* 获得设备列表*/ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) = -1) fprintf(stderr,Error in

34、pcap_findalldevs: %sn, errbuf); exit(1); /* 打印列表*/ for(d=alldevs; d; d=d-next) printf(%d. %s, +i, d-name); if (d-description) 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

35、interface number (1-%d):,i); scanf(%d, &inum); if(inum i) printf(nInterface number out of range.n); /* 释放设备列表*/ pcap_freealldevs(alldevs); return -1; /* 跳转到已选设备*/ for(d=alldevs, i=0; inext, i+); /* 打开适配器*/ if ( (adhandle= pcap_open(d-name, / 设备名 65536, / 要捕捉的数据包的部分 / 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, / 混杂模式 1000, / 读取超时时间 NULL, / 远程机器验证 errbuf / 错误缓冲池 ) ) = NULL) fprintf(stderr,nUnable to open the adapter. %s is not supported by WinPcapn); /* 释放设备列表*/ pcap_freealldevs(alldevs); return -1; /* 检查数据链路层,为了简单,我们只考虑以太网*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1