协议分析器程序.docx

上传人:b****9 文档编号:25717209 上传时间:2023-06-11 格式:DOCX 页数:23 大小:268.99KB
下载 相关 举报
协议分析器程序.docx_第1页
第1页 / 共23页
协议分析器程序.docx_第2页
第2页 / 共23页
协议分析器程序.docx_第3页
第3页 / 共23页
协议分析器程序.docx_第4页
第4页 / 共23页
协议分析器程序.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

协议分析器程序.docx

《协议分析器程序.docx》由会员分享,可在线阅读,更多相关《协议分析器程序.docx(23页珍藏版)》请在冰豆网上搜索。

协议分析器程序.docx

协议分析器程序

网络安全编程课程设计

协议分析器的设计与实现

 

协议分析器的设计与实现

网络编程目的

目的与要求

1.目的:

协议分析器可以有效完成对网络上传输数据包的捕获,从而收集与分析网络信息,是网络流量监控和故障检测所必不可少的工具之一,对网络管理与网络安全具有重要的意义。

协议分析器的正当用途是分析网络流量,以便找出网络运行中潜在的问题。

例如,当网络中的某一网段运行情况不良,网络时常出现阻塞,报文发送缓慢,此时我们就可以使用协议分析器来作出精确的问题判断。

另一方面协议分析器也被称作网络嗅探器(sniffer),它同时有威胁网络安全的一面,如利用网络嗅探器窃取他人帐号、密码等敏感信息,因此也要注意防范其可能造成的危害。

本次编程训练的目的就是通过编程实现一个简单的协议分析器。

通过该课题的训练,读者对TCP/IP协议原理的理解、对网络管理与网络安全工具的设计与实现技术的提高会有很大地帮助,同时也可对网络嗅探器的实现机理有深入地了解。

(1)使学生进一步理解和掌握网络基本原理和基础知识,能够熟练掌握协议层次和各协议的工作原理;

(2)了解网络安全的基本需求,掌握常用对称密钥和公钥算法的运行原理,掌握认证和数字签名的基本方法;

(3)使学生掌握网络通讯和套接字编程的方法,可以通过编程实现网络计算机的通信和资源共享;

(4)可以使用典型的网络开发包实现网络的收包和发包;

(5)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。

2.要求

基本要求:

(1)理解基本工作原理和网络安全基本知识,具备数论基本演算能力;

(2)学生有自学参考书籍,查阅手册、图表和文献资料的能力;

(3)掌握简单软件的分析方法和设计方法,具备一定的编程能力;

(4)了解与课程有关的工程技术规范,能正确解释和分析实验结果;

(5)题目具有足够的工作量。

创新要求:

(6)在基本要求达到后,可进行创新设计,如良好的用户交互界面,充分利用面向对象知识,图形界面设计,新知识和技术的应用等。

相关知识

1.协议分析器基本原理

协议分析器是一种常用的数据收集方法,简单的说,它是在广播式网络环境下利用计算机网络接口截获目的地为其他计算机的数据报文的一种工具。

Ethernet是目前应用最广泛的计算机连网方式,它是基于总线结构,物理层是采用广播方式的。

当一台主机向另一台主机发送数据时,发送主机会将包含目的主机正确地址的数据帧发送到总线上,因此同一链路上所有活跃主机的网卡都能接收到该帧。

正常情况下,网卡收到传输来的数据帧后,会先检查帧头的目的地址字段,如果该地址不是本机的MAC地址,则丢弃不管,因此只有具有该地址的主机会接受这个数据帧。

但是,如果某个程序能够修改网卡的接收模式,使其成为“混杂(promiscuous)”模式,即一台主机可以接收网络上所有的数据帧而不理会帧头的目的地址,利用这一点,就可以实现协议分析器。

因此协议分析器就是一种能将本地网卡状态设成“混杂”模式并接收网络上所有数据帧的软件。

协议分析器工作在网络环境中的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。

2.TCP/IP分层体系结构

计算机网络实际上是按照不同的通信功能划分的层次结构系统,每一层的功能都由特定的协议来完成。

