当前位置:文档之家› 协议分析器程序

协议分析器程序

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

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

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

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

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

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

编程训练要求1.本次编程训练要求实现一个协议分析器。

该协议分析器将包含以下几部分功能:1)数据采集——实时捕捉Ethernet网数据包;说明:数据采集功能需提供两种模式——直接模式和混杂模式,直接模式只用于捕获目的地为本机的数据;混杂模式则可捕获流经Ethernet网络的所有数据包。

2)解析Ethernet网数据帧头部的全部信息;3)实现基于MAC地址和帧头部类型字段的数据包过滤;说明:基于MAC地址的数据过滤主要满足用户获取和分析特定MAC地址的主机通信数据的要求。

例如,如果用户只对网内MAC地址为01-25-d3-a4-88-98主机的通信信息感兴趣,那么通过这个功能,用户就可以将与这个主机无关的数据剔除,使数据的捕获更加有针对性,方便数据分析的进行。

对帧头部类型字段的数据过滤主要用于区分载荷是IP报文还是ARP或RARP报文。

4)解析IP数据包的头部信息;说明:需要解析的字段主要包括:版本,头部长度,服务类型,总长,TTL,上层协议,源IP,目的IP等。

5)实现基于IP地址和IP头协议的数据过滤;说明:这个过滤主要是基于IP地址(源地址或者目的地址),以及IP头部的上层协议字段(比如要求只捕获ICMP数据包等);6)对ICMP报文要求至少解析ICMP回显请求、回显应答、超时及目的不可达四种消息报文;7)解析传输层TCP、UDP协议头部信息;8)实现基于端口的数据包过滤;9)实现应用层HTTP协议头部分析。

上述9个方面的功能组装起来就是一个简单的网络协议分析器,它包含了数据采集、协议分析和数据过滤等功能。

2.熟悉Winpcap编程。

程序要求在Windows环境下运行,使用Winpcap完成抓包过程。

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

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

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

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

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

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

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

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

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

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

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

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

图16-1 TCP/IP 常见协议及所在层次位置3. 数据的封装与解析图16-2 数据的封装与解析当应用程序通过IP 网络传送数据时,数据被送入TCP/IP 协议栈中,然后从上至下逐一通过每一层,直到最后被当作一串比特流送入网络。

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

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

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

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

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

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

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

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

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

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

图16-3 协议分析器整体结构图2.数据捕获模块数据捕获模块的主要功能是进行数据包的采集,这是整个系统的基础和数据来源。

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

Winpcap是Win32环境下数据包捕获的开放代码函数库,它可以完成以下主要功能:a)捕获网络中的原始数据包。

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

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

d)统计网络流量。

具体使用方法参见其官方说明文档:/docs/docs_40/index.html。

使用Winpcap捕获数据包的算法一般分为以下几步:(1)获取并列出当前网络设备列表。

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

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

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

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

图16-4 数据包捕获流程图下面给出各步骤的核心代码。

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

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

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

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

程序要求可以实现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地址仅作为源地址时过滤表达式为ether src mac_addr,仅作为目的地址时表达式为ether dst mac_addr,既作为源地址又作为目的地址时表达式为ether host mac_addr。

此外应注意mac_addr应遵循由冒号分隔的十六进制格式,如00:E0:4C:E0:38:88,否则编译过滤器时会出错。

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

当该IP地址仅作为源地址时过滤表达式为src host ip_addr,仅作为目的地址时表达式为dst host ip_addr,既作为源地址又作为目的地址时表达式为host ip_addr。

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

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

下面给出一些具体的例子:4.捕获数据包。

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

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

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

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

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

图16-5 协议解析流程图该模块在编码时要注意各协议报头多字节整型字段从网络字节序到主机字节序转换。

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

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

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

1.解析Ethernet帧。

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

相关主题