浅谈网络嗅探器tcpdump.docx
《浅谈网络嗅探器tcpdump.docx》由会员分享,可在线阅读,更多相关《浅谈网络嗅探器tcpdump.docx(57页珍藏版)》请在冰点文库上搜索。
![浅谈网络嗅探器tcpdump.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/0910fce8-2da4-4941-b398-830dadfec057/0910fce8-2da4-4941-b398-830dadfec0571.gif)
浅谈网络嗅探器tcpdump
兰州职业技术学院
(信息工程系)
毕业设计(论文)
课题浅谈入侵检测-tcpdump
所属教学单位电子与信息工程系
专业计算机网络技术
年级11A网络2班
学号20112044
姓名贾居宝
指导教师毛敬玉
2013年9月17日
兰州职业技术学院
(信息工程系)
毕业设计(论文)任务书
课题浅谈网络嗅探器-tcpdump
20XX年X月X日至20XX年X月X日共10周
专业计算机网络技术
年级11A网络2班
姓名贾居宝学号20112044
所属教学单位负责人(签字)
指导教师(签字)
年月日
课题
来
源
自拟课题
课
题
的
目
的
、
意
义
目的:
1.熟悉网络嗅探器,掌握网络嗅探器的功能。
2.了解网络嗅探器-Tcpdump的安装和使用。
3.分析网络嗅探器Tcpdump的抓包过程。
意义:
网络技术日新月异,发展突飞猛进。
随着计算机网络的广泛应用,其作用也越来越重要。
但是由于计算机系统中软、硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。
计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。
Internet的安全已经成为亟待解决的问题。
作为互联网上的系统管理员必备工具。
Tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的工具之一。
要
求
1.用户界面友好、简洁,易于操作;
2.实现抓取数据包的功能;
3.实现停止抓取数据包的功能;
4.实现过滤数据包的功能;
5.能显示数据包详细信息,并对数据包进行分析。
课
题
主
要
内
容
及
进
度
课题主要内容:
网络嗅探器的概念、网络嗅探器的工作原理;设计一个网络嗅探器,实现数据包的捕获、解析和显示。
毕业论文(设计)进度安排:
起讫日期工作内容备注
第一周到第四周收集资料确定技术路线,完成开题报告和文献综述
第五周到第十周系统规划、设计
第十一周到第十四周程序开发、调试
第十五周整理材料、撰写论文、系统验收
以上各项由指导教师填写(请用黑色中性笔填写,也可用计算机输入打印)。
摘要
本设计是关于网络嗅探器的设计与实现,功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。
以vc为开发平台,使用Linux环境下的网络数据包捕获开发库WinPcap认真学习和掌握网络嗅探器工作原理,设计出一个嗅探器,使其实现网络层抓包,并对获得包的源和目的地址、端口、协议等进行分析,实现简单的包嗅探器功能。
关键字:
tcpdump,sniffer抓包,winpcap,c++
目录
摘要I
目录II
第一章网络嗅探器的介绍1
1什么是网络嗅探器1
2网络嗅探器的作用1
3网络嗅探器的原理1
4网络嗅探器的设计4
第二章详细分析6
1嗅探器设计需要包含的头文件有:
6
2Ip数据报头的结构体:
6
3Tcp报头结构体:
6
4Udp报头结构体:
7
5变量:
7
6过滤规则:
8
7循环抓包:
8
8源代码:
11
第三章tcpdump简介16
第四章Linux下sniffer工具Tcpdump安装使用18
1Tcpdump的安装18
2Tcpdump的使用19
3Snoop与tcpdump比较22
第五章利用TcpDump分析网络安全23
1网络数据采集分析工具TcpDump分析23
2网络的数据显示/输入输出23
第六章Tcpdump文件格式和结构27
第七章tcpdump抓包分析TCP三次握手过程29
第八章TCPdump抓包及分析方法32
1抓包分析快进快退32
第九章自我总结Android系统手机端数据抓包过程34
第十章总结37
参考文献38
第一章网络嗅探器的介绍
1什么是网络嗅探器
随着网络发展的不断延续,网络应用日益复杂,以满足人们对信息的大量需求,但伴随而来的是,大量网络故障及网络病毒冲击着网络与终端用户,因此对于网络安全管理与网络日常的要求日益加重。
嗅探器(SnifferPro)有着至关重要的作用。
嗅探器是利用计算机网络接口截获所需网络内部数据报文的一种工具,它广泛地应用于流量分析、安全监控的实现中。
Sniffer主要被用来在网络上截获位于OSI协议模型中各个协议层次上的数据包,通过对截获数据包的分析,嗅探器可以掌握目标主机的信息。
嗅探器,可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。
简单一点解释:
一部电话的窃听装置,可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。
可是,计算机直接所传送的数据,事实上是大量的二进制数据。
因此,一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据,嗅探器也就必须能够识别出那个协议对应于这个数据片断,只有这样才能够进行正确的解码。
计算机的嗅探器比起电话窃听器,有他独特的优势:
很多的计算机网络采用的是“共享媒体"。
也就是说,你不必中断他的通讯,并且配置特别的线路,再安装嗅探器,你几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据。
我们称这种窃听方式为“基于混杂模式的嗅探”(promiscuousmode)。
尽管如此,这种“共享”的技术发展的很快,慢慢转向“交换”技术,这种技术会长期内会继续使用下去,它可以实现有目的选择的收发数据。
2网络嗅探器的作用
嗅探器是网络的抓包工具,可以对网络中大量数据抓取,从而方便使用者对网络中用户的一些信息进行分析,所以,通常被黑客运用于网络攻击。
我们如果也能掌握网络嗅探器的原理和设计,可以将它运用与网络故障检测、网络状况的监视,还可以加强企业信息安全防护。
3网络嗅探器的原理
嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。
但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。
而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。
显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。
具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(rawsocket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。
在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。
为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。
至此,实际就可以开始对网络数据包进行嗅探了,对数
据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。
但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。
通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。
由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。
下面先给出结构.数据包的总体结构:
数据包
IP头TCP头(或其他信息头)数据
数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。
其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:
16位16位
源端口目的端口
UDP长度UDP校验和
而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:
16位16位
源端口目的端口
顺序号
确认号
TCP头长(保留)7位URGACKPSHRSTSYNFIN窗口大小
校验和紧急指针
可选项(0或更多的32位字)
数据(可选项)
对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义:
typedefstruct_TCP{WORDSrcPort;//源端口
WORDDstPort;//目的端口
DWORDSeqNum;//顺序号
DWORDAckNum;//确认号
BYTEDataOff;//TCP头长
BYTEFlags;//标志(URG、ACK等)
WORDWindow;//窗口大小
WORDChksum;//校验和
WORDUrgPtr;//紧急指针
}TCP;
typedefTCP*LPTCP;
typedefTCPUNALIGNED*ULPTCP;
在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。
IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。
如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。
IP数据段头格式如下:
16位16位
版本IHL服务类型总长
标识标志分段偏移
生命期协议头校验和
源地址
目的地址
选项(0或更多)
同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义:
typedefstruct_IP{
union{BYTEVersion;//版本
BYTEHdrLen;//IHL
};
BYTEServiceType;//服务类型
WORDTotalLen;//总长
WORDID;//标识
union{WORDFlags;//标志
WORDFragOff;//分段偏移
};
BYTETimeToLive;//生命期
BYTEProtocol;//协议
WORDHdrChksum;//头校验和
DWORDSrcAddr;//源地址
DWORDDstAddr;//目的地址
BYTEOptions;//选项
}IP;
typedefIP*LPIP;
typedefIPUNALIGNED*ULPIP;
在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。
嗅探器的具体实现
根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。
由于前面已经将程序的设计流程讲述的比较清楚了,因此这里就不在赘述了,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。
主要代码实现清单为:
//检查Winsock版本号,WSAData为WSADATA结构对象
WSAStartup(MAKEWORD(2,2),&WSAData);
//创建原始套接字
sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW));
//设置IP头操作选项,其中flag设置为ture,亲自对IP头进行处理
setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));
//获取本机名
gethostname((char*)LocalName,sizeof(LocalName)-1);
//获取本地IP地址
pHost=gethostbyname((char*)LocalName));
//填充SOCKADDR_IN结构
addr_in.sin_addr=*(in_addr*)pHost->h_addr_list[0];//IP
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(57274);
//把原始套接字sock绑定到本地网卡地址上
bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
//dwValue为输入输出参数,为1时执行,0时取消
DWORDdwValue=1;
//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包。
其中SIO_RCVALL
//的定义为:
#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock,SIO_RCVALL,&dwValue);
前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以了。
4网络嗅探器的设计
在以太网中,信息是以明文的形式在网络上传输[2],当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可捕获任何一个在同一冲突域上传输的数据包。
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填充为某个特定错误字串。
程序功能示意如下:
#ineludepcap.h
voidmain()
{
Pcap_if_t*alldevs;:
//用于存储网卡信息
Charerrbuf[PCAP_ERRBuF_SIZE];//用于存储错误信息
if(pcap_findalldevs(&alldevs,errbuf)==-1)//这个API用来获得本机网卡列表
{
fprintf(stderr,ErrorinPcap_findalldevs:
%s\n,errbuf);
exit(l);
}
······
pcap_freealldevs(alldevs);//最后用pcap_freealldevs()释放内存资源
获得网卡的信息后就可以按数据捕获的要求打开网卡。
但是大部分的包捕获程序都将混杂模式设为默认。
数据包的过滤通过设置数据流过滤规则来实现,数据包过滤处理时嗅探技术中的难点和重点,WinPcap提供了最强大的数据流过滤引擎。
它才用了一种高效的方法来捕获网络数据流的某些数据且常常和系统的捕获机制相集成。
过滤数据的函数定UDP的起始位置,就可以解析出原端口和目的端口。
数据包捕获流程图如图1-1所示:
图1-1
第二章详细分析
1嗅探器设计需要包含的头文件有:
#include/*winsock2.h和windows.h是windowssocket的头文件,系统定义的*/
#include/*windows.h默认包含了winsock.h,并且他们的顺序不能颠倒,否则会出错*/
#include
#include
#include/*目录控制子程序,把相对路径名转换为绝对路径名*/
#pragmacomment(lib,"ws2_32.lib")/*链接API相关连的Ws2_32.lib静态库,lib制定注释类型*/
2Ip数据报头的结构体:
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(目的地址)*/
}/*totalipheaderlength:
20bytes(=160bits)*/
3Tcp报头结构体:
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;
4Udp报头结构体:
typedefstructudphdr{
unsignedshortsport;/*sourceport(源端口号)*/
unsignedshortdport;/*destinationport(目的端口号)*/
unsignedshortlen;/*udplength(udp长度)*/
unsignedshortcksum;/*udpchecksum(udp校验和)*/
}UDP_HDR;
5变量:
SOCKETsock;/*进行网络通信的套接字*/
SOCKETsocket(intaf,inttype,intprotocol);
应用程序调用socket函数来创建一个能够进行网络通信的套接字。
*第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;
第三个参数指定应用程序所使用的通信协议。
该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。
套接字描述符
是一个整数类型的值。
每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和
套接字数据结构的对应关系。
该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字
数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。
每个进程在自己的进程
空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
WSADATAwsd;
存储被WSAstartup函数调用后返回的Windowssockets数据,即存放windowssocket初始化信息
DWORDdwBytesRet;32bit的无符号整数
unsignedintoptval=1;
unsignedchar*dataudp,*datatcp;
inti,pCount=0,lentcp,lenudp;
SOCKADDR_INsa,saSource,saDest;用来指定ip地址