1、协议分析器程序网络安全编程课程设计协议分析器的设计与实现 协议分析器的设计与实现网络编程目的目的与要求1. 目的:协议分析器可以有效完成对网络上传输数据包的捕获,从而收集与分析网络信息,是网络流量监控和故障检测所必不可少的工具之一,对网络管理与网络安全具有重要的意义。协议分析器的正当用途是分析网络流量,以便找出网络运行中潜在的问题。例如,当网络中的某一网段运行情况不良,网络时常出现阻塞,报文发送缓慢,此时我们就可以使用协议分析器来作出精确的问题判断。另一方面协议分析器也被称作网络嗅探器(sniffer),它同时有威胁网络安全的一面,如利用网络嗅探器窃取他人帐号、密码等敏感信息,因此也要注意防范
2、其可能造成的危害。本次编程训练的目的就是通过编程实现一个简单的协议分析器。通过该课题的训练,读者对TCP/IP协议原理的理解、对网络管理与网络安全工具的设计与实现技术的提高会有很大地帮助,同时也可对网络嗅探器的实现机理有深入地了解。(1) 使学生进一步理解和掌握网络基本原理和基础知识,能够熟练掌握协议层次和各协议的工作原理;(2) 了解网络安全的基本需求,掌握常用对称密钥和公钥算法的运行原理,掌握认证和数字签名的基本方法;(3) 使学生掌握网络通讯和套接字编程的方法,可以通过编程实现网络计算机的通信和资源共享;(4) 可以使用典型的网络开发包实现网络的收包和发包;(5) 使学生掌握使用各种计算
3、机资料和有关参考资料,提高学生进行程序设计的基本能力。2. 要求 基本要求:(1) 理解基本工作原理和网络安全基本知识,具备数论基本演算能力;(2) 学生有自学参考书籍,查阅手册、图表和文献资料的能力;(3) 掌握简单软件的分析方法和设计方法,具备一定的编程能力;(4) 了解与课程有关的工程技术规范,能正确解释和分析实验结果;(5) 题目具有足够的工作量。创新要求:(6) 在基本要求达到后,可进行创新设计,如良好的用户交互界面,充分利用面向对象知识,图形界面设计,新知识和技术的应用等。 相关知识1. 协议分析器基本原理协议分析器是一种常用的数据收集方法,简单的说,它是在广播式网络环境下利用计算
4、机网络接口截获目的地为其他计算机的数据报文的一种工具。Ethernet是目前应用最广泛的计算机连网方式,它是基于总线结构,物理层是采用广播方式的。当一台主机向另一台主机发送数据时,发送主机会将包含目的主机正确地址的数据帧发送到总线上,因此同一链路上所有活跃主机的网卡都能接收到该帧。正常情况下,网卡收到传输来的数据帧后,会先检查帧头的目的地址字段,如果该地址不是本机的MAC地址,则丢弃不管,因此只有具有该地址的主机会接受这个数据帧。但是,如果某个程序能够修改网卡的接收模式,使其成为“混杂(promiscuous)”模式,即一台主机可以接收网络上所有的数据帧而不理会帧头的目的地址,利用这一点,就可
5、以实现协议分析器。因此协议分析器就是一种能将本地网卡状态设成“混杂”模式并接收网络上所有数据帧的软件。协议分析器工作在网络环境中的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。2. TCP/IP分层体系结构计算机网络实际上是按照不同的通信功能划分的层次结构系统,每一层的功能都由特定的协议来完成。TCP/IP协议族是当前最流行也是最成功的是一套的网络协议栈,其结构自底向上分为4层,分别为主机-网络层、互联网层、传输层和应用层。主机至网络层在TCP/IP中并没有做具体的规定。通常情况下我们选择Ethernet网作为底层网络
6、环境,并使用常用的5层网络体系结构即物理层、数据链路层、网络层、传输层和应用层作为分层标准,如图6-1所示。在TCP/IP协议族的众多协议中,每种协议处理相应层所要求的网络功能,在图6-1中也给出了比较常见的网络协议及其所属的层次位置。图16-1 TCP/IP常见协议及所在层次位置3. 数据的封装与解析图16-2 数据的封装与解析当应用程序通过IP网络传送数据时,数据被送入TCP/IP协议栈中,然后从上至下逐一通过每一层,直到最后被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),这个过程被称作封装。通过以太网传输的比特流称作帧(frame)。在传输的
7、另一端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈由底向上逐层解析,去掉各层协议所加上的报文头部。每层协议均要检查报文头部中的协议标识字段,以确定要接收数据的上层协议,最终从报文中解析出应用层数据后交给应用程序处理。该封装与解析过程如图16-2所示。本次要编写的协议分析器,就是从网络中捕获数据包并对其进行解析的过程。因此,我们需要了解每层协议所规定的报文格式,然后由底向上逐层对数据包进行解码,最后将分析的结果显示出来。编程训练设计分析4. 协议分析器总体结构协议分析器的整体结构按功能应分为三个部分,自底向上分别是数据捕获模块、协议解析模块和用户显示模块,如图16-3所示。其中用户显示
8、模块由于灵活度比较大,既可以采用控制台方式输出,也可以使用Windows图形窗口界面的各种视图(如树形视图、列表视图、编辑视图或普通视图等)对解码结果进行显示,因此这里不做特殊要求,编程时由读者任意选择一种方式即可。后面仅对数据捕获模块和协议解析模块的关键代码进行分析。图16-3 协议分析器整体结构图5. 数据捕获模块数据捕获模块的主要功能是进行数据包的采集,这是整个系统的基础和数据来源。程序使用Winpcap来捕获网络中原始数据包。Winpcap是Win32环境下数据包捕获的开放代码函数库,它可以完成以下主要功能:a)捕获网络中的原始数据包。b)使用用户自定义规则对数据包进行过滤。c)发送用
9、户自己构造的数据包到网络中。d)统计网络流量。具体使用方法参见其官方说明文档:http:/www.winpcap.org/docs/docs_40/index.html。使用Winpcap捕获数据包的算法一般分为以下几步:(1) 获取并列出当前网络设备列表。(2) 由用户选择并打开指定网卡。(3) 根据过滤规则设置过滤器。(4) 捕获数据包并进行解析处理。参考流程图如图16-4所示。图16-4 数据包捕获流程图下面给出各步骤的核心代码。需要注意的是,为了使程序流程更加清晰,下面的代码片段中去除了错误检查等保护性代码,读者在自己编程时应注意添加。1. 获取并列出当前网络设备列表。pcap_if_
10、t* pAdaptersList = NULL; /网卡列表指针char errbufPCAP_ERRBUF_SIZE; /错误消息缓冲区pcap_findalldevs(&pAdaptersList, errbuf); /获取本地网络设备列表/*列出找到的网络设备*/ int iAdapterCount = 0; for (pcap_if_t* pAdapter= pAdaptersList; pAdapter!=NULL; pAdapter=pAdapter-next) iAdapterCount+; if (pAdapter-description) /如果有描述则输出详细信息 /*输出
11、当前序号和描述信息(pAdapter-description)*/ else /否则输出网卡名 /*输出当前序号和网卡名(pAdapter-name)*/ 2. 由用户选择并打开指定网卡。/*有些主机中有多个网卡,所以要列出所有网卡,让用户选择合适的网卡来捕获数据包。 用户选择的网卡序号放在iAdapterSelected变量中*/跳到指定网卡pAdapter = pAdaptersList;for (int i=0; inext;/打开网卡,之前要先设置bPromiscMode,为1表示混杂模式,为0表示直接模式pcap_t* hAdapterHandle; /网卡句柄hAdapterHan
12、dle = pcap_open_live(pAdapter-name, /网络设备名称65535, /允许截获数据包的最大长度bPromiscMode, /混杂模式标志300, /读取数据超时时间errbuf); /错误信息缓冲区3. 根据过滤规则设置过滤器。/ pAdapter指向要设置的网卡,首先获取子网掩码u_int uNetMask;if (pAdapter-addresses)uNetMask = (sockaddr_in*)(pAdapter-addresses-netmask)-sin_addr.s_addr;elseuNetMask = 0xffffff; /忽略子网掩码cha
13、r szFilterCode1024; /*根据规则构造过滤表达式,并存放在szFilterCode缓冲区中*/编译过滤器bpf_program fpCode;if (pcap_compile(hAdapterHandle, &fpCode, szFilterCode, TRUE, uNetMask) = 0) /接收超时继续循环 if (iResult = 0) continue; /处理收到的数据包 PacketHandler(); 6. 协议解析模块该模块的主要功能就是对捕获的数据包按照数据链路层(MAC)、网络层(IP、ARP/RARP)、传输层(TCP、UDP、ICMP)和应用层(H
14、TTP等)的层次结构自底向上进行解析,最后将解析结果显示输出。协议解析的过程如图16-5所示。图16-5 协议解析流程图该模块在编码时要注意各协议报头多字节整型字段从网络字节序到主机字节序转换。对于多字节的整型数据(如short、int、long等),由于不同计算机系统在内存中存放的方式不尽相同,将低序字节存储在起始地址的称为小端点机,如Pentium,否则称为大端点机。在网络中数据的传输统一采用大端点方式,所以数据包头中表示长度或类型等的多字节数据字段应按需转换成本地主机的表示形式。可以用函数ntohs()或ntohl()将双字节或四字节整型由网络字节序转换为主机字节序。5. 解析Ether
15、net帧。Ethernet帧结构中,前导码、帧前定界符和帧校验和(CRC)三个字段均属于物理层内容,而我们使用的Winpcap抓包驱动程序工作在数据链路层,捕获的原始数据中不包含这些字段,因此只需解析目的地址、源地址、长度/类型和数据四个字段即可。首先定义Mac头部数据结构。注意所有的头部结构定义均不包含数据部分。/MAC头部结构typedef structBYTE DesMacAddr6; /目的地址 BYTE SrcMacAddr6; /源地址 WORD LengthOrType; /数据长度或类型 MAC_HEADER;/MAC帧类型定义const u_short MAC_TYPE_IP
16、 = 0x0800;const u_short MAC_TYPE_ARP = 0x0806;const u_short MAC_TYPE_RARP = 0x8035;下面给出通过MAC_HEADER解析MAC头各个字段的代码。其中strItem是CString类型,用于描述协议分析信息,代码中省略了信息的输出。pPkt是数据包缓冲区指针,iLen指出数据包的长度。MAC_HEADER* pMacHdr = (MAC_HEADER*) pPkt;/ Mac目的地址strItem.Format(Destination address: %02X:%02X:%02X:%02X:%02X:%02X,
17、pMacHdr-DesMacAddr0, pMacHdr-DesMacAddr1, pMacHdr-DesMacAddr2, pMacHdr-DesMacAddr3, pMacHdr-DesMacAddr4, pMacHdr-DesMacAddr5);/ Mac源地址strItem.Format(Source address: %02X:%02X:%02X:%02X:%02X:%02X, pMacHdr-SrcMacAddr0, pMacHdr-SrcMacAddr1, pMacHdr-SrcMacAddr2, pMacHdr-SrcMacAddr3, pMacHdr-SrcMacAddr4,
18、 pMacHdr-SrcMacAddr5);/类型/长度字段if (ntohs(pMacHdr-LengthOrType) 1500)/类型字段(Ethernet V2.0) /根据类型字段调用相应的上层协议处理函数 if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_IP) /IP协议 strItem = IP; ParseIPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), iLen-sizeof(MAC_HEADER); else if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_ARP
19、) /ARP协议 strItem = ARP; ParseARPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), iLen-sizeof(MAC_HEADER); else if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_RARP) /RARP协议 strItem = RARP; ParseRARPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), iLen-sizeof(MAC_HEADER); else /其他 strItem = UNKNOWN;else /长度字段(IEEE802格式)
20、strItem.Format(Length: %d bytes, ntohs(pMacHdr-LengthOrType); /*解析IEEE802数据帧,省略*/对于Ethernet帧的封装,由于历史的原因,产生了两种不同的标准,一种是Ethernet V2.0标准(定义在RFC894中),该标准定义源地址之后的字段是类型字段。另一种是IEEE 802标准(在RFC1042中定义),它将前述字段定义为长度字段。由于Ethernet V2.0标准规定的有效类型值均大于Ethernet网帧的数据最大长度1500,因此可以通过该值区分类型/长度字段的具体含义,即该数值大于1500表示类型字段,否则为
21、长度字段。这里只对Ethernet V2.0封装格式进行了解析,因为这是最常见的封装格式,读者有兴趣可以自己完成对IEEE802格式数据帧的解析。二者的不同封装格式如图16-6所示。图16-6 Ethernet网帧的EthernetV2.0和IEEE802封装格式6. 解析ARP数据包。首先定义ARP头部数据结构:/ARP头部结构typedef struct u_short hardware_type; /16位硬件类型 u_short proto_type; /16位协议类型 u_char hardware_addr_len; /8位硬件地址长度 u_char proto_addr_len;
22、 /8位协议地址长度 u_short operation_code; /16位操作码 u_char src_mac_addr6; /源Ethernet网地址 u_char scr_ip_addr4; /源IP地址 u_char dest_mac_addr6; /目的Ethernet网地址 u_char dest_ip_addr4; /目的IP地址 ARP_HEADER;/ARP报文操作码类型,1为请求,2位应答const u_short ARP_OP_REQUEST = 1; /ARP请求const u_short ARP_OP_REPLY = 2; /ARP应答接下来解析ARP数据包:ARP
23、_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);else if (ntohs(pARPHdr-operation_code) = ARP_OP_REPL
24、Y) strItem = (Reply);/源Mac地址strItem.Format(Senders hardware address: %02X:%02X:%02X:%02X:%02X:%02X, pARPHdr-src_mac_addr0, pARPHdr-src_mac_addr1, pARPHdr-src_mac_addr2, pARPHdr-src_mac_addr3, pARPHdr-src_mac_addr4, pARPHdr-src_mac_addr5);/源IP地址in_addr ipAddr;memcpy(&ipAddr, pARPHdr-scr_ip_addr, sizeof(in_addr);inet_ntoa(ipAddr); /转化为点分十进制字符串/目的Mac地址strItem.Format(Targets hardware address: %02X:%02X:%02X:%02X:%02X:%02X, pARPHdr-dest_mac_addr0,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1