TCP/IP协议族是当前最流行也是最成功的是一套的网络协议栈,其结构自底向上分为4层,分别为主机-网络层、互联网层、传输层和应用层。

主机至网络层在TCP/IP中并没有做具体的规定。

通常情况下我们选择Ethernet网作为底层网络环境,并使用常用的5层网络体系结构即物理层、数据链路层、网络层、传输层和应用层作为分层标准,如图6-1所示。

在TCP/IP协议族的众多协议中,每种协议处理相应层所要求的网络功能,在图6-1中也给出了比较常见的网络协议及其所属的层次位置。

图16-1TCP/IP常见协议及所在层次位置

3.数据的封装与解析

图16-2数据的封装与解析

当应用程序通过IP网络传送数据时,数据被送入TCP/IP协议栈中,然后从上至下逐一通过每一层,直到最后被当作一串比特流送入网络。

其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),这个过程被称作封装。

通过以太网传输的比特流称作帧(frame)。

在传输的另一端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈由底向上逐层解析,去掉各层协议所加上的报文头部。

每层协议均要检查报文头部中的协议标识字段,以确定要接收数据的上层协议,最终从报文中解析出应用层数据后交给应用程序处理。

该封装与解析过程如图16-2所示。

本次要编写的协议分析器,就是从网络中捕获数据包并对其进行解析的过程。

因此,我们需要了解每层协议所规定的报文格式,然后由底向上逐层对数据包进行解码,最后将分析的结果显示出来。

编程训练设计分析

4.协议分析器总体结构

协议分析器的整体结构按功能应分为三个部分,自底向上分别是数据捕获模块、协议解析模块和用户显示模块,如图16-3所示。

其中用户显示模块由于灵活度比较大,既可以采用控制台方式输出,也可以使用Windows图形窗口界面的各种视图(如树形视图、列表视图、编辑视图或普通视图等)对解码结果进行显示,因此这里不做特殊要求,编程时由读者任意选择一种方式即可。

后面仅对数据捕获模块和协议解析模块的关键代码进行分析。

图16-3协议分析器整体结构图

5.数据捕获模块

数据捕获模块的主要功能是进行数据包的采集,这是整个系统的基础和数据来源。

程序使用Winpcap来捕获网络中原始数据包。

Winpcap是Win32环境下数据包捕获的开放代码函数库,它可以完成以下主要功能:

a)捕获网络中的原始数据包。

b)使用用户自定义规则对数据包进行过滤。

c)发送用户自己构造的数据包到网络中。

d)统计网络流量。

具体使用方法参见其官方说明文档:

http:

//www.winpcap.org/docs/docs_40/index.html。

使用Winpcap捕获数据包的算法一般分为以下几步:

(1)获取并列出当前网络设备列表。

(2)由用户选择并打开指定网卡。

(3)根据过滤规则设置过滤器。

(4)捕获数据包并进行解析处理。

参考流程图如图16-4所示。

图16-4数据包捕获流程图

下面给出各步骤的核心代码。

需要注意的是,为了使程序流程更加清晰,下面的代码片段中去除了错误检查等保护性代码,读者在自己编程时应注意添加。

1.获取并列出当前网络设备列表。

pcap_if_t*pAdaptersList=NULL;//网卡列表指针

charerrbuf[PCAP_ERRBUF_SIZE];//错误消息缓冲区

pcap_findalldevs(&pAdaptersList,errbuf);//获取本地网络设备列表

/*列出找到的网络设备*/

intiAdapterCount=0;

for(pcap_if_t*pAdapter=pAdaptersList;pAdapter!

=NULL;pAdapter=pAdapter->next)

{

iAdapterCount++;

if(pAdapter->description)//如果有描述则输出详细信息

……/*输出当前序号和描述信息(pAdapter->description)*/

else//否则输出网卡名

……/*输出当前序号和网卡名(pAdapter->name)*/

}

2.由用户选择并打开指定网卡。

/*有些主机中有多个网卡,所以要列出所有网卡,让用户选择合适的网卡来捕获数据包。

用户选择的网卡序号放在iAdapterSelected变量中*/

