Lshark程序设计报告Word下载.docx
《Lshark程序设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《Lshark程序设计报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
随着计算机技术的发展,网络应用的普及,网络已成为生活中不可或缺的一部分,同时网络的安全性与可靠性也日益受到人们的广泛重视。
网络监听与故障排查技术对于网络安全至关重要,它是网络安全维护的一个基础技术但也是网络入侵的核心手段,它具有重大的研究意义。
目前,基于Winpcap(Libpcap)的网络数据包的捕获和分析技术发展十分迅速,网络监听工具不断面世,其中最具代表性的是Wireshark和Sniffer。
本实验分析了部分网络协议报文的结构,研究了Winpcap开发包,并引用Winpcap开发包,采用VisualStudio6.0做为开发环境,用MFC对话框程序开发了一个简易的网络协议分析工具,希望对于研究学习网络协议有益。
在开发初期,采用vc6.0英文版作为首要开发环境。
鉴于VC6.0和InstallShield对中言文支持不好,后期程序打包迁移至VS2005,由VS2005打包制作成安装文件。
本程序由安徽师范大学数学计算机科学学院08计算机(师范)1班L组成员共同完成。
程序界面和功能仿WireShark,功能还不完善,且程序运行过程中会出现小小的bug,这些都是今后要改进的地方。
由于本组成员姓氏均为李、刘,故本程序取名为Lshark。
2WpCap开发包介绍
2.1.获得网卡列表
pcap_findalldevs函数用来得到监听主机网卡列表,得到的设备信息存储在一个pcap_if_t类型的指针变量中,其中name属性将作为设备接口参数传递给捕获函数,可以利用以下代码得到网卡列表。
pcap_if_t*alldevs,*d;
charerrbuf[PCAP_ERRBUF_SIZE];
if(pcap_findalldevs(&
alldevs,errbuf)==-1)return;
for(d=alldevs;
d;
d=d->
next)
{
name=d->
name;
description=d->
description;
}
2.2.网卡捕获
网卡捕获数据包括这几个过程:
打开设备,设置过滤条件,捕获数据。
2.2.1打开设备
使用pcap_open_live函数可以打开网卡设备,该函数需要网卡的name参数,并且网卡设为混杂模式才能接受一切流经网卡的数据帧。
pcap_open_live函数的第3个参数设置为1时即完成网卡混杂模式的设置。
pcap_t*adhandle;
if((adhandle=pcap_open_live(name,65536,1,1000,errbuf))==NULL)
打开设备错误;
此外Wpcap还提供一种离线文件的分析机制,即pcap_open_offline函数,它可以打开离线文件并映射到设备adhandle上,针对adhandle也可以做过滤和分析,函数使用方法如下,变量ofilename是文件路径,adhandle对应一个“虚拟设备”。
char*ofilename;
if((fp=pcap_open_offline(ofilename,errbuf))==NULL)
}
2.2.2设置过滤
过滤条件是通过pcap_compile函数和pcap_setfilter来完成的,前者判断过滤条件语句是否正确,后者设置过滤条件。
u_intnetmask;
structbpf_programfcode;
char*packet_filter;
//过滤语句
if(pcap_compile(adhandle,&
fcode,packet_filter,1,netmask)<
0)
过滤语句出错;
if(pcap_setfilter(adhandle,&
fcode)<
0)
过滤设置错误;
2.2.3捕获数据
打开设备,成功设置过滤条件后即可开始捕获数据,捕获数据可以通过两种方式实现。
第一种是通过pcap_loop函数和packet_handler函数来实现数据的捕获和分析,
pcap_loop(adhandle,0,packet_handler,NULL)
其中packet_handler函数是一个自定义的函数,但它的参数基本如下:
packet_handler(u_char*param,conststructpcap_pkthdr*header,constu_char*pkt_data)
pcap_loop会不断调用packet_handler函数直至捕获结束,在packet_handler函数中可以通过header和pkt_data两个变量来获得捕获的数据。
第二种是通过pcap_next_ex函数来实现的,可以利用如下循环不断捕获数
据,可以通过header和pkt_data两个变量来获得捕获的数据。
while((res=pcap_next_ex(adhandle,&
header,&
pkt_data))>
=0)
if(res==0)
continue;
2.3.得到捕获数据
在捕获数据的函数中,可以通过header和pkt_data两个变量来得到所捕获的数据。
Header是一个structpcap_pkthdr类型的变量,它的caplen属性表示该数据报的长度,pkt_data是一个指向u_char类型数据的指针,表示它指向的是捕获的数据。
通过以下代码即可得到某个数据报的数据信息,通过分析这些二进制数据即能分析对应的协议信息。
for(j=0;
j<
header->
caplen;
j++)pkt_data[j];
2.4.存储捕获数据
可以通过pcap_dump函数将捕获的数据存储到文件中,其中ofilename是文件的路径。
pcap_dumper_t*dumpfile;
char*ofilename;
dumpfile=pcap_dump_open(adhandle,ofilename);
pcap_dump((unsignedchar*)umpfile,header,pkt_data);
3协议报文介绍和相关数据结构设计
以太网数据是一层一层封装后再在网络传输的,其封装过程如下:
图3.1以太网数据封装过程
本嗅探器分析了ip,arp,udp,tcp报文以及以太数据帧首部。
3.1以太帧
图3.2以太帧格式
以太首部占14个字节,其中源地址和目的地址均占6个字节,类型表示上层协议的类型,占2个字节,该字段值为0800H表示Ipv4,86ddH表示Ipv6,0806H表示ARP,8035H表示RARP。
根据这些特点设计如下结构体表示以太帧首部(u_char和u_short均是无符号数,分别占8位和16位)。
typedefstructframe_header{
u_chardesmac[6];
u_charsrcmac[6];
u_shortframetype;
}frame_header;
3.2ARP报文
图3.3ARP报文格式
ARP报文共占28个字节。
硬件类型指明了发送方想知道的硬件接口类型,以太网的值为1;
协议类型指明了发送方提供的高层协议类型,IP为0800H。
op字段指的是这个arp报文是请求包还是应答包,请求包对应的值是1,应答包对应的值是2(十进制)。
根据这些特点设计如下结构体表示arp报文。
Typedefstructarp_header{
u_shorthardw_type;
u_shortproto_type;
u_charhardw_size;
u_charproto_size;
u_shortop;
ip_addresssipaddr;
ip_addressdipaddr;
}arp_header;
typedefstructip_address
u_charbyte1;
u_charbyte2;
u_charbyte3;
u_charbyte4;
}ip_address;
3.3Ipv4报文
图3.4IP报文格式
版本字段占4位,表示IP协议的版本,值为4表示ipv4,6表示ipv6。
首部长度字段占4位,可表示最大十进制数是15,这个字段所表示数的单位是32位字(4字节),它表示该ip数据报首部的长度,最常用的首部长度是20。
总长度指首部和数据的长度,单位为(字节)。
占16位,即此数据报最大长度是2^16-1=65535字节。
协议占8位,指出此ip数据报携带的数据是使用何种协议,以便使目的主机的ip层知道应将数据部分上交给哪个处理过程。
根据这些特点设计如下结构体表示ipv4报文,要得到报文中具体的字段可以通过数据移位或者与运算得到。
typedefstructip_header
u_charver_ihl;
u_chartos;
u_shorttlen;
u_shortidentification;
u_shortflags_fo;
u_charttl;
u_charproto;
u_shortcrc;
ip_addresssaddr;
ip_addressdaddr;
u_intop_pad;
}ip_header;
3.4Ipv6报文
图3.5Ipv6报文格式
Version字段的长度是4位,它指明了协议版本号。
PayloadLength表明了有效载荷长度,这个字段的值并未算上IPv6的40位报头,计算的只是报头后面的扩展和数据部分的长度。
NextHeader字段表明了传输层报头或扩展部分是否跟在IPv6报头后面,值为11H时表示上层协议是udp,值为06H时表示上层协议时tcp。
SourceAddress指明了始发主机的起始地址,其长度为128位。
DestinationAddress指明了传输信号的目标地址,其长度为128位。
typedefstructipv6_header
u_int32_tver4_tc8_fl20;
u_shortpl_len;
u_charnext_header;
u_charhop_limit;
ipv6_addresssaddr;
ipv6_addressdaddr;
}ipv6_header;
typedefstructipv6_address
u_shorttwobyte1;
u_shorttwobyte2;
u_shorttwobyte3;
u_shorttwobyte4;
u_shorttwobyte5;
u_shorttwobyte6;
u_shorttwobyte7;
u_shorttwobyte8;
}ipv6_address;
3.5UDP报文
UDP报文格式
UDP报文首部长度共占8个字节,其中长度字段表示udp报文的长度,它等于UDP首部长度加上UDP数据部分长度,最小值是8,即8字节。
设计如下结构体表示UDP报文。
typedefstructudp_header
u_shortsport;
u_shortdport;
u_shortlen;
}udp_header;
3.6TCP报文
TCP报文格式
TCP报文一般占20字节。
序号共占4字节,共有[0-2^32-1]这2^32个序号,当序号增加到最大后,下一个序号又回到0。
Tcp传送的每一个字节都按顺序编号。
整个要传送的字节流的起始序号在建立连接时设置。
tcp首部中的该字段是指本报文段所发送的数据的第一个字节的序号。
确认号共占4字节,表示期望收到对方下一个报文段的第一个数据字节的序号。
数据偏移(TCP头长)占4位,指Tcp报文段的数据部分起始处距离Tcp报文段的起始处有多远。
这个字段实际上是指出Tcp报文段的首部长度,但由于首部中还有长度不确定的选项字段,因此此字段有必要。
但注意它表示的数的单位是32位字(4字节),最大可表示十进制数是15,即表示最大15*4=60字节,即Tcp首部的最大长度。
控制位占6位,表示6种性质的报文。
设计如下结构体表示TCP报文。
typedefstructtcp_header
{
_shortsport;
_shortdport;
_int32_tseq_num;
_int32_tack_num;
_shortoffset4_reserved6_control6;
_shortwindows;
_shortchecksum;
_shorturgent_pointer;
}tcp_header;
4网络嗅探器的具体实现
4.1功能介绍
该网络嗅探器主要包括这些功能:
显示网卡列表,设置过滤条件,捕获,停止捕获,存储捕获数据,过滤捕获的数据,分析硬盘中的数据文件。
4.2显示网卡列表
调用wpcap开发包函数得到网卡信息并显示,在此界面选择网卡用于捕获数据。
程序中通过一个全局变量来存储网卡列表信息,以便在主对话框中可以使用到选择的网卡。
该变量如下:
typedefvector<
pcap_if_t*>
MyData;
MyDatainter_list;
4.3设置过滤
可以自定义过滤条件,这些过滤语句存储在FilterFile.txt文件当中,删除时即删除文件中对应的行,增加过滤条件时即向文件中添加行。
选择过滤条件,单击OK按钮后将设置好网卡捕获的过滤条件。
选择好条件后这个过滤条件将会存储在一个全局变量中,以在主对话框中捕获数据时使用。
4.4捕获和停止捕获
菜单capture下的start,stop以及工具栏中的start,stop按钮控制数据的捕获和停止。
捕获数据是开启一个捕获线程,停止捕获是停止这个捕获线程。
该线程函数中调用了wpcap的对应方法来完成数据捕获。
UINTCapture_Thread_Function(LPVOIDpParam)
{
pcap_open_live打开设备;
pcap_setfilter设置过滤;
pcap_loop(adhandle,0,packet_handler,NULL)捕获数据;
packet_handler函数处理一个数据报
利用header,pkt_data变量读取数据;
pcap_dump函数存储数据到文件;
显示数据列表;
4.5存储捕获数据
在开启线程,捕获数据将其显示的同时,程序中调用了wpcap自身的文件存储函数pcap_dump将捕获的数据存储到一个名为TempFile.pcap的文件中。
当捕获完毕时捕获而得的文件存储在该文件中。
4.6动态过滤捕获数据
开启捕获数据线程之前可以通过filters来设置网卡捕获的过滤条件,同样在分析捕获后的数据时也可以设置过滤条件,不过过滤的是文件TempFile.pcap中的数据。
此时只需调用wpcap提供的pcap_open_offline函数打开TempFile.pcap文件,并设置过滤条件,过滤数据。
过滤流程如下:
pcap_open_offlin打开文件TempFile.pcap;
pcap_setfilter设置过滤;
pcap_next_ex(adhandle,&
pkt_data))显示数据。
4.4动态过滤
4.7分析硬盘文件
同样,利用pcap_open_offline函数打开本地文件,获得数据后即可以作分析。
4.8数据详细分析
所有数据分析均是针对header,pkt_data两个变量。
Header变量指明了数据报长度,pkt_data指向数据报的数据。
利用以下语句就能得到各协议的报头指针,从而可以得到报头信息,再根据各协议报头格式可以从中分析得到有用的信息。
frame_header*fh;
ip_header*ih;
arp_header*ah;
udp_header*uh;
tcp_header*th;
fh=(frame_header*)pkt_data;
ih=(ip_header*)(pkt_data+14);
ip_len=(ih->
ver_ihl&
0xf)*4;
ah=(arp_header*)(pkt_data+14);
uh=(udp_header*)((u_char*)ih+ip_len);
th=(tcp_header*)((u_char*)ih+ip_len);
在读取数据时注意需要将网络字节顺序转化为本地字节顺序,程序中的ntohs()函数即完成此功能。
4.9相关程序说明
Capture_Thread_Function捕获线程函数;
packet_handler包处理函数,被线程函数中的pcap_loop循环调用;
show_packet_info捕获信息显示,被packet_handler调用,显示信息列表;
show_detail_info单击列表中某行时调用此函数显示报文的详细信息;
Offline_Filter捕获数据过滤函数,在单击主界面应用过滤按钮时被调用;
File_save_as文件另存为函数,将捕获的文件另存到其它地方;
Get_Project_Path得到工程主目录的绝对路径。