Lshark程序设计报告Word下载.docx

上传人:b****4 文档编号:16897283 上传时间:2022-11-27 格式:DOCX 页数:15 大小:527.19KB
下载 相关 举报
Lshark程序设计报告Word下载.docx_第1页
第1页 / 共15页
Lshark程序设计报告Word下载.docx_第2页
第2页 / 共15页
Lshark程序设计报告Word下载.docx_第3页
第3页 / 共15页
Lshark程序设计报告Word下载.docx_第4页
第4页 / 共15页
Lshark程序设计报告Word下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Lshark程序设计报告Word下载.docx

《Lshark程序设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《Lshark程序设计报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。

Lshark程序设计报告Word下载.docx

随着计算机技术的发展,网络应用的普及,网络已成为生活中不可或缺的一部分,同时网络的安全性与可靠性也日益受到人们的广泛重视。

网络监听与故障排查技术对于网络安全至关重要,它是网络安全维护的一个基础技术但也是网络入侵的核心手段,它具有重大的研究意义。

目前,基于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得到工程主目录的绝对路径。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1