……

//跳到指定网卡

pAdapter=pAdaptersList;

for(inti=0;i

pAdapter=pAdapter->next;

//打开网卡,之前要先设置bPromiscMode,为1表示混杂模式,为0表示直接模式

pcap_t*hAdapterHandle;//网卡句柄

hAdapterHandle=pcap_open_live(pAdapter->name,//网络设备名称

65535,//允许截获数据包的最大长度

bPromiscMode,//混杂模式标志

300,//读取数据超时时间

errbuf);//错误信息缓冲区

3.根据过滤规则设置过滤器。

//pAdapter指向要设置的网卡,首先获取子网掩码

u_intuNetMask;

if(pAdapter->addresses)

uNetMask=((sockaddr_in*)(pAdapter->addresses->netmask))->sin_addr.s_addr;

else

uNetMask=0xffffff;//忽略子网掩码

charszFilterCode[1024];

……/*根据规则构造过滤表达式,并存放在szFilterCode缓冲区中*/

//编译过滤器

bpf_programfpCode;

if(pcap_compile(hAdapterHandle,&fpCode,szFilterCode,TRUE,uNetMask)<0)

{

TRACE("Unabletocompilethefilter.ErrorMsg%s",pcap_geterr(hAdapterHandle));

return;

}

//设置过滤器

pcap_setfilter(hAdapterHandle,&fpCode);

程序要求可以实现4种类型的过滤:

1)基于协议的过滤(包括ARP、IP、ICMP、TCP和UDP协议);2)基于MAC地址的过滤;3)基于IP地址的过滤;4)基于端口的过滤。

Winpcap的强大功能之一就是它的过滤器引擎,该功能用到了pcap_compile()和pcap_setfilter()两个函数。

其中前者将一个包含高级布尔表达式的过滤规则字符串转化为底层的字节代码,这种字节代码可以由Winpcap包驱动程序的过滤器引擎来解释并执行;后一个函数用于将一个编译好的过滤器规则同一个捕获会话联系起来,即该函数执行之后,过滤规则就将应用于指定的包捕获过程。

由此可以看出,设置过滤器最主要的工作在于如何根据规则构造过滤表达式。

下面就对过滤表达式语法进行一下简单介绍。

其中关键字或限定符用黑体字表示,应当代换的信息用斜体字表示。

1)表达式支持逻辑操作符,可使用关键字and,or,not对子表达式进行组合,同时支持使用小括号。

2)基于协议的过滤要使用协议限定符,协议限定符可以为ip,arp,rarp,tcp和udp等。

3)基于MAC地址的过滤要使用限定符ether(代表Ethernet网地址)。

当该MAC地址仅作为源地址时过滤表达式为ethersrcmac_addr,仅作为目的地址时表达式为etherdstmac_addr,既作为源地址又作为目的地址时表达式为etherhostmac_addr。

此外应注意mac_addr应遵循由冒号分隔的十六进制格式,如00:

E0:

4C:

E0:

38:

88,否则编译过滤器时会出错。

4)基于IP地址的过滤应使用限定符host(代表主机地址)。

当该IP地址仅作为源地址时过滤表达式为srchostip_addr,仅作为目的地址时表达式为dsthostip_addr,既作为源地址又作为目的地址时表达式为hostip_addr。

5)基于端口的过滤应使用限定符port。

例如仅接收80端口的数据报则表达式为port80。

下面给出一些具体的例子:

例1:

只捕获arp或icmp数据包

过滤表达式为:

arpor(ipandicmp),或者简写为:

arporicmp

例2:

捕获以192.168.1.23为源或目的地址的端口为80的tcp数据包

过滤表达式为:

(ipandtcp)and(host192.168.1.23)and(port80)

例3:

捕获主机192.168.1.23与192.168.1.28之间传递的所有udp数据包

过滤表达式为:

(ipandudp)and((srchost192.168.1.23anddsthost192.168.1.28)or

(dsthost192.168.1.23andsrchost192.168.1.28))

