网络嗅探器程序课程设计.docx
- 文档编号:7796933
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:12
- 大小:257.86KB
网络嗅探器程序课程设计.docx
《网络嗅探器程序课程设计.docx》由会员分享,可在线阅读,更多相关《网络嗅探器程序课程设计.docx(12页珍藏版)》请在冰豆网上搜索。
网络嗅探器程序课程设计
计算机学院课程设计
专业:
课程名称:
TCP/IP协议分析实验
课题名称:
网络嗅探器程序设计
教师:
学号:
姓名:
时间:
2011年月日
网络嗅探器程序设计
一.需求分析3
二.技术分析3
2.1Wincap的基本结构3
2.2抓包系统4
三.软件设计5
3.1总体规划5
3.2分块设计5
3.2.1获得网卡信息5
3.2.2数据包过滤5
3.2.3数据包捕获5
3.2.4数据包分析5
四.代码实现6
4.1获得设备列表6
4.2打开一个适配器开始捕获数据包6
4.3过滤数据包6
4.4获取包数据7
4.5解析数据包8
4.6将数据包存入文件9
五软件图形界面10
5.1软件实现图:
10
5.2捕获UDP数据包:
10
5.3捕获到的数据包解析:
11
六总结11
参考文献11
网络嗅探器程序设计
摘要:
随着网络入侵的不断发展,网络安全变得越来越重要,利用一种方法对网络数据包进行高效捕获,并进行一系列的分析,从而进行可靠的网络安全管理显得尤为重要。
本课题基于网络安全,用Winpcap实现网络嗅探器来监听网络,以达到保证网络安全的目的。
关键词:
网络嗅探器;程序设计;Winpcap编程
一.需求分析
通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形
式发出的数据帧,对于其他形式的数据帧,比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。
网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包既可以是发给本机的也可以是发往别处的。
通过将网络接口设置为混杂模式可以使它接收所有经过它的数据包(例如以太网帧将会到达同一局域网的所有网络接口),但是,此时操作系统不再行底层的细节操作(协议处理,流量均衡等),而是将拆封解释处理接收到的数据帧(frame)的任务交给应用程序完成,这样应用程序就可以灵活的获取各类信息。
二.技术分析
2.1Wincap的基本结构
Winpcap是一个基于Win32平台上的用于捕获和分析网络数据包的开放式的源库(opensourcelibrary),它与UNIX的BPF-libpcap结构兼容。
主要功能是捕获、发送原始数据包,Winpcap支持Win32平台上信息包的捕获和网络分析,它的主要思想来源于Unix系统中最著名的包截获架构,Winpcap的基本结构由3个模块所组成:
(1)内核级的网络组包过滤器(NetgroupPacketFilter,NPF)。
它是运行于操作系统内核中的驱动程序,直接与网卡驱动程序进行交互。
它的主要功能是过滤数据包,在包上附加时间戳、数据包长度等信息。
它直接从数据链路层取得数据包,不加修改地传给运行在用户层的应用程序,也允许用户发送原始数据包。
(2)低级动态链接库(Packet.dll)。
它用于在Win32平台上为数据包驱动程序提供一个公共接口,把应用程序和数据包监听设备驱动程序隔离开来,使得程序可以不加修改地在不同的Windows系统上运行。
(3)高级系统无关库(Wpcap.dll)。
它也工作在用户级,和应用程序编译在一起,并使用Packet.dll提供的模块,向应用程序提供完善的监听接口。
Wpcap.dll模块与Unix系统下的BSD截获架构提供的Libpcap库完全兼容。
它提供了一组功能强大而且跨平台的函数,利用这些函数,可以不去关心适配器和操作系统的类型。
2.2抓包系统
首先,抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包(rawpacket),这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。
这个部分是系统依赖(systemdependent)的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF(NetgroupPacketFilter)。
Winpcap开发小组针对Windows95,Windows98,WindowsME,WindowsNT4,Windows2000和WindowsXP提供了不同版本的驱动。
这些驱动不仅提供了基本的特性(例如抓包和injection),还有更高级的特性(例如可编程的过滤器系统和监视引擎)。
前者可以被用来约束一个抓包会话只针对网络通信中的一个子集(例如,仅仅捕获特殊主机产生的ftp通信的数据包),后者提供了一个强大而简单的统计网络通信量的机制(例如,获得网络负载或两个主机间的数据交换量)。
其次,抓包系统必须有用户级的程序接口,通过这些接口,用户程序可以利用内核驱动提供的高级特性。
Winpcap提供了两个不同的库:
packet.dll和wpcap.dll。
前者提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;后者导出了一组更强大的与libpcap一致的高层抓包函数库(captureprimitives)。
这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式行。
三.软件设计
3.1总体规划
首先要选择监听的网络适配器,再设置网络适配器为混杂模式,读取数据包的长度和读取时间,然后再设置过滤器,从而可以过滤使用特殊协议的数据包。
当完成这些准备工作后,就可以对流经网络适配器的数据进行循环捕获了。
捕获过程可考虑放在辅助线程中,在捕获的过程中查看是否有关闭线程消息,若有,则停止捕获,若没有则继续捕获。
捕获的同时,可以分析和显示数据,这可以通过调用相关函数实现。
软件主要分为五个模块:
获得网卡信息、数据包过滤、数据包捕获、数据包分析、数据显示。
3.2分块设计
3.2.1获得网卡信息
首先调用Winpcap的pcap_findalledvs()函数获取PC中所有可用的网络适配器列表,并写入系统的combobox列表中,供用户选择不同的网络适配器进行测试。
这个函数返回一个pcap_if结构的连表,连表的每项内容都含有全面的网卡信息,尤其是字段名字和含有名字的描述以及有关驱动器的易读信息。
同样,Winpcap也提供其他的高级信息,特别是pcap_findalldevs()这个函数返回的每个pcap_if结构体都包含一个pcap_addr结构的列表,它包含:
一个地址列表,一个掩码列表,一个广播地址列表和一个目的地址列表。
3.2.2数据包过滤
数据包的过滤,是通过设置过滤条件完成的。
在Winpcap中有pcap_compile()和pcap_setfilter()两个函数,通过其参数的设置可以完成数据包的过滤。
在过滤之前,要得到网络链路层的类型,是为了在分析数据时确定数据帧的类型,以便于地位IP首部开始的地方,此功能是用pcap_datalink()实现的。
3.2.3数据包捕获
当用户选择了可用的适配器后,可调用wincap的pcap_open_live()函数对所选网络适配器进行配置,把网络适配器配置成混杂模式,从而可以捕获到流过网络适配器的数据。
此函数还配置了每次捕获数据的长度和读取时间及错误信息的缓存。
在设置好过滤条件后就可对流经网络适配器的数据进行捕获。
在此系统中Winpcap利用pcap_next_ex()函数来实现循环捕获。
捕获后,利用指针指向捕获到的数据,如果没有数据,则返回提示信息。
并根据返回值判断是什么原因造成的。
3.2.4数据包分析
当捕获到的数据时,对数据要进行分析显示。
捕获到的数据要么是保存在硬盘中一起调出分析,要么就是立即分析显示,但分析的方法是一样的。
根据链路层帧的类型,可知道数据帧头部的结构。
有网络构架可以知道,数据在发送或接收之前都要对数据进行处理,即对数据进行加
四.代码实现
4.1获得设备列表
一个基本的WinPcap应用程序所需的第一步就是获得合适的网络适配器Libpcap提供pcap_findalldevs()函数完成这个功能。
这个函数返回一个相连pcap_if结构的列表,列表的每一项包含关于适配器的复杂的信息。
特别的,name和description域数据包含设备的名称和可读的描述。
实现代码:
pcap_if_t*alldevs,*d;
inti=0;
charerrbuf[PCAP_ERRBUF_SIZE];
if(pcap_findalldevs(&alldevs,errbuf)==-1)
{
fprintf(stderr,"Errorinpcap_findalldevs:
%s\n",errbuf);
exit
(1);
}
for(d=alldevs;d;d=d->next){/*Printthelist*/
printf("%d.%s",++i,d->name);
if(d->description)printf("(%s)\n",d->description);
else printf("(Nodescriptionavailable)\n");
}
if(i==0){
printf("\nNointerfacesfound!
MakesureWinPcapis
installed.\n");return;
}
pcap_freealldevs(alldevs);
4.2打开一个适配器开始捕获数据包
pcap_t*pcap_open_live( constchar*device,
intsnaplen,
intpromisc,
int to_ms,
char*ebuf)
pcap_t*adhandle=pcap_open_live(d->name,65536,1, 1000, errbuf );
/*设备标识抓包长度混杂模式超时时间*/
4.3过滤数据包
intpcap_compile(pcap_t*p,
structbpf_program*fp,
char*str,//过滤表达式
intoptimize,
bpf_u_int32netmask)//掩码
intpcap_setfilter(pcap_t*p,
structbpf_program*fp)
pcap_compile()编译一个包过滤器。
将一个高级的、布尔形式表示的字符串转换成低级的、二进制过滤语句,以便被包驱动使用。
pcap_setfilter()在核心驱动中将过滤器和捕获过程结合在一起。
从这一时刻起,所有网络的数据包都要经过过滤,通过过滤的数据包将被传入应用程序。
实现代码:
charpacket_filter[]="ipandudp";
structbpf_programfcode;
/*获取接口地址的掩码,如果没有掩码,认为该接口属于一个C类网络*/
if(d->addresses!
=NULL)
netmask=((structsockaddr_in*)
(d->addresses->netmask))->sin_addr.S_un.S_addr;
elsenetmask=0xffffff;
if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0){
fprintf(stderr,"\nUnabletocompilethefilter.Checkthesyntax.\n");
pcap_freealldevs(alldevs);return-1;
}
if(pcap_setfilter(adhandle,&fcode)<0){
fprintf(stderr,"\nErrorsettingthefilter.\n");
pcap_freealldevs(alldevs);return-1;
}
4.4获取包数据
intpcap_loop( pcap_t* p,
int cnt,
pcap_handler callback,
u_char* user)
实现代码:
pcap_loop(adhandle,0,packet_handler,NULL);
typedefvoid(*pcap_handler)
(u_char*user,
conststructpcap_pkthdr*pkt_header,
constu_char*pkt_data)
pcap_loop(pcap_t*p,intcnt,pcap_handlercallback,u_char*user)
handler_packet(u_char*args,
conststructpcap_pkthdr*header,
constu_char*packet);
structsniff_ethernet*ethernet;
structsniff_ip*ip;
structsniff_tcp*tcp;
ethernet=(structsniff_ethernet*)(packet);
ip=(structsniff_ip*)(packet+size_ethernet);
tcp=(structsniff_tcp*)(packet+size_ethernet+size_ip);
payload=(u_char*)(packet+size_ethernet+size_ip+size_tcp);
4.5解析数据包
用户在程序中调用的pcap_loop()(或者pcap_dispatch())函数可以进行数据包的捕获,而每一个数据包到达时该函数会调用pcap_handler()函数进行数据包处理,返回一个指向捕获器头部和一个指向帧数据的指针(包含协议头)。
Ethernet帧头
structsniff_ethernet{
u_charether_dhost[ETHER_ADDR_LEN];
u_charether_shost[ETHER_ADDR_LEN];
u_shortether_type;/*IP?
ARP?
RARP?
等*/
};
代码实现:
IP报文头
structsniff_ip{
#ifBYTE_ORDER==LITTLE_ENDIAN
u_intip_hl:
4,/*headerlength*/
ip_v:
4;/*version*/
#endif
#ifBYTE_ORDER==BIG_ENDIAN
u_intip_v:
4,/*version*/
ip_hl:
4;/*headerlength*/
#endif/*not_IP_VHL*/
u_charip_tos;/*typeofservice*/
u_shortip_len;/*totallength*/
u_shortip_id;/*identification*/
u_shortip_off;/*fragmentoffsetfield*/
#defineIP_RF0x8000/*reservedfragmentflag*/
#defineIP_DF0x4000/*don’tfragmentflag*/
#defineIP_MF0x2000/*morefragmentsflag*/
#defineIP_OFFMASK0x1fff/*maskforfragmentingbits*/
u_charip_ttl;/*timetolive*/
u_charip_p;/*protocol*/
u_shortip_sum;/*checksum*/
structin_addrip_src,ip_dst;/*sourceanddestaddress*/
};
TCP报文头
structsniff_tcp{
u_shortth_sport;/*sourceport*/
u_shortth_dport;/*destinationport*/
tcp_seqth_seq;/*sequencenumber*/
tcp_seqth_ack;/*acknowledgementnumber*/
#ifBYTE_ORDER==LITTLE_ENDIAN
u_intth_x2:
4,/*(unused)*/
th_off:
4;/*dataoffset*/
#endif
#ifBYTE_ORDER==BIG_ENDIAN
u_intth_off:
4,/*dataoffset*/
th_x2:
4;/*(unused)*/
#endif
u_charth_flags;
#defineTH_FIN0x01
#defineTH_SYN0x02
#defineTH_RST0x04
#defineTH_PUSH0x08
#defineTH_ACK0x10
#defineTH_URG0x20
#defineTH_ECE0x40
#defineTH_CWR0x80
#defineTH_FLAGS(TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_shortth_win;/*window*/
u_shortth_sum;/*checksum*/
u_shortth_urp;/*urgentpointer*/
};
4.6将数据包存入文件
pcap_dumper_t*dumpfile;
dumpfile=pcap_dump_open(adhandle,argv[1]);
//打开一个存储文件并将它和接口联系起来
if(dumpfile==NULL){
fprintf(stderr,"\nErroropeningoutputfile\n");return-1;
}
pcap_loop(adhandle,0,packet_handler,(unsignedchar*)dumpfile);
//packet_handler
voidpacket_handler(u_char*dumpfile,
conststructpcap_pkthdr*header,
constu_char*pkt_data)
{
/*savethepacketonthedumpfile*/
pcap_dump(dumpfile,header,pkt_data);
}
五软件图形界面
5.1软件实现图:
5.2捕获UDP数据包:
5.3捕获到的数据包解析:
六总结
网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。
通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。
此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。
可见,嗅探器实际是一把双刃剑。
而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。
权衡利弊,有必要对网络嗅探器的实现原理进行深入的了解。
参考文献
[1]吴功宜,董大凡,王珺,等.计算机网络高级软件编程技术[M].清华大学出版社,2008
[2]谢小特,王勇军.基于Winpcap的捕包程序设计[J].软件导刊,2007
[3]胡晓元,史浩山.Winpcap包截获系统的分析及其应用[J].计算机工程,2005
[4]庄春兴,彭奇志.基于Winpcap的网络嗅探程序设计[J].计算机与现代化,2002
[5]赵辉,叶子青.VisualC++系统开发实例精粹[M].人民邮电出版社,2005
[6]寇晓蕤,罗军勇.网络协议分析[M].机械工业出版社,2009.7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 嗅探器 程序 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)