




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
. . . . .协议分析器设计报告协议分析器是一种常用的网络数据收集软件,它是在广播式网络环境下利用计算机网络接口截获目的地计算机的数据报文的一种工具。1.协议分析器的基本原理Ethernet是目前应用最广泛的计算机连网方式,它是基于总线结构的,物理层采用广播方式。当一台主机向另一台主机发送数据时,发送主机会将包含目的主机MAC地址的数据帧发送到总线上,因此同一链路上所有活跃主机的网卡都能接收到该帧。正常情况下,网卡收到数据帧后,会先检测帧头的目的地址字段,如果该地址不是本机的MAC地址,则丢弃不管,因此只有具有该地址的目的主机会接受这个数据帧。但是,如果某个主机上的程序能够修改网卡的接收方式,使其成为“混杂”模式,即程序可以接收网络上所有的数据帧而不理会帧头的目的地址,利用这一点,就可以实现协议分析器。因此协议分析器就是一种能将本地网卡状态设成“混杂”模式并接收网络上所有数据帧的软件。协议分析器工作在网络环境中的底层,拦截所有正在网络上传送的数据,并且通过相应的解析处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体拓扑布局。当应用程序通过IP网络传送数据时,数据就被送入TCP/IP协议栈中,然后由上至下逐一通过每一层,直到最后被当做一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息这个过程被称作封装。通过以太网传输的比特流被称作帧。在传输的另一端,当目的主机收到一个以太网数据帧时,数据就开始从协议栈有底向上逐层解析,去掉各层协议所加上的报文头部。每层协议均要检查报头中的协议标识字段,以确定要接收数据的上层协议,最终从报文中解析出应用层数据后交给应用程序处理。协议分析器就是从网络中捕获数据包并对其进行解析的过程。因此我们需要了解每层协议所规定的报文格式,然后由底向上逐层对数据包进行解码,最后将分析的结果显示出来。2协议分析器总体结构设计此次编程的编程环境为:(1)操作系统:Windows XP SP2;(2)开发语言:C+ / MFC;(3)编译环境:MS Visual C+6.0;(4)第3方函数库:Winpcap3.1;协议分析器的整体结构按功能分成3个部分,自底向上分别是数据捕获模块、协议解析模块和用户显示模块。整体结构图1所示。图1 协议分析器整体结构图3 数据捕获模块设计数据捕获模块的主要功能是进行数据采集,这个是整个系统的基础和数据来源。程序使用Winpcap来捕获网络中原始数据包。Winpcap是数据包捕获的开放代码函数库,它可以完成以下主要功能:(1) 捕获网络中的的原始数据包。(2) 使用用户自定义规则对数据包进行过滤。(3) 发送用户自己构造的数据包到网络中。(4) 统计网络流量。(5) 使用Winpcap捕获数据包的算法使用Winpcap来捕获数据包的算法一般分为以下几步:(1) 获取并列出当前网络设备列表。(2) 由用户选择并打开指定网卡。(3) 根据过滤规则设置过滤器。(4) 捕获数据包并进行解析处理。 编程流程如图2所示。 图2 数据包捕获流程图4 协议解析模块设计该模块的主要功能就是对捕获的数据包按照数据链路层(MAC)、网络层(IP、ARP)、传输层(TCP、UDP、ICMP)的层次结构自底向上进行解析,最后将解析结果显示输出。协议解析过程如图3所示。图3协议解析流程图4.1 解析Ethernet帧Ethernet帧结构中,前导码、帧前定界符和帧校验和(CRC)3个字段均属于物理层内容,而我们使用的Winpcap抓包驱动程序不包含这些字段,因此只需解析目的地址、源地址、长度/类型和数据4个字段即可。 图4 Ethernet帧结构4.2解析ARP数据包 此处不做过多说明,主要代码分析见本文第5部分。图5 ARP报文结构4.3解析IP数据包 为了提高效率,可以使用链表结构存储IP数据包信息,同时还可以使用模板类map来存储IP数据包信息。图6 IP报文结构4.4解析ICMP、TCP、和UDP数据包解析ICMP、TCP和UDP数据包与解析IP报文类似,首先定义出各报文头部的数据结构类型,然后使用报头指针对结构成员进行访问。针对数据长度为8位的字段通过结构成员直接存取,对于16位和32位长度的字段使用ntohs()或ntohl()转化为主机字节序列后再做后续处理;对于长度小于8位的字段(如标志位或子字段)可以通过结构体中定义位域存取。 图7 ICMP报文结构图8 TCP报文结构 图9 UDP报文结构5 部分主要源代码分析5.1数据捕获模块5.1.1 获取并列出网络设备列表pcap_if_t *pAdaptersList=NULL; /网卡列表指针pChar errbufPCAP_ERRBUF_SIZE; /错误消息缓冲区pcap_findalldevs(&pAdaptersList,errbuf); /获取本地网络设备列表int iAdapterCount=0;for(pcap_if_t *pAdapter=pAdatersList;pAdapter!=NULL;pAdapter=pAdapter-next)iAdapterCount+;if(pAdapter-description) /如果有描述则输出详细信息.else /否则输出网卡号. 5.1.2 由用户选择并打开指定网卡./跳到指定网卡pAdapter=pAdapterslist;for(int i=0;inext;/打开网卡,bpromiscMode标志设为1表示混杂模式pcap_t *hAdapterHandle;hAdapterHandle=pcap_open_live(pAdapter-name,/网卡句柄 65535, /允许数据包的最大长度 bPromiscMode, / 混杂模式标志 300, /读取数据超时时间 errbuf ); /错误信息缓冲区5.1.3 根据过滤规则设置过滤器/pAdater指向要设置的网卡,首先获取子网掩码u_int uNetMask;if(pAdapter-addresser) uNetMask=(sockadder_in*)(pAdapter-addresser-addresses-netmask)-sin_addr.s_addr;elseuNetMask=oxffffff; /忽略子网掩码char szFilterCode1024;./*根据规则构造过滤表达式,并存放在szFileterCode缓冲区中*/编译过滤器bpf_program fpcode;if (pcap_compile(hAdapterHandle,&fpCode,szFilterCode,TRUE,uNetMask)=0)/接收超时继续循环if(iResult=0)continue;/处理收到的数据包PacketHandler();5.2协议解析模块5.2.1 解析Ethernet帧/MAC头部typedef structBYTE DesMacAddr6;/目的地址BYTE SrcMacAddr6;/源地址WORD LengthOrType;/数据长度或类型 MAC_HEADER;/MAC帧类型const u_short MAC_TYPE_IP= 0x0800;const u_short MAC_TYPE_ARP= 0x0806;const u_short MAC_TYPE_RARP= 0x8035;MAC_HEADER* pMacHdr = (MAC_HEADER*) pPkt/MAC目的地址strItem.Format(%02X:%02X:%02X:%02X:%02X:%02X, pMacHdr-SrcMacAddr0,pMacHdr-SrcMacAddr1,pMacHdr-SrcMacAddr2,pMacHdr-SrcMacAddr3,pMacHdr-SrcMacAddr4,pMacHdr-SrcMacAddr5);/ Mac目的地址strItem.Format(%02X:%02X:%02X:%02X:%02X:%02X, pMacHdr-DesMacAddr0,pMacHdr-DesMacAddr1,pMacHdr-DesMacAddr2,pMacHdr-DesMacAddr3,pMacHdr-DesMacAddr4,pMacHdr-DesMacAddr5);/根据协议类型调用相应解析函数if (ntohs(pMacHdr-LengthOrType) 1500)if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_IP) /IP协议ParseIPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER),pRawPacket-PktHeader.caplen-sizeof(MAC_HEADER);else if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_ARP) /ARP协议ParseARPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER),pRawPacket-PktHeader.caplen-sizeof(MAC_HEADER);else/帧数据中报文类型未知ctlList.AddItem(m_iIndex, 4, UNKNOWN);else /长度Parse802Packet(BYTE*)pMacHdr+sizeof(MAC_HEADER),pRawPacket-PktHeader.caplen-sizeof(MAC_HEADER);5.2.2解析ARP数据包/ARP头部typedef structu_short hardware_type;/16位硬件类型 u_short proto_type;/16位协议类型u_char hardware_addr_len;/8位硬件地址长度u_char proto_addr_len;/8位协议地址长度u_short operation_code;/16位操作码u_char src_mac_addr6;/源以太网地址u_char scr_ip_addr4;/源IP地址u_char dest_mac_addr6;/目的以太网地址u_char dest_ip_addr4;/目的IP地址/ARP报文操作码类型const u_short ARP_OP_REQUEST= 1;/ARP请求const u_short ARP_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); else if (ntohs(pARPHdr-operation_code) = ARP_OP_REPLY)strItem += (Reply);/ARP头部子节点:源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);/ARP头部子节点:源IP地址in_addr ipAddr;memcpy(&ipAddr, pARPHdr-scr_ip_addr, sizeof(in_addr);strItem.Format(Senders IP address: %s, inet_ntoa(ipAddr);tARPHdr.AddTail(strItem, IID_ADDRESS);/ARP头部子节点:目的Mac地址strItem.Format(Targets hardware address: %02X:%02X:%02X:%02X:%02X:%02X,pARPHdr-dest_mac_addr0,pARPHdr-dest_mac_addr1,pARPHdr-dest_mac_addr2,pARPHdr-dest_mac_addr3,pARPHdr-dest_mac_addr4,pARPHdr-dest_mac_addr5);/ARP头部子节点:目的IP地址memcpy(&ipAddr, pARPHdr-dest_ip_addr, sizeof(in_addr);strItem.Format(Targets IP address: %s, inet_ntoa(ipAddr);/ARP头部子节点:填充字段strItem.Format(Frame padding: %d bytes, iLen-sizeof(ARP_HEADER);5.2.3解析IP数据包/IP头部typedef structunsigned charhdr_len:4;/ 4位头部长度unsigned charversion:4;/4位版本号unsigned chartos;/ 8位服务类型unsigned shorttotal_len;/ 16位总长度unsigned shortidentifier;/16位标识符unsigned shortfrag_and_flags;/ 3位标志+13位片偏移unsigned charttl;/8位生存时间unsigned charprotocol;/8位上层协议号unsigned shortchecksum;/16位校验和unsigned longsource_ip;/ 32位目的地址unsigned longdest_ip;/ 32位目的偏移地址 IP_HEADER;/解析IP报文-IP_HEADER* pIPHdr = (IP_HEADER*)pPkt;/*解析IP头部各字段并显示输出*/根据不同上层协议调用相应解析函数switch (pIPHdr-protocol)case IPPROTO_TCP:strItem += TCP;ParseTCPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor);break;case IPPROTO_UDP:strItem += UDP;ParseUDPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor);break;case IPPROTO_ICMP:strItem += ICMP;ParseICMPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor);break;case IPPROTO_IGMP:strItem += IGMP;ParseIGMPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen, tParentCursor);break;default:strItem += OTHERS;5.2.4解析ICMP、TCP和UDP数据包/ICMP基本头部typedef structBYTEtype;/8位类型BYTEcode;/8位代码USHORTcksum;/16位校验和 ICMP_BASE_HEADER;/-/ICMP 回显头部typedef structICMP_BASE_HEADER base_hdr;/基本头部USHORTid;/16位标识符USHORTseq;/16位序列号 ICMP_ECHO_HEADER;/-/ICMP差错报文头部typedef structICMP_BASE_HEADER base_hdr;/基本头部ULONGunused;/32位未用,必须为0 ICMP_ERROR_HEADER;ICMP_BASE_HEADER* pICMPHdr = (ICMP_BASE_HEADER*)pPkt;/ICMP头部子节点:类型strItem.Format(Type: %d, pICMPHdr-type);switch (pICMPHdr-type)case ICMP_ECHO_REQUEST:strItem += (Echo Request);break;case ICMP_ECHO_REPLY:strItem += (Echo Reply);break;case ICMP_TIMEOUT:strItem += (Time Exceeded);break;case ICMP_HOST_UNREACHABLE:strItem += (Destination Unreachable);break;tICMPHdr.AddTail(strItem, IID_ITEM);/ICMP头部子节点:代码strItem.Format(Code: %d, pICMPHdr-code);tICMPHdr.AddTail(strItem, IID_ITEM);/ICMP头部子节点:校验和strItem.Format(Checksum: 0x%04X, ntohs(pICMPHdr-cksum);tICMPHdr.AddTail(strItem, IID_CHECKSUM);/ICMP头部子节点:后续字段switch (pICMPHdr-type)case ICMP_ECHO_REQUEST:case ICMP_ECHO_REPLY:ICMP_ECHO_HEADER* pICMPEchoHdr = (ICMP_ECHO_HEADER*)pPkt;/ICMP ECHO报文头部子节点:标识符strItem.Format(Identifier: %d, ntohs(pICMPEchoHdr-id);tICMPHdr.AddTail(strItem, IID_ITEM);/ICMP ECHO报文头部子节点:序列号strItem.Format(Sequence number: %d, ntoh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 被动语态的教学设计课件
- 比例的应用课件
- 财务个人月工作方案和总结
- 中学数学教学设计课件
- 2025年化工总控工初级面试模拟题及答案
- 心血管疾病教学课件
- 急性心肌梗塞护理常规和抢救措施试题及答案
- 2025年垃圾处理行业技术创新与碳减排技术进步研究报告
- 2025年安全生产案例分析试题及答案
- 绩效跟踪与分析合同
- 化工设备基础知识培训课件
- 2025-2026学年北师大版数学小学三年级上册(全册)教案设计及教学计划
- 医疗生产安全知识培训课件
- 2025年平凉市静宁县城镇公益性岗位人员招聘(78人)考前自测高频考点模拟试题及答案详解一套
- 2025年部编版新教材道德与法治二年级上册教学计划(含进度表)
- 2025年【秋季】小学【一年级】开笔礼校长致辞:翰墨初启 开笔破蒙
- 2025年“学宪法讲宪法”主题活动知识竞赛题库附答案
- 2025年秋八年级开学主题班会第一课课件(初二正青春拼搏向暖阳)
- 印章U盾管理办法
- 携手筑梦新学期共育成长向未来-2025-2026学年高二上学期开学家长会-
- 2025年重庆市永川区社区工作者招聘考试笔试试题(含答案)
评论
0/150
提交评论