例4:

捕获从mac地址00-13-D3-A1-D2-F6到00-50-56-C0-00-01之间所有的arp包

过滤表达式为:

arpand(ethersrc00:

13:

D3:

A1:

D2:

F6andetherdst00:

50:

56:

C0:

00:

01)

4.捕获数据包。

可以使用pcap_next_ex()从网络接口中读取一个数据包,该函数第一个参数是接口句柄,后两个参数由函数返回,分别为数据包的相关信息(包括时间戳、读取数据包长度和包的实际长度)和数据包本身。

函数返回1表示正常接收一个数据包,返回0表示超时,-1表示发生错误。

每捕获到一个数据包,就调用PacketHandler()函数对数据包进行后续解析处理。

while((iResult=pcap_next_ex(hAdapterHandle,&pPktHdr,&pPktData))>=0)

{

//接收超时继续循环

if(iResult==0)continue;

//处理收到的数据包

PacketHandler();

}

6.协议解析模块

该模块的主要功能就是对捕获的数据包按照数据链路层(MAC)、网络层(IP、ARP/RARP)、传输层(TCP、UDP、ICMP)和应用层(HTTP等)的层次结构自底向上进行解析,最后将解析结果显示输出。

协议解析的过程如图16-5所示。

图16-5协议解析流程图

该模块在编码时要注意各协议报头多字节整型字段从网络字节序到主机字节序转换。

对于多字节的整型数据(如short、int、long等),由于不同计算机系统在内存中存放的方式不尽相同,将低序字节存储在起始地址的称为小端点机,如Pentium,否则称为大端点机。

在网络中数据的传输统一采用大端点方式,所以数据包头中表示长度或类型等的多字节数据字段应按需转换成本地主机的表示形式。

可以用函数ntohs()或ntohl()将双字节或四字节整型由网络字节序转换为主机字节序。

5.解析Ethernet帧。

Ethernet帧结构中,前导码、帧前定界符和帧校验和(CRC)三个字段均属于物理层内容,而我们使用的Winpcap抓包驱动程序工作在数据链路层,捕获的原始数据中不包含这些字段,因此只需解析目的地址、源地址、长度/类型和数据四个字段即可。

首先定义Mac头部数据结构。

注意所有的头部结构定义均不包含数据部分。

//MAC头部结构

typedefstruct

{

BYTEDesMacAddr[6];//目的地址

BYTESrcMacAddr[6];//源地址

WORDLengthOrType;//数据长度或类型

}MAC_HEADER;

//MAC帧类型定义

constu_shortMAC_TYPE_IP=0x0800;

constu_shortMAC_TYPE_ARP=0x0806;

constu_shortMAC_TYPE_RARP=0x8035;

下面给出通过MAC_HEADER解析MAC头各个字段的代码。

其中strItem是CString类型,用于描述协议分析信息,代码中省略了信息的输出。

pPkt是数据包缓冲区指针,iLen指出数据包的长度。

MAC_HEADER*pMacHdr=(MAC_HEADER*)pPkt;

//Mac目的地址

strItem.Format("Destinationaddress:

%02X:

%02X:

%02X:

%02X:

%02X:

%02X",

pMacHdr->DesMacAddr[0],

pMacHdr->DesMacAddr[1],

pMacHdr->DesMacAddr[2],

pMacHdr->DesMacAddr[3],

pMacHdr->DesMacAddr[4],

pMacHdr->DesMacAddr[5]);

//Mac源地址

strItem.Format("Sourceaddress:

%02X:

%02X:

%02X:

%02X:

%02X:

%02X",

pMacHdr->SrcMacAddr[0],

pMacHdr->SrcMacAddr[1],

pMacHdr->SrcMacAddr[2],

pMacHdr->SrcMacAddr[3],

pMacHdr->SrcMacAddr[4],

pMacHdr->SrcMacAddr[5]);

//类型/长度字段

if(ntohs(pMacHdr->LengthOrType)>1500) //类型字段(EthernetV2.0)

