Lshark程序设计报告.docx

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

Lshark程序设计报告.docx

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

Lshark程序设计报告.docx

Lshark程序设计报告

Lshark程序设计报告

目录

1简介2

2WpCap开发包介绍2

2.1.获得网卡列表2

2.2.网卡捕获2

2.2.1打开设备2

2.2.2设置过滤3

2.2.3捕获数据3

2.3.得到捕获数据4

2.4.存储捕获数据4

3协议报文介绍和相关数据结构设计5

3.1以太帧5

3.2ARP报文6

3.3Ipv4报文7

3.4Ipv6报文8

3.5UDP报文9

3.6TCP报文9

4网络嗅探器的具体实现11

4.1功能介绍11

4.2显示网卡列表11

4.3设置过滤12

4.4捕获和停止捕获12

4.5存储捕获数据13

4.6动态过滤捕获数据13

4.7分析硬盘文件13

4.8数据详细分析13

4.9相关程序说明14

1实验简介

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

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

目前,基于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;

charerrbuf[PCAP_ERRBUF_SIZE];

if((adhandle=pcap_open_live(name,65536,1,1000,errbuf))==NULL)

{

打开设备错误;

}

此外Wpcap还提供一种离线文件的分析机制,即pcap_open_offline函数,它可以打开离线文件并映射到设备adhandle上,针对adhandle也可以做过滤和分析,函数使用方法如下,变量ofilename是文件路径,adhandle对应一个“虚拟设备”。

pcap_t*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;jcaplen;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;

u_charsrcmac[6];

ip_addresssipaddr;

u_chardesmac[6];

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;

u_shortcrc;

}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开发包函数得到网卡信息并显示,在此界面选择网卡用于捕获数据。

程序中通过一个全局变量来存储网卡列表信息,以便在主对话框中可以使用到选择的网卡。

该变量如下:

typedefvectorMyData;

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,&header,&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