1、 2.1.4 使用环境.2 2.1.5 可行性分析.22.2 技术分析2 2.2.1 嗅探原理.2 2.2.2 捕获机制.3 2.2.3 WinPcap 技术.33、程序设计与实现.43.1 主要流程43.2 总体规划43.3 函数说明43.4 分块设计6 3.4.1 获得网卡列表信息.6 3.4.2 数据包捕获.7 3.4.2 数据包过滤.7 3.4.2 数据包分析.84、问题分析及测试.94.1 问题分析94.2 测试105、结论.115.1 设计心得115.1 谢辞11参考文献.12附录(源程序).131、引 言1.1 开发背景随着网络技术的迅速发展,加速了全球信息化进程,各种重要数据在
2、网上的传播日益普遍,使得网络安全问题越来越为人们所关注。网络嗅探器作为一种网络数据监听程序,在网络安全攻防方面扮演了很重要的角色,多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备,如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。1.2 开发意义本次课程设计是基
3、于VS的网络嗅探器的设计与实现,由于本人编程能力有限,只是对抓取到的本机在网络中的通信数据,比如说协议类型,源、目的地址和端口、数据包的大小等加以分析,而无法做到像Sniffer那种成熟的嗅探器所拥有的强大功能。作为网络技术人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对大学三年来内容的学以致用,不断提高自我的一种有效途径。1.3 正文安排 作为论文的主要部分,本文正文的安排如下: 第一部分是系统分析,包括程序需求分析和技术分析。讨论用户需求,功能需求,性能需
4、求,运行环境等因素,对嗅探工具开发的思想和过程作初步的分析和论证。并介绍出现网络嗅探器工具的原理和方法,以及本次设计中用到的Winpcap技术; 第二部分是功能设计,包括系统的设计与实现。详细介绍使用Winpcap开发程序的一般流程及相关功能函数,以及数据包捕获,分析,过滤等各个模块的具体实现。 第三部分是问题分析及解决,同时介绍测试环境及过程,作为课程设计的最后一部分,将严格地对网络嗅探器进行测试。第四部分总结这次课程设计的心得、谢辞以及列出参考文献。2、 系统分析2.1 需求分析l 2.1.1 功能需求本程序主要实现了对流经网络的数据包进行捕获及分析,通过对网卡的选择,设置过滤规则,来制定
5、对特定的协议进行解析,主要运用到套接字编程,WinPcap编程等技术,在程序上每一步都有详细的解释,很容易了解本嗅探程序的功能。 l 2.1.2 适用范围这个程序是面向用户的,简单易行,是对网络协议进行分析,只要电脑上有流经网络的数据包,通过本程序的执行,均可捕获该数据报,并对其内容进行分析,操作步骤简单,每一过程均有明显的提示信息。l 2.1.3基本思路该嗅探程序的总体架构划分为5部分,分别是监听网络适配器,选择网卡设备,设置过滤规则,捕获数据包,数据的分析及显示。良好的实现了嗅探器的一般功能。l 2.1.4使用环境 (1)、一台主机 (2)、操作系统(Windows XP)(3)、开发工具
6、(VS2010,WinPcap)l 2.1.5可行性分析在日异月新的网络时代中,网络信息与安全一是其中重要的一环,网络嗅探更是网络攻防重基础的技术,用来监听网络数据,保障信息安全,这项技术有着广大的发展空间,其类的嗅探工具更是层出不穷,有着良好的发展前景及经济利益,而且操作运行时所需人员不是很多,这种工具的开发节省了大量的人力及物力,在广大市场中是被需求的,并且无论是生活中还是企业里都得到了广泛的应用,它所带来的经济效益是无可厚非的。2.2 技术分析l 2.2.1嗅探原理 嗅探器是一种常用的收集有用数据的方法,嗅探器是利用计算机的网络接口截获目的地为其它计算机的数据报文的一种工具。由于组网方式
7、不同,嗅探器的工作原理也有所不同,总共可以分为三类:(1) 基于网卡混杂模式的嗅探原理;(2) 基于ARP欺骗的网络嗅探原理;(3) 基于中间人攻击的嗅探原理。本次课程设计就是利用第一种方式来实现嗅探器的功能,从网卡原理上来说,在一个实际的系统中,网卡的主要功能就是接收和发送网络数据包,它根据网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。而本次设计嗅探工具正是利用了这个特点,把网卡设置为“混杂模式”。网卡的混杂模式可以接受所
8、有的网络数据包,无论其目的地址是否等于自己的地址,都一并接受。l 2.2.2捕获机制很多网络安全系统最首要的任务就是捕获网络上的数据信息,而网络数据包捕获技术就解决了这个问题。不同的网络有不同的捕获技术,不同的操作系统其捕获机理也有所不同。以太网采用了CSMA/CD技术,它使用了广播机制,所有与网络连接的机器都可以看到网络上传播的数据,操作系统提供的捕获机制主要有以下三种:(1) SOCK_PACKET类型套接口;(2) 数据链路提供者接口(Data Link Provider Interface,DLPI);(3) 伯克利数据包过滤器(Berkeley Packet Filter,BPF)。
9、BPF主要由两部分组成:网络转发部分和数据包过滤部分。网络转发部分是从链路层中捕获数据包并把它们转发给数据包过滤部分,数据包过滤部分是从接收到的数据包中接受过滤规则决定的网络数据包,其他数据包就抛弃。捕获数据包和过滤数据包都是在操作系统内核中完成的,而且使用了数据缓存机制。从效率上来讲,BPF在三种机制中是性能最高的,而SOCK_PACKET是最弱的。在实际应用中,实现网络数据包捕获技术的代表是Libpcap。它是一个专业的跨平台的网络数据包捕获开发包。使用Libpcap可以很轻松地实现网络数据包的捕获功能,它的捕获机制就是BPF捕获机制。在Windows平台下有与Libpcap兼容的WinP
10、cap开发包,它是专门针对Windows平台而开发的,本次程序的开发就是利用WinPcap库函数实现的。l 2.2.3 WinPcap 技术WinPcap(Windows Packet Capture)是Windows平台下的一个免费、公平的专业网络数据包捕获开发包。WinPcap的功能为:捕获数据包(主要功能)、流量统计功能、数据包发送功能。它包括三部分,即数据包捕获和过滤块NPF、较低层的网络编程接口packer.dll、较高层的编程接口wpcap.dll。使用该开发包可以提高应用效率,WinPcap充分考虑了各种性能和效率的优化,在内核层实现了数据包的捕获和过滤,这是由NPF来实现的,N
11、PF是WinPcap的核心部分,它实现了内核的统计功能,对于设计网络流量的程序很有好处。体系结构调用如下:Applicationwpcap.dllPacket.dll NPF 图2.2.3:体系结构调用3、 程序设计与实现本次课设的主要研究内容是利用套接字开发网络嗅探器的程序设计,设计要求完成对流经本地网卡的所有数据包的捕获,分析协议类型,并根据不同的协议类型对数据包进行了进一步的分析,包括分析数据包的IP,端口,协议类型等。3.1 主要流程3.2 总体规划首先要选择监听的网络适配器,再设置网络适配器为混杂模式,然后再设置过滤器,从而可以过滤使用特殊协议的数据包。当完成这些准备工作后,就可以对
12、流经网络适配器的数据进行循环捕获了。捕获的同时,可以分析和显示数据,这可以通过调用相关函数实现。程序主要分为五个模块:获得网卡信息、数据包过滤、数据包捕获、数据包分析、数据显示。3.3 函数说明 (1)、pcap_findalldevs()是用来获得主机的网络设备列表,获取的网络设备就存储在参数alldevs中函数体:int pcap_findalldevs(pcap_if_t * alldevs,char * error_content)说明:指向pcap_if_t*类型的列表的指针的指针,char型指针,当打开列表错误时 返回错误信息。当不再需要网卡列表时,用pcap_freealldev
13、s(pcap_if_t *) 释放空间。 (2)、pcap_open_live() 是用来打开网络设备列表,得到一个包抓取的描述符。pcap_t *pcap_open_live(const char * device, int snaplen, int promise, int to_ms, char ebuf *)device表示要捕获数据包的网络设备的名称,由函数pcap_findalldevs()得 到的; Snaplen表示要捕获的数据包的最大可抓取的最大字节; Promise表示捕获数据包是否设为混杂模式,若值为1 则表明设为混杂模式; to_ms表示捕获的时间间隔。(3) 、pca
14、p_lookupnet() 用来监测网卡所在网络的网络地址和子网掩码。int pcap_lookupnet(char *device,bpf_u_int32 *netp,bpf_u_int32 *maskp,char *errbuf)bpf_u_int32 *netp 存放网络地址 bpf_u_int32 *maskp 存放子网掩码(4) 、pcap_compile()如果要获得特定的网络数据包,就需要使用过滤规则,过滤规则其实就是一个字符串,在Winpcap 中使用此函数用来编译表达式。int pcap_compile(pcap_t *p,struct bpf_program *fp,cha
15、r *str,int optimize,bpf_u_int32 netmask)pcap_t *p 打开的设备接口句柄 struct bpf_program *fp 存储被编译过的过滤器版本的地址 Char *str 表达式本身 int optimize 是否被优化的整形量(0-false,1-true)(5) 、pcap_setfilter()使用过滤器用于设定一个过滤程序。int pcap_setfilter(pcap_t *p,struct bpf_program *fp)(6) 、pcap_loop()设置获取到满足过滤规则后,数据包处理的回调函数。int pcap_loop(pcap
16、_t *p,int cnt,pcap_handler callback,u_char *user)int cnt 捕获数据包的个数 pcap_handler callback 回调函数的名称 u_char *user 送往回调函数的参数(7) 、pcap_close()关闭pcap_open_live()获取的包捕捉句柄,释放相关的资源。关闭相关的文件并释放对应资源。void pcap_close(pcap_t *p()(8) 、void ethernet_protocol_packet_callback()回调函数的原型。void ethernet_protocol_packet_callb
17、ack(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content)u_char *argument对应于pcap_loop()的最后一个参数 const struct pcap_pkthdr *packet_header参数类型在pcap.h中包含,该结 构体包含数据包被嗅探的时间、大小等信息。(9) 、struct protocol_header用于定义ETHERNET、IP、TCP、UDP、ARP、ICMP等协议的头部信息。3.4 分块设计l 3.4.1获得网卡列表信息首先
18、调用WinPcap 的pcap_findalledvs () 函数获取电脑中所有可用的网络适配器列表,并显示在控制台上,供操作人员选择不同的网络适配器进行测试。这个函数返回一个pcap_if 结构的连表,连表的每项内容都含有网卡信息,尤其是字段名字namea和含有名字的描述description 以及有关驱动器的易读信息。同样,WinPcap 也提供其他的高级信息,特别是pcap_findalldevs () 这个函数返回的每个pcap_if 结构体都包含一个pcap_addr 结构的列表, 它包含:一个地址列表,一个掩码列表,一个广播地址列表和一个目的地址列表。实现代码:pcap_if_t
19、*alldevs;pcap_if_t *d;pcap_t *pcap_handle;/* Winpcap句柄 */ char error_contentPCAP_ERRBUF_SIZE;/* error_content错误缓冲区,即effbuf,存储错误信息 */int i=0; /i指的是网卡的序列号/* 取得列表 */ /pcap_findalldevs()是用来获得主机的网络设备列表,获取的网络设备就存储在参数alldevs中if (pcap_findalldevs(&alldevs, error_content) = -1) fprintf(stderr,pcap_findalldev
20、s发生错误: %sn, error_content);exit(1); / 输出网卡信息for(d=alldevs; d; d=d-next) /next表示指向下一个网络设备printf(%d. 网卡名: %s n, +i, d-name); if (d-description) printf( 网卡描述:, d-description); else (No description available)n);if(i=0) printf(n没有找到任何网卡,请确认Winpcap已经安装.n return ;l 3.4.2数据包捕获当操作人员选择了可用的适配器后, 可调用WinPcap 的pc
21、ap_open_live()函数对所选网络适配器进行配置,把网络适配器配置成混杂模式,从而可以捕获到流过网络适配器的数据。此函数还配置了每次捕获数据的长度和读取时间及错误信息的缓存。在设置好过滤条件后就可对流经网络适配器的数据进行捕获。在此系统中WinPcap 利用pcap_loop()函数来实现循环捕获。捕获后,利用指针指向捕获到的数据,如果没有数据,则返回提示信息。并根据返回值判断是什么原因造成的。 int inum; /网卡的编号bpf_u_int32 net_mask;/* 掩码 */bpf_u_int32 net_ip; /网络地址printf(nn请输入网卡编号 (1-%d):,i
22、);scanf(%d, &inum);/ 检测用户是否指定了有效网卡if(inum i) printf(n网卡编号超出范围.n pcap_freealldevs(alldevs); /* 释放列表 */ return ; for(d=alldevs, i=0; inext, i+);/* 跳转到选中的适配器 */pcap_lookupnet(d-name,&net_ip,&net_mask,error_content);/获得网络地址和掩码pcap_handle = pcap_open_live(d-name, BUFSIZ, 1, 1, error_content);/打开网路接口 /*pc
23、ap_loop()表示捕获多个数据包,可以总是循环捕获数据包,ethernet_protocol_packet_callback回调函数*/* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */pcap_loop(pcap_handle, - 1, ethernet_protocol_packet_callback, NULL);l 3.4.3数据包过滤 数据包的过滤,是通过设置过滤条件完成的。在WinPcap 中有pcap_compile()和pcap_setfilter()两个函数,通过其参数的设置可以完成数据包的过滤。在过滤之前,要得到网络链路层的类型,是为了在分析数据时确定数据帧的类型。在过滤之前,要得到网络链路层的类型,是为了在分析数据时确定数据帧的类型, 以便于地位IP 首部开始的地方, 此功能是用pcap_datalink()实现的。int protocol_type; / 0-ip 1-arp 2-tcp 3-udp 4-icmpstruct bpf_program bpf_filter;/* BPF过滤规则 */char packet_filter20;/* 过滤规则字符串 */ 选择过滤包类型n请选择监听的数据包协议类型(0-ip