{

//根据类型字段调用相应的上层协议处理函数

if(ntohs(pMacHdr->LengthOrType)==MAC_TYPE_IP)//IP协议

{

strItem="IP";

ParseIPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),

iLen-sizeof(MAC_HEADER));

}

elseif(ntohs(pMacHdr->LengthOrType)==MAC_TYPE_ARP)//ARP协议

{

strItem="ARP";

ParseARPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),

iLen-sizeof(MAC_HEADER));

}

elseif(ntohs(pMacHdr->LengthOrType)==MAC_TYPE_RARP)//RARP协议

{

strItem="RARP";

ParseRARPPacket((BYTE*)pMacHdr+sizeof(MAC_HEADER),

iLen-sizeof(MAC_HEADER));

}

else//其他

strItem="UNKNOWN";

}

else//长度字段(IEEE802格式)

{

strItem.Format("Length:

%dbytes",ntohs(pMacHdr->LengthOrType));

……/*解析IEEE802数据帧,省略*/

}

对于Ethernet帧的封装,由于历史的原因,产生了两种不同的标准,一种是EthernetV2.0标准(定义在RFC894中),该标准定义源地址之后的字段是类型字段。

另一种是IEEE802标准(在RFC1042中定义),它将前述字段定义为长度字段。

由于EthernetV2.0标准规定的有效类型值均大于Ethernet网帧的数据最大长度1500,因此可以通过该值区分类型/长度字段的具体含义,即该数值大于1500表示类型字段,否则为长度字段。

这里只对EthernetV2.0封装格式进行了解析,因为这是最常见的封装格式,读者有兴趣可以自己完成对IEEE802格式数据帧的解析。

二者的不同封装格式如图16-6所示。

图16-6Ethernet网帧的EthernetV2.0和IEEE802封装格式

6.解析ARP数据包。

首先定义ARP头部数据结构:

//ARP头部结构

typedefstruct

{

u_shorthardware_type;//16位硬件类型

u_shortproto_type;//16位协议类型

u_charhardware_addr_len;//8位硬件地址长度

u_charproto_addr_len;//8位协议地址长度

u_shortoperation_code;//16位操作码

u_charsrc_mac_addr[6];//源Ethernet网地址

u_charscr_ip_addr[4];//源IP地址

u_chardest_mac_addr[6];//目的Ethernet网地址

u_chardest_ip_addr[4];//目的IP地址

}ARP_HEADER;

//ARP报文操作码类型,1为请求,2位应答

constu_shortARP_OP_REQUEST=1;//ARP请求

constu_shortARP_OP_REPLY=2;//ARP应答

接下来解析ARP数据包:

ARP_HEADER*pARPHdr=(ARP_HEADER*)pPkt;

ntohs(pARPHdr->hardware_type);//硬件类型

ntohs(pARPHdr->proto_type);//上层协议类型

pARPHdr->hardware_addr_len;//硬件地址长度

pARPHdr->proto_addr_len;//协议地址长度

//操作类型

if(ntohs(pARPHdr->operation_code)==ARP_OP_REQUEST)

strItem="(Request)";

elseif(ntohs(pARPHdr->operation_code)==ARP_OP_REPLY)

strItem="(Reply)";

//源Mac地址

strItem.Format("Sender'shardwareaddress:

%02X:

%02X:

%02X:

%02X:

%02X:

%02X",

pARPHdr->src_mac_addr[0],

pARPHdr->src_mac_addr[1],

pARPHdr->src_mac_addr[2],

pARPHdr->src_mac_addr[3],

pARPHdr->src_mac_addr[4],

pARPHdr->src_mac_addr[5]);

//源IP地址

in_addripAddr;

memcpy(&ipAddr,pARPHdr->scr_ip_addr,sizeof(in_addr));

inet_ntoa(ipAddr);//转化为点分十进制字符串

//目的Mac地址

strItem.Format("Target'shardwareaddress:

%02X:

%02X:

%02X:

%02X:

%02X:

%02X",

pARPHdr->dest_mac_addr[0],

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

当前位置:首页 > PPT模板

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

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