网络嗅探器的系统设计应用.docx
《网络嗅探器的系统设计应用.docx》由会员分享,可在线阅读,更多相关《网络嗅探器的系统设计应用.docx(20页珍藏版)》请在冰豆网上搜索。
网络嗅探器的系统设计应用
计算机网络课程设计
题目网络嗅探器的设计与实现
系(部)
姓名
学号
指导教师
2015年7月18日
计算机网络课程设计任务书
一、设计题目、内容及要求
题目:
网络嗅探器的设计与实现
内容:
本设计是关于网络嗅探器的设计与实现,功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。
要求:
1.实现网络嗅探器的界面
2.实现抓取数据包的功能。
3.实现清空列表功能
二、要求的设计成果(课程设计说明书、设计实物、图纸等)
1.课程设计报告
2.实现网络嗅探器的程序代码
三、进程安排
1、设计工作4学时
2、实现与调试20学时
3、课程设计报告6学时
四、主要参考资料
[1]王群《计算机网络安全技术》
[2]吴功宜,董大凡王珺等.计算机网络高级软件编程技术【M】.北京:
清华大学出版社,2008
[3]谢小特,王勇军.基于winPcap的捕包程序设计【J】.软件特刊,2007(11):
71-72
[4]胡晓元,史浩山.winpcap包截获系统的分析及其应用【J】.计算机工程,2005
(1):
96-97
[5]赵辉,叶子青.VisualC++系统开发实例精粹【M】,北京:
人民邮电出版社,2005
网络嗅探器的设计与实现
摘要:
网络嗅探器是对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法。
本设计是关于网络嗅探器的设计与实现,其功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。
关键字:
网络嗅探器;数据包捕获;套接字
引言
由于网络技术的发展,计算机网络的应用越来越广泛,其作用也越来越重要。
计算机网络安全问题更加严重,网络破坏所造成的损失越来越大。
但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。
嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。
嗅探器是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。
通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。
而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。
1基本概念
1.1嗅探器
每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器。
当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。
在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。
嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。
从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。
对于网卡来说一般有四种接收模式:
a)广播方式:
该模式下的网卡能够接收网络中的广播信息。
b)组播方式:
设置在该模式下的网卡能够接收组播数据。
c)直接方式:
在这种模式下,只有目的网卡才能接收该数据。
d)混杂模式:
在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。
嗅探程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太网卡)置为混杂模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包,而不管该数据是否传给它的。
1.2相关协议
1.2.1IP协议
网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层--TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。
IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
1.2.2TCP协议
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。
TCP将包排序并进行错误检查,同时实现虚电路间的连接。
TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。
应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
1.2.3UDP协议
UDP与TCP位于同一层,但对于数据包的顺序错误或重发。
因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。
相对于FTP或Telnet,这些服务需要交换的信息量较小。
使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。
欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
1.3数据包
“包”(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。
TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,而帧是工作在第二层(数据链路层)。
上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的。
数据包的结构非常复杂,主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成。
正是因为数据包具有这样的结构,安装了TCP/IP协议的计算机之间才能相互通信。
我们在使用基于TCP/IP协议的网络时,网络中其实传递的就是数据包。
比如说当你上网时打开某个网页,这个简单的动作,就是你先发送数据包给那个网站,它接收到了之后,根据你发送的数据包的IP地址,返回给你网页的数据包,也就是说,网页的浏览,实际上就是数据包的交换。
2网络嗅探器的作用
嗅探器是网络的抓包工具,可以对网络中大量数据抓取,从而方便使用者对网络中用户的一些信息进行分析,所以,通常被黑客运用于网络攻击。
我们如果也能掌握网络嗅探器的原理和设计,可以将它运用与网络故障检测、网络状况的监视,还可以加强企业信息安全防护。
3网络嗅探器原理
嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。
但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。
而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。
显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。
具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(rawsocket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。
在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。
为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。
至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。
但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。
通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。
由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。
下面给出数据包的总体结构:
3.1UDP数据段头
数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。
其中UDP数据段头比较简单,由sourceport(源端口号)、destinationport(目的端口号)、udplength(udp长度)、udpchecksum(udp校验和)组成。
UDP报头结构体为:
typedefstructudphdr{
unsignedshortsport;/*sourceport(源端口号)*/
unsignedshortdport;/*destinationport(目的端口号)*/
unsignedshortlen;/*udplength(udp长度)*/
unsignedshortcksum;/*udpchecksum(udp校验和)*/
}UDP_HDR;
3.2TCP数据段头
TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,由sourceport(源端口号)、destinationport(目的端口号)、顺序号、确认号、TCP头长、校验和紧急指针、可选项(0或更多的32位字)、数据(可选项)。
组成。
TCP报头结构体为:
typedefstructtcpheader{
unsignedshortintsport;/*sourceport(源端口号)*/
unsignedshortintdport;/*destinationport(目的端口号)*/
unsignedintth_seq;/*sequencenumber(包的序列号)*/
unsignedintth_ack;/*acknowledgementnumber(确认应答号)*/
unsignedcharth_x:
4;/*unused(未使用)*/
unsignedcharth_off:
4;/*dataoffset(数据偏移量)*/
unsignedcharFlags;/*标志全*/
unsignedshortintth_win;/*windows(窗口)*/
unsignedshortintth_sum;/*checksum(校验和)*/
unsignedshortintth_urp;/*urgentpointer(紧急指针)*/
}TCP_HDR;
3.3IP数据段头
在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。
IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。
如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。
IP数据段头格由版本IHL服务类型总长、标志、分段偏移、头校验和、源地址、目的地、 选项(0或更多)组成。
IP数据报头的结构体为:
structipheader{
unsignedcharip_hl:
4;/*headerlength(报头长度)*/
unsignedcharip_v:
4;/*version(版本)*/
unsignedcharip_tos;/*typeosservice服务类型*/
unsignedshortintip_len;/*totallength(总长度)*/
unsignedshortintip_id;/*identification(标识符)*/
unsignedshortintip_off;/*fragmentoffsetfield(段移位域)*/
unsignedcharip_ttl;/*timetolive(生存时间)*/
unsignedcharip_p;/*protocol(协议)*/
unsignedshortintip_sum;/*checksum(校验和)*/
unsignedintip_src;/*sourceaddress(源地址)*/
unsignedintip_dst;/*destinationaddress(目的地址)*/
};
4网络嗅探器的设计
在以太网中,信息是以明文的形式在网络上传输,当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可捕获任何一个在同一冲突域上传输的数据包。
IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。
运用这一原理使信息捕获系统能够拦截我所要的信息,这是捕获数据包的物理基础。
首先,抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包,这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。
这个部分是系统依赖的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF(NetgroupPacketFilter)。
Winpcap提供了两个不同的库:
Packet.dll和Wpcap.dll。
Wpcap.dll提供了更加友好、功能更加强大的函数调用。
WinPcap的优势在于提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来,便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。
前者提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;后者导出了
一组更强大的与libpcap一致的高层抓包函数库(captureprmiitives)。
这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行。
网络嗅探器工作在网络环境的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体拓扑布局。
含了相应设备的名称和描述。
取得网卡列表后就在屏幕上显示出来,如果网卡没有被发现就显示有关错误,pcap_findalldevs()同其他的libpcap函数一样有一个errbuf参数,当有异常情况发生时,这个参数会被pcap填充为某个特定错误字串。
程序功能示意如下:
获得网卡的信息后就可以按数据捕获的要求打开网卡。
但是大部分的包捕获程序都将混杂模式设为默认。
数据包的过滤通过设置数据流过滤规则来实现,数据包过滤处理时嗅探技术中的难点和重点,WinPcap提供了最强大的数据流过滤引擎。
它才用了一种高效的方法来捕获网络数据流的某些数据且常常和系统的捕获机制相集成。
过滤数据的函数定UDP的起始位置,就可以解析出原端口和目的端口。
数据包捕获流程图:
图4.1数据包捕获流程图
4.1嗅探器设计需要结构体
嗅探器需要的结构体是由IP数据报结构体、TCP报头结构体、UDP报头结构体组成。
每个结构体如何定义已在网络嗅探器的原理中具体讲过。
4.2过滤规则的主要代码
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==SOCKET_ERROR)
exit
(1);
gethostname(name,MAX_HOSTNAME_LAN);
pHostent=gethostbyname(name);
sa.sin_family=AF_INET;
sa.sin_port=htons(6000);
memcpy(&sa.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_length);
bind(sock,(SOCKADDR*)&sa,sizeof(sa));/*bind()设定自己主机的IP地址和端口号*/
if((WSAGetLastError())==10013)
exit
(1);
WSAIoctl(sock,SIO_RCVALL,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL);
pIpheader=(structipheader*)RecvBuf;
pTcpheader=(structtcpheader*)(RecvBuf+sizeof(structipheader));
pUdpheader=(structudphdr*)(RecvBuf+sizeof(structipheader));
while
(1){
memset(RecvBuf,0,sizeof(RecvBuf));
recv(sock,RecvBuf,sizeof(RecvBuf),0);
saSource.sin_addr.s_addr=pIpheader->ip_src;
strncpy(szSourceIP,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN);
saDest.sin_addr.s_addr=pIpheader->ip_dst;
strncpy(szDestIP,inet_ntoa(saDest.sin_addr),MAX_ADDR_LEN);
lentcp=(ntohs(pIpheader->ip_len)-(sizeof(structipheader)+sizeof(structtcpheader)));
lenudp=(ntohs(pIpheader->ip_len)-(sizeof(structipheader)+sizeof(structudphdr)));
4.3循环抓包
4.3.1TCP包
if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!
=0){
printf("*******************************************\n");
pCount++;
datatcp=(unsignedchar*)RecvBuf+sizeof(structipheader)+sizeof(structtcpheader);printf("-TCP-\n");
printf("\n目的IP地址:
%s\n",szDestIP);
printf("\n目的端口:
%i\n",ntohs(pTcpheader->dport));
printf("datatcpaddress->%x\n",datatcp);
printf("sizeofipheader->%i\n",sizeof(structipheader));
printf("sizeoftcpheader->%i\n",sizeof(structtcpheader));
printf("sizeoftheholepacket->%i\n",ntohs(pIpheader->ip_len));
printf("\ncharPacket%i[%i]=\"",pCount,lentcp-1);
for(i=0;iprintf("\\x%.2x",*(datatcp+i));
if(i%10==0)
printf("\"\n\"");}
printf("\";\n\n\n");
for(i=0;iif(*(datatcp+i)<=127&&*(datatcp+i)>=20)
printf("%c",*(datatcp+i));
else
printf(".");
}
printf("\n\n*******************************************\n");
}
运行后的结果:
图4.3.1TCP包运行结果
4.3.2UDP包
if((pIpheader->ip_p)==IPPROTO_UDP&&lentcp!
=0){
pCount++;
dataudp=(unsignedchar*)RecvBuf+sizeof(structipheader)+sizeof(structudphdr);
printf("-UDP-\n");
printf("\n目的IP地址:
%s\n",szDestIP);
printf("\n目的端口:
%d\n",ntohs(pTcpheader->dport));
printf("UDP数据地址:
%x\n",dataudp);
printf("IP头部长度:
%i\n",sizeof(structipheader));
printf("UDP头部长度:
%i\n",sizeof(structudphdr));
printf("包的大小:
%i\n",ntohs(pIpheader->ip_len));
printf("\ncharPacket%i[%i]=\"",pCount,lenudp-1);
for(i=0;iprintf("\\x%.2x",*(dataudp+i));
if(i%10==0)
printf("\"\n\"");
}
printf("\";\n\n\n");
for(i=0;iif(*(dataudp+i)<=127&&*(dataudp+i)>=20)
printf("%c",*(dataudp+i));
else
printf(".");
}
printf("\n\n*******************************************\n");
}
运行后的结果:
图4.3.2UDP包运行结果
5总结
通过这次课程设计,使我更加扎实的掌握了有关嗅探器方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的