




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于数据包分析的网页还原技术研究摘要:在信息社会中,信息是维持生产活动、经济活动以及社会活动的重要资源,对政治、经济和文化都有着深远影响。不断探索网络信息监听与还原技术有助于建立可靠、高效的信息安全保障体系,对于维护社会政治稳定和国家信息安全具有重要的现实意义。结合应用环境和实际需求,本文探讨了网络数据包信息还原涉及的相关技术,包括几个方面的内容:数据包捕获技术、数据包分析技术、数据包重组技术、http信息识别技术。针对数据包捕获讨论了几种捕获机制;针对数据包分析技术,介绍基本的网络协议原理,TCP/IP协议族的介绍,对于每个协议的基本数据结构进行阐述;针对数据包重组技术,讨论如何将无序的数据片流有序化;针对HTTP信息识别技术讨论了超文本传输协议HTTP(HyperTextTransferProtocol),描述了协议的组成、相关参数、相关头域字段。实际运行结果表明,本系统能对现有基于HTTP/1.0和HTTP/1.1协议的网页信息进行有效还原,运行稳定,性能良好。关键词:网络数据包捕获;数据包重组;http信息提取
WebReductiontechnologyresearchbasedontheanalysisofthedatapacketsAbstract:Intheinformationsociety,informationistheimportantresourceformaintainingproduction,social,economicandactivities,andithasbecomethebaseofpolitical,economicandculturalfields.Explorationmethodsandtechniquesfornetworkinformationsniffingcontributestotheestablishmentofareliableandefficientnetworkinformationsecuritysystem,italsohelpsformaintainingsocialandpoliticalstability,aswellaseconomicdevelopment.Baseonthedemandanalysisandtheapplicationenvironment,thispaperdiscussestherelatedtechnologieswhichisinvolvedinthesystemofrecoveringtheinformationofnetwork,suchasthetechnologyofcapturingpackets,thetechnologyofanalysisingpackets,thetechnologyofrestructuringpacketsandthetechnologyofrecognizingHTTP'spacketsInthemoduleofcapturingpackets,itmainlyfoucuesonseveralcapturemechanisms.Inthemoduleofanalysisingpackets,Iintroducedthebasicprincipleofnetworkprotocol,someintroductionofTCP/IPprotocol,alsodescribedthebasicdatastructureforeachagreement.Inthemoduleofrestructuringpacket,itfocuesonhowtoorderthedisorderpackets.IntherecognizingHTTP'sinformation,IdiscussedsomethingaboutHTTPprotocolanddescribedthecompositionofprotocol,therelatedparametersintheagreementandrelatedfields.ExperimentsshowthatitcanrecovertheWebinformationbasedonHTTP/1.0andHTTP/1.1effectively,stablyandexcellently.Keywords:capturenetworkpacket,restructurepackets,extractHTTPinformation
目录TOC\o"1-3"\h\u16781第1章绪论 1125391.1研究背景与意义 1210401.2Web技术的发展现状与信息还原技术研究水平 1282291.2.1Web技术的发展现状 1287551.2.2信息还原技术研究水平 2198661.3研究内容和目标 314134第2章设计分析 4271952.1需求分析 4103192.2模块设计 413467第3章详细设计过程 662203.1网络数据包捕获模块 6324913.1.1网络数据包捕获技术 6228343.1.2数据包捕获模块实现 7105503.2网络协议分析技术 97843.2.1网络协议原理 9188873.2.2TCP/IP核心协议 989623.2.3网络数据包分解过程 10206353.3网络数据包重组分析 1360483.4HTTP协议信息还原模块 1482123.4.1HTTP请求头分析 15182673.4.2HTTP响应头分析 17174223.4.3数据包信息还原模块 194294第4章调试总结 21321804.1捕获数据包模块 21209884.1.1问题总结 21321574.1.2捕获数据包模块运行结果 21215684.2数据包重组模块 2228004.2.1问题总结 2285854.2.2数据包重组模块运行结果 23118934.3数据包还原模块 23213724.3.1问题总结 2318424.3.2数据包还原模块运行结果 2412572第5章总结 2671525.1已完成的工作 26150225.2展望 2613810致谢 277709参考文献 2830309附录1 29第1章绪论1.1研究背景与意义今天Web使得全世界的人们以史无前例的巨大规模相互交流,不论相距遥远的人们还是不同年代的人们都可以通过网络彼此认识交友,甚至改变他们对待小事的态度以及精神。Web庞大的网络体系使得情感经历、政治观点、文化习惯、表达方式、商业建议、艺术、摄影、文学等实现了低投入的数据共享。互联网已经发展成为世界上资料最多、门类最全、规模最大的信息库和全球范围内传播信息的主要渠道。在全世界步入信息时代的今天,社会发展从有形产业逐渐向无形产业转变,一个国家的政治、经济、军事、文化等方方面面,都离不开信息,信息已成为社会发展中不可缺少的战略资源和基本生活要素。据国外数据统计[1],在开通互联网办公的企业中,企业员工平均每天有超过50%的工作时间花在上网聊天,浏览娱乐、购物等网站或处理个人事务,其花于工作事务而是用互联网的时间只有25%左右。而且随着互联网海量信息的广泛传播,网络信息内容的安全问题备受关注。利用网页、电子公告栏等方式传播有害信息甚至泄露公司机密、国家机密的例子层出不穷。综上所述,网络信息还原[2]的重要性和紧迫性已经刻不容缓。为了维护我国的信息安全,遏制不良信息的传播,必须加大对网络信息监控与管理的力度,对互联网上的信息内容进行自动审查、过滤,防止不良信息的传播,规范网络,推进网络健康文明发展。因此,对因特网中一些重要数据信息进行还原和提取,是保证网络应用的健康发展和打击网络犯罪的一个重要手段[3]。实时监控[4]所在网络的HTTP通讯,当网络上出现非法内容的HTTP通讯时,将捕获的非法内容保存到数据库,向网络安全管理部门报告,以便及时保护事业单位及国家的利益,已显得十分有必要。1.2Web技术的发展现状与信息还原技术研究水平1.2.1Web技术的发展现状自第一个Web[5]浏览器和服务器于1991年问世以来,它便以惊人的速度发展。1993年初,Web仅有约50台服务器。随着可显示文本和图像的图形用户界面的引入,Web呈现出爆炸式增长。到1993年底,Web服务器数量增长了10倍。同时,Web占有了Internet通信总量的1%。而到20世纪90年代末,Web已占有了Internet通信总量的75%,Web用户的数量增至数亿,Web站点的数量则达到几百万。保守估计,有不止10亿的统一资源定位符(URL)可供公众使用。另外在私人机构中,还有难以计数的从内部访问的URL。基于Web图形用户界面和容易发布更新内容的特征,引起了用户和公司的访问信息方式的急剧变化。Web使商家能更容易将自己的商机扩展到更为广阔的市场,也使得客户可通过网络浏览产品信息和进行购物。许多新公司使用Web作为自己和用户接触的主要途径。此外,Web还成为一种开放式市场,以拍卖、聊天室、游戏的形式,供用户直接交流。Web当初的开发宗旨是向公众提供信息,如今Web正逐渐使用于机构内部连接用户和私人或专用数据。例如,许多公司通过内部的Web站点,为雇员提供访问有关工资和福利的信息数据库,内部Web站点的数量已超过了公众网页数量。内部Web站点的增长,也凸显出Web与Internet的不同。雇员可将自己的计算机不必连到Internet而直接连接到专用网上,甚至不允许Internet访问其内部网络。尽管如此,Internet仍与Web紧密相连。Internet提供了一个全球通信的基础设施,使得Web客户机可访问遍布世界各地的各种Web服务器[6]。1.2.2信息还原技术研究水平据中国网报道,胡锦涛在中国科学院中国工程院院士大会上的讲话中指出:大力发展国家安全和公共安全科学技术。要加快发展空间安全、海洋安全、生物安全、信息网络安全技术,提高对传统和非传统国家安全和公共安全的监测、预警、应对、管理能力,加强安全生产技术研究和推广,构建先进国家安全和公共安全体系,有效防范对人民生活和生态环境的生物威胁,维护信息和网络空间安全,维护国家利益,捍卫国家主权,保障社会稳定。目前网络的实时监控、检测和信息还原技术已受到全球重视。以美国为首的信息发达国家,为了在信息化浪潮中占据先机,打击网络犯罪和网络恐怖活动,窃取他国秘密和信息,搞信息霸权等,已经建立和完善其信息监控法律法规制度,并颁布了相应的法律和法令[7],开始实施相关网络监控项目,对关键性的信息活动进行全球性的监视[8]。目前,我国网络安全监控系统已取得成就。于2011年1月11日召开的国家科学技术奖励大会上,由国防科技大学牵头研制的"大规模网络安全监控数据库系统"喜获国家科技进步二等奖。该成果推出4年来,已经广泛应用于中央、地方等多级政府部门和相关单位,为国家网络安全作出了重要贡献。1.3研究内容和目标本文首先从网络安全技术中的网络数据包捕获技术入手,然后通过协议分析技术重组相关数据报信息,最后提取应用层http负载来达到对网络信息的还原。本文的研究内容归纳起来有:对网络数据包捕获技术做基础知识的介绍,如捕获机制以及WinPcap开发包的简单介绍。网络协议原理的简单介绍、TCP/IP协议分层及其协议分布,网络数据包分解过程以及各层数据包的组成部分,数据包重组原理。HTTP协议数据的识别与还原。本设计实现的网页信息还原系统立足于准确、高效、稳定,涵盖网络数据包捕获、分析、重组和网页信息还原等4方面内容,致力于网页还原准确率高、稳定性好且硬件要求低。
第2章设计分析2.1需求分析我国著名计算机专家沈昌祥院士指出":信息安全保障能力是21世纪综合国力、经济竞争实力和生存能力的重要组成部分,是世纪之交世界各国在奋力攀登的制高点"。网络安全管理与情报收集作为衡量信息安全保障能力的重要指标,是我国优先进行研究发展的重要课题,而基于网络数据包的网页信息还原技术则是网络安全管理最为重要的组成部分。网页信息还原技术的研究,对维护社会稳定、国家健康发展有着重要的现实意义。本课题对网页信息还原技术进行全方位探讨,然后在此基础上构建一个能满足一类特定应用需求的网页信息还原系统。主要内容包括:(1)高性能的网络数据包捕获方法。(2)数据包重组和网络协议分析技术。(3)面向对象的高可扩展性系统架构的设计。(4)基于数据包的网页还原技术。2.2模块设计本设计主要分以下几个模块:(1)网络数据包捕获模块(2)网络数据包协议分析与数据包重组模块(3)HTTP协议信息还原模块数据包捕获模块负责捕获流经用户所选网络设备的全部数据包,并将捕获得到的数据按照相应的规则以文件格式存储起来,以供后续模块进行分析、重组和还原。数据重组模块首先读入数据包捕获得到的数据,分析每一个捕获到的数据包,将具有相同的源IP地址、源端口号、目的IP地址和目的端口号的数据包按照先后顺序存储在一起,重组成一个完整的数据包。HTTP协议信息还原模块通过一层层的数据包分解出来,读取出应用层HTTP的负载信息,通过分析HTTP请求头得到seq,并为此创建一个临时文件,保存数据包的简要信息;然后分析HTTP响应头,得到content-encoding,conteng-type、content-length字段值,再存入临时文件,最后把HTTP负载信息与具有相同seq、sport、dport的临时文件简要信息匹配,若匹配成功,则进行相应的数据插入,还原出相关网页信息。总流程图如图2-1所示。图2-1总流程图从降低系统设计复杂性和提高开发效率的角度考虑,结合实际需求出发,本系统没有采用数据库软件存储捕获到的网络数据包,而是直接以某种自定义文件格式将其存放在硬盘中。HTTP协议信息还原模块既支持对于老版本HTTP/1.0协议网页信息的还原,也支持针对新版本HTTP/1.1协议的网页信息还原。
第3章详细设计过程3.1网络数据包捕获模块3.1.1网络数据包捕获技术由于不同网络有不同的捕获技术[11],捕获原理也因不同操作系统稍有不同,因此在选择捕获技术时也要根据实际情况而定。下面将对以太网环境下的数据包捕获展开讨论。一般,操作系统提供的捕获机制主要有3种:(1)基于套接字的捕获套接字是一种网络API(应用程序编程接口),套接字接口提供一种进程间通信的方法,使得在相同或不同的主机上的进程能以相同的规范进行双向信息传送。进程通过调用套接字接口来实现相互之间的通信,而套接字接口又利用下层的网络通信协议功能和系统调用来实现实际的通信工作。常用的套接字[12]类型有以下3种:1)SOCK_STREAM,流式套接字,提供面向连接、可靠的数据传输服务,数据按字节流、按顺序收发,保证数据在传输过程中无丢失、无冗余。TCP协议支持该套接字。2)SOCK_DGRAM,数据包套接字,提供面向无连接的服务,数据收发无序,不能保证数据的准确到达。UDP协议支持该套接字。3)原始套接字,允许对低于传输层的协议或物理网络直接访问,例如可以接受和发送ICMP报。常用于检测新的协议。(2)基于Libpcap的捕获Libpcap是UNIX/Linux操作系统从内核捕获网络数据包的必备工具,用来在用户态下的数据包截获,是与系统独立的API接口,广泛应用于网络数据收集、安全监控、网络调试等,并且还支持过滤机制,为底层网络的监听提供了一个可移植的架构。(3)基于WinPcap的捕获WinPcap提供了一套标准的捕获数据包接口(由文献[13,222~223]可知),它是Libpcap的Windows版本,与Libpcap兼容,并充分考虑了各种性能和效率的优化,包括NPF(NetgroupPacketFilter)内核层次上的过滤器、统计模式的支持,提供了发送数据包的能力。由于系统内核本身没有提供标准的接口,所以只有通过增加一个驱动程序或者网络组件来访问内核网卡驱动提供的数据包,但在不同的Windows操作系统平台下有所不同,而且不同的Sniffer采用的技术也不尽相同。WinPcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报,唯一的缺点就是在运行用WinPcap开发的程序[13]之前,都要在主机上先安装WinPcap的driver,但是它的功能很强大,工作效率更高,且很容易移植到其他操作系统平台上。因此,本毕业设计采用了WinPcap来捕获数据包。以下是本研究所使用的WinPcap[9]开发包中的API函数,如表3-1:表3-1本研究中所使用的API函数类型API函数原型功能简单说明网卡设备获取intpcap_findalldevs_ex(char*source,structpcap_rmtauth*auth,pcap_if_t**alldevs,char*errbuf);获取全部网卡设备列表void pcap_freealldevs(pcap_if_t*);释放网卡设备列表网卡设备操纵pcap_t*pcap_open(constchar*source,intsnaplen,intflags,intread_timeout,structpcap_rmtauth*auth,char*errbuf);打开选定网卡设备void pcap_close(pcap_t*);关闭网卡设备3.1.2数据包捕获模块实现(1)开始捕获本模块首先通过函数OnCbnSelchangeComboNet()得到用户的配置信息,然后调用函数open_device()跳转到所选网卡设备,最后调用函数free_dev_list()释放网络适配器设备。当用户点击"开始捕获"按钮时,程序将通过函数OnBnClickedBtnStart()启动整个数据包捕获模块,然后启动数据包捕获线程Cappacketlivethread(),最后通过函数packet_handler()从数据包中读取数据内容。核心代码如下:if((adhandle=open_device(alldevs,sel_num))!=NULL)//打开设备 { free_dev_list(alldevs); net_interface->EnableWindow(false); }AfxBeginThread(Cappacketlivethread,GetSafeHwnd());//启动数据包捕获线程intpacket_handler(conststructpcap_pkthdr*header,constu_char*pkt_data)//显示捕获的数据包的基本信息{ethernet=(struct ETHERNET*)pkt_data;NetType=ntohs(ethernet->NetType);MAC=ethernet->SourceMac;sprintf(DisplayEthernet.SourceMac,"%02x:%02x:%02x:%02x:%02x:%02x",*MAC,*(MAC+1),*(MAC+2),*(MAC+3),*(MAC+4),*(MAC+5));strcpy(packet.SourceMac,DisplayEthernet.SourceMac);MAC=ethernet->DestinationMac;sprintf(DisplayEthernet.DestinationMac,"%02x:%02x:%02x:%02x:%02x:%02x",*MAC,*(MAC+1),*(MAC+2),*(MAC+3),*(MAC+4),*(MAC+5));strcpy(packet.DestinationMac,DisplayEthernet.DestinationMac);pkt_data+=sizeof(struct ETHERNET);}详细代码见附录1。捕获数据包流程图如图3-1所示。图图3-1数据包捕获模块流程图(2)停止调用OnBnClickedBtnStop()函数停止捕获数据包。3.2网络协议分析技术网络协议分析技术主要是通过分析网络中各种协议数据,得到网络运行情况。网络协议分析技术被广泛应用于网络维护和管理本节介绍将介绍基本的网络协议原理,对于每个协议的基本数据结构进行阐述。3.2.1网络协议原理网络协议[10]是指定义数据包的格式以及其用途的规则集。一个网络协议至少包括三要素,分别是语法、语义和时序。其中语法用来规定信息格式,指数据和控制信息的结构和格式,语义是用来规定通信双方应当怎么做,时序详细地定义了时间的先后顺序。一个网络协议数据包,一般包括协议头和数据两部分。在协议头定义了协议的基本内容,如源地址和目的地址、数据包长度和协议类型等。根据所定义的首部内容,定义相关的处理规则就形成了一套完整的网络协议(由文献[13,183~185]可知)。3.2.2TCP/IP核心协议在TCP/IP协议族中有多种协议,其分层结构和每个层的主要协议如表3-2所示。表3-2TCP/IP协议分层及其协议分布应用层HTTP,FTP,TELNET,POP3,SMTP,DNS等传输层TCP,UDP等网络层IP等链路层以太网,PPP/SLIP等链路层主要是管理网络数据包的接受和发送,在操作系统中主要体现在设备驱动程序和网络接口。网络层主要负责网络数据包的路由传送功能,它是TCP/IP协议中的核心协议中的核心协议。有了它数据包才知道怎样在各种网络中穿梭,找到正确的目的地。当数据包的长度大于路由器的MTU时,则要对数据包进行重组后再进行传送。并且在网络层还要负责地址转换工作,把MAC地址和IP地址之间转换。网络层解决了计算机之间的通信问题,在多个互联的网络之间建立、保持和终结逻辑和物理连结。传输层的基本任务是提供应用程序之间的通信服务。它还兼负着向应用层提供与网络无关而可靠的信息互换服务的重任。该层不仅系统地管理信息的流动,还提供可靠的端到端的传输服务,以确保数据道道无差错、无乱序。为了达到这个目的,协议软件提供确认和重发的功能,同时还处理流量控制、拥塞控制等事务。该层主要任务是负责数据的传递操作,保证数据能够正确到达,当中最具代表的就是TCP协议。应用层是TCP/IP的最高层,网络在此层向用户应用程序提供服务,确保通信畅通。用户调用相应的程序并通过TCP/IP网络来访问可用的网络,与每个传输层协议交互的应用程序负责接收和发送数据。3.2.3网络数据包分解过程接收数据包的过程就是分解数据包的过程,因为主机接收的是一个原始的链路层数据包。根据对以太网帧的分解,然后对每层协议进行解析,最后读取所传送的数据内容。如图3-2所示:链路层数据负载链路层协议首部链路层数据负载链路层协议首部网络层数据负载网络层协议首部网络层数据负载网络层协议首部传输层数据负载传输层协议首部传输层数据负载传输层协议首部数据负载应用层首部数据负载应用层首部图3-2接收数据使得分解过程IP协议IP协议(InternetProtocol)是网络层协议,因特网上的TCP、UDP、ICMP、IGMP等数据都是按照IP数据格式发送的。IP数据包由一个头部和IP数据包负载构成。IP数据包头部格式如图3-3所示:
版本首部长度服务类型总长度标识号标记段偏移量生存时间(TTL)协议首部校验和源IP地址目的IP地址可选项填充位数据图3-3IP数据包头部格式上面就是IP数据的头部格式,IP头部由20字节的固定长度和一个可选任意长度部分构成,从左到右以网络字节序传送。分解链路层协议的核心代码如下:voiddecEthernet(constethernet_header*eh,size_tethernet_len){ ethernet_header_len=sizeof(ethernet_header);//获得Ethernet头长度 ih=(ip_header*)((u_char*)eh+ethernet_header_len);//获得IP数据包头部的位置ip_len=ethernet_len-ethernet_header_len;//获得IP数据包长度decIP(ih,ip_len);}分解网络层协议的核心代码如下:voiddecIP(ip_header*ih,size_tip_len){ip_header_len=(ih->ver_ihl&0xf)*4;//获得IP头长度 saddr.byte1=ih->saddr.byte1;//提取SourceIP值 saddr.byte2=ih->saddr.byte2; saddr.byte3=ih->saddr.byte3; saddr.byte4=ih->saddr.byte4;daddr.byte1=ih->daddr.byte1;提取DestinationIP值 daddr.byte2=ih->daddr.byte2; daddr.byte3=ih->daddr.byte3; daddr.byte4=ih->daddr.byte4; }TCP协议
TCP(TransmissionControlProtocol)是传输层协议,为应用层提供可靠的面向连接的服务。该协议位于IP子协议的上层,通过提供校验和、流控制及序列信息以弥补IP协议可靠性的缺陷。如果一个应用层只依靠IP协议发送数据,那么IP协议将杂乱地发送数据,如果不检测目标节点是否脱机,或数据是否在发送过程中已被破坏。以下是关于TCP协议的头部格式内容的说明,如图3-4所示:16bit源端口号16bit目的端口号32bit序列号32bit确认序号首部长度保留UAPRSF16bit窗口大小16bit校验和16bit紧急指针选项数据图3-4TCP首部结构跟IP头部差不多,基本的长度也是20字节。TCP数据包是包含在一个IP数据报文中的。分解传输层协议的核心代码如下:voiddecTcp(consttcp_header*th,size_ttcp_len,ip_addresssaddr,ip_addressdaddr){tcp_header_len=(th->info_ctrl>>4&0xf)*4;获得TCP数据段头指针pTCP_data=(u_char*)((u_char*)th+tcp_header_len);tcp_datalen=tcp_len-tcp_header_len;//获得TCP有效数据长度ack=big2small(th->ack_number);//获得ack值(网络字节序列转换成主机字节序列)seq=big2small(th->seq_number);//获得seq值sport=ntohs(th->source_port);dport=ntohs(th->destination_port);if((dport==80)||(sport==80)) { if(tcp_datalen!=0) {decHttp(pTCP_data,tcp_datalen,seq,ack,saddr,daddr,sport,dport);}}HTTP数据的识别HTTP采用TCP协议作为传输层协议,其常用端口为80,因此判断HTTP协议数据的流程首先是要判断网络数据的传输层协议,若传输层协议为06(TCP协议)且端口(源端口或目的端口)为80的网络数据,就初步认定为应用层数据。网络数据包分解模块详细代码见附录1,该流程图如图3-5所示。图图3-5http协议识别流程图3.3网络数据包重组分析由于IP不能保证可靠、有序的包传输,因此包有可能会被破坏或在到达时是无序的。另外,在捕获过程中会将重复的包视为TCP重发的结果,也可能会捕获那些不会到达到预定接收器的包。在这两种情况下,捕获过程都可能会接收重复的包。更复杂的是,TCP不能保证重新传输的包会按照原始数据的同一方式再将这些数据分组。因此重构有序流就显得尤为重要。如果一个流有起始、结束和两者间的所有东西,它就是完整的流。根据SYN可以确定包连接的TCP包所有字节流。为了方便应用数据的恢复,需要将无序的数据片流有序化,使其表现为一个有序的数据片流(或者说是数据流)。在软件实现数据片有序化时,本设计采用了一个带头结点的双向链表队列,队列中的每个结点存储一个完整的TCP数据流的内容,另外还有两个元素,分别是指向前导和后续结点的结构体指针。数据包重组的核心代码:if(disorderly==true)//判断该数据流无序化标志是否为真{ if(order_data()!=true)//若为真则调用order_data重组数据 { this->writting=false; returnNULL; } }boollist_node::order_data(){if((p->seq!=next_seq_num)) { tmp=p->prev; while(tmp->seq!=next_seq_num) { tmp=tmp->prev; if(tmp==root) { this->writting=false; returnfalse; } } next_seq_num+=segment_size;//更新next_seq_num len+=tmp->len; }}数据重组流程图见图3-6,详细代码见附录1。图3-6数据包重组流程图3.4HTTP协议信息还原模块每一个信息流包含着一个或多个HTTP消息,每一个HTTP消息包含着一个标头和一个可选择的主体,如图3-7所示:图3-7HTTP消息HTTP有两种报文[14],一个是客户机向服务器发送的请求报文和服务器向客户机发送的响应报文。3.4.1HTTP请求头分析请求方法[15]用于通知HTTP服务器,针对有request_url所标识的资源,确定应采取什么操作。最通用的方法是GET方法,它负责取得由URI所标识的那个资源的当前值。HTTP/1.0定义了3种方法(GET,POST,HEAD),HTTP/1.1中,引入了3个新的请求方法(OPTIONS、TRACE和CONNECT)。由于HEAD和POST等方法的消息体会被服务器忽略,对本研究的作用不大。故本研究只针对HTTP的GET请求方法展开阐述。GETGET请求用于向指定URI发送资源请求,生成的响应为资源的当前值。这一响应会返回至发送请求的客户机。如URI引用静态文件,GET请求将导致读取该文件,并返回其内容。如果URI引用程序,则数据(如果有的话)会作为响应主体而被返回。在GET请求中可包含参数,他们是根据用户的输入而构建的。以下通过一条捕包信息对GET请求报文进行分析:GET/HTTP/1.1\r\n//使用的请求方法为GET,使用HTTP1.1版本Accept:*/*\r\nAccept-Language:zh-ch\r\nAccept-Encoding:gzip,deflate\r\nUser-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;.NETCLR2.0.50727;CIBA)\r\n//请求标头,包含正在使用的浏览器软件的特定版本、客户机的操作系统以及硬件细节有关的信息。Host:\r\n//提交请求页面Connection:Keep-Alive\r\n//TCP连接保持打开\r\n//这条请求信息以回车换行符结尾通常,请求消息中包含请求方法、URI、协议版本标识符、可选的请求标头字段以及可选的主体(GET请求方法没有请求主体)。本模块中首先使用函数str_str((char*)pdata+strlen("GET"),tcp_datalen,"HTTP/",strlen("HTTP/"))获得GET-HTTP/之间的字段值,保存为url字段值;使用函数str_str_last(url,"/")把url值中最后一个"/"的字符作为处理存入的文件名;使用函数strstr((constchar*)pdata,"Host:")得到host字段,再把url字段值加入加入到host字段,得到完整的url字段值;那么下一个包的seq值等于当前seq值加上tcpdatalen值;使用函数store_file.find(seq,dport,sport)检查下list列表是否存储了当前数据包信息,如果没有就使用函数store_file.insert_node(storefilename,seq,dport,sport,host)插入相关信息。核心代码如下:p=(u_char*)str_str((char*)pdata+strlen("GET"),tcp_datalen,"HTTP/",strlen("HTTP/"));if(p!=NULL) {memcpy(url,(char*)pdata+strlen("GET"),(char*)p-(char*)pdata-strlen("GET"));storefilename=str_str_last(url,"/");if((p=(u_char*)strstr((constchar*)pdata,"Host:"))!=0) { p+=strlen("Host:"); u_char*end=(u_char*)str_str((char*)p,20,"\r\n",strlen("\r\n")); if(end!=NULL) { memcpy(host,p,end-p); strcat(host,url); } } seq+=(DWORD)tcp_datalen;pnode=store_file.find(seq,dport,sport); if(pnode==NULL) { store_file.insert_node(storefilename,seq,dport,sport,host); }}对HTTP请求头方法的分析流程图如图3-8。图3-8HTTP请求头分析3.4.2HTTP响应头分析每条HTTP响应消息都以Status-Line(状态行)开始。状态行包括3个字段:服务器的协议版本号、响应码以及一个自然语言原因短语。在HTTP中,共有5个响应类,分别是信息类(1xx)、成功类(2xx)、重定向类(3xx)、客户机错误类(4xx)以及服务器错误类(5xx)。本研究只针对成功类响应(2xx)展开阐述。服务器收到并接受HTTP请求以便处理后,会生成成功类响应。HTTP/1.0中有4个2xx响应码,分别是200OK,200Created,200Accepted,204NoContent。200OK响应码表示请求成功时,便会返回200OK响应。响应中包含数量不等的细节。例如,GET请求会导致原始服务器返回响应,并将GET方法应用于资源。HTTP响应头中的Content-Type字段值则表明HTTP协议传输资源的MIME[16]类型,MIME类型与文件类型的对应关系可参考表3-3;Content-Length字段值代表了HTTP消息体的长度。表3-3常见MIME类型和文件扩展名对应关系表 MIME类型文件扩展名text/html.htm/.htmlimage/jpg.jpg/.jpegapplication/x-javascript.jstext/plain.txttext/css.css本模块中对HTTP响应信息的处理方法,首先是使用函数getlen(pdata+strlen("HTTP/1.1"))获得响应码,如果响应码不是200,则通过函数find(ack,sport,dport)获得该数据包信息,然后通过函数delete_node删除该数据包信息。如果响应码是200,通过函数strstr((constchar*)pdata,"Content-Encoding:"))匹配content-encoding字段值然后通过函数str_str((char*)pdata,segment_size,"Content-Type:",strlen("Content-Type:"))得到content-type字段值,再通过函数strstr((constchar*)pdata,"Content-Length"))得到content-length字段值,最后通过函数init_first_seq(pnode,seq)插入该数据包信息。核心代码如下:,if((p=(u_char*)strstr((constchar*)pdata,"Content-Encoding:"))!=0) { if(strncmp((constchar*)p+strlen("Content-Encoding:"),"gzip",strlen("gzip"))==0) {content_encoding=ce_GZIP;}elseif(strncmp((constchar*)p+strlen("ContentEncoding:"),"compress",strlen("compress"))==0) {content_encoding=ce_COMPRESS;}elseif(strncmp((constchar*)p+strlen("Content-Encoding:"),"deflate",strlen("deflate"))==0) {content_encoding=ce_DEFLATE;}}if((p=(u_char*)str_str((char*)pdata,segment_size,"Content-Type:",strlen("Content-Type:")))!=0) { p+=strlen("Content-Type:"); u_char*end=(u_char*)str_str((char*)p,segment_size-(p-pdata),"\r\n",strlen("\r\n")); if(end!=NULL) { memcpy(content_type,p,end-p); }}if((p=(u_char*)strstr((constchar*)pdata,"Content-Length"))!=0) { total_require_file_length=getlen((u_char*)p+strlen("Content-Length")); pkg_data=(u_char*)str_str((char*)pdata,segment_size,"\r\n\r\n",strlen("\r\n\r\n")); if(pkg_data!=0) { pkg_data+=strlen("\r\n\r\n"); } pnode=store_file.find(ack,sport,dport);store_file.init_first_seq(pnode,seq);分析HTTP响应信息的流程图如图3-9所示。图3-9分析HTTP响应信息的流程图3.4.3数据包信息还原模块本模块首先使用find(ack,sport,dport)获得该数据包的信息,通过函数node_isempty()判断该数据包的data有效长度是否为0,如果不为0,则通过函数have_inserted_first_data()判断该数据包是否已经加入过httpdata内容,如果没有,则调用函数init_first_seq()初始化seq,然后使用函数insert_first_data插入数据包的第一条data内容;如果已经加入过data内容,则继续加入当前分片的data内容。然后通过函数get_complete_percent()判断当前数据包是否完整,如果不完整则完成data内容的处理;如果是完整的,则通过函数serialstream()重组当前数据包,最后把所有分片的内容整合在一起,写入文件。详细代码见附录1。以下是HTTP消息体处理流程图,如图3-10。图3-10HTTP消息体处理流程图
第4章调试总结4.1捕获数据包模块4.1.1问题总结在使用了pcap_findalldevs,调试时发现已经是正常网卡,却无法捕获数据包。解决办法:在调试时看看是否网卡的前面还有如:rpcap://这样的字段,这可能是因为没有注意pcap_findalldevs,pcap_findalldevs_ex,pcap_open,pcap_open_live这几个函数的区别的原因,通过参考WinPcap开发手册,里面有这样的字段Thefollowingformatsarenotallowedas'source'strings:rpcap://[toopenthefirstlocaladapter]
rpcap://hostname/[toopenthefirstremoteadapter]
在上面的2种找网卡的打开方式中,有的打开是没有rpcap://这种字段的,有的却有。有没有这个字段,后面的操作是不一样的,有的需要使用pcap_createsrcstr()来创建正确的字段,所以一定要注意了。在MFC下开发的问题,不要使用在Dos下开发时常用的pcap_loop而要选用pcap_next_ex等替代函数,这样才不会有回掉函数的那个问题。以上没有问题,还是抓不到包,可能是WinPcap没有工作。察看pcap_open或pcap_open_live函数中的延迟参数设置,一般设到1000(ms),因为如果是在主线程下捕获,延迟设置过小(一般200ms以下就不稳定了)会使WinPcap无法工作,多线程下没有这个问题,设到1都可以正常工作。4.1.2捕获数据包模块运行结果捕获数据包模块运行结果如图4-1所示。
图4-1捕获数据包模块运行结果4.2数据包重组模块4.2.1问题总结程序运行时出错unknownsoftwareexception(0x80000003),位置为0x7c92120e。如图4-2所示。图4-2数据包重组模块出错图分析:在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块"应该可用"的内存,但不知为什么,这个预料中可用的光标已经失效了。有可能是"忘记了"向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而"没有留意"等等。注销了的内存被系统回收,其访问权就不再属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图"违法"的程序唯一的下场就是被操作终止执行,回收全部资源。因此,在使用动态分配的应用程序,先进行初始化且确保分够足够的内存区以供使用。在本模块中,函数serialstream()里面的一条语句:char*namebuf=(char*)calloc(sizeof(char),strlen(this->filename)+1);使用的是malloc()函数来分配内存空间。malloc()函数和calloc()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。calloc()函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。4.2.2数据包重组模块运行结果数据包重组模块运行结果如图4-3所示。图4-3数据包重组模块运行结果4.3数据包还原模块4.3.1问题总结程序调试无错误,单步调试可看到各变量的值,但生成的exe无法正确显示ListCtrl控件的值。解决办法:首先检查添加响应自定义的消息的步骤是否出错。添加WM_TIMER的消息响应函数OnTimer,这时在所在类的*.H文件看到增加了的消息函数声明afx_msgvoidOnTimer(UINT_PTRnIDEvent);在所在类的实现文件*.CPP文件中增加了消息映射ON_WM_TIMER()和实现消息处理函数CmonitorDlg::OnTimer(UINT_PTRnIDEvent),也就是也就是说WM_TIMEER消息对应OnTimer函数。经检查无错误。(2)但是发现在线程函数Cappacketlivethread(LPVOIDpParam)捕包分析数据之后无后续处理,一直没有发送向消息队列发送消息。应该是在每次处理完一条完整的数据之后,buf就会有相应的文件被还原出来。于是定义了两个外部变量externintcomplete_data_len;//完成列表使用了的长度externintcomplete_data_last_print;//MFC界面最后输出当处理完一条完整数据后,complet_data_len自加1,如果complete_data_len>complete_data_last_print时,则向消息队列发送WM_TIMER消息SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_TIMER,0,0)。这时ListCtrl控件有相应的信息输出。4.3.2数据包还原模块运行结果打开buf文件夹,可看到数据包还原的各类文件,如图4-4所示:图4-4数据包还原模块运行结果4.4基于数据包分析的网页还原系统基于数据包分析的网页还原系统运行结果如图4-5所示。
图4-5基于数据包分析的网页还原系统运行结果
第5章总结5.1已完成的工作本文围绕网络数据包截获、数据包协议分析与重组、数据包还原进行研究,主要做了以下几方面的工作:(1)概要地分析了国内外网络数据包信息还原的发展现状和趋势,认识到网络与信息安全是关系到国家安全的一个重点,阐述了网络信息监听与还原的重要性。(2)研究了网络体系结构,阐述了一个基于WinPcap的网络信息监听模块的设计思想,描述了该模块的基本架构、工作流程及实现方法。(3)根据实际需要,研究了协议分析技术,对捕获的信息进行协议分析。着重以应用层HTTP协议为例,进行了协议分析,通过编写程序实现了对网络中的HTTP数据包进行捕获、分析和提取有用信息,得到了网络协议分析技术实际应用的结果。(4)实现了一个融合解决HTTP/1.0和HTTP/1.1协议网页信息还原的通用HTTP协议信息还原系统。5.2展望由于本人在网络数据还原技术的理论基础知识薄弱,仅对网络数据还原技术的基本理论和部分方法进行了研究和编程实现,并没有对算法的运算效率进行研究。在实际客户需求中,用到的算法是多样的,并且要充分考虑到系统的实现效率。考虑到数据挖掘技术在中小型企业的应用,本文的进一步工作有以下内容:(1)研究给出的基于WinPcap的网络信息监听系统的设计和实现是单机运行的,难以适用于网络数据流量很大并且有多个数据采集器的应用环境。为了适应此应用环境,需要进一步研究基于分布式处理的数据还原中心实现方案。(2)该系统没有实现对已还原的网页信息进行自动化处理,没有智能地分析出含有有害或不安全的网页信息,可朝着这一方向做个智能化处理系统。
参考文献[1]谭敏生,汤亮.基于HTTP的网络数据包还原技术研究[J].计算机技术与发展,2007,17(6):176.[2]邓硕,基于网络数据包的网页信息还原实现技术研究[D].武昌:华中科技大学.2007.[3]陈晓苏,邓硕,熊兵.基于HTTP1.1的WEB信息还原关键技术研究[J].电脑开发与应用,2008,20(4):48.[4]王津林,赵满胜.网络监控系统在局域网的应用[J].信息安全与通信保密,2004(2):58-59.[5]武苍林.Web技术发展综述[J].电脑与信息技术,2000,5(2):48-50.[6]BalachanderKrishnamurthyJenniferRexford.WebProtocolsandPractice[M].北京:科学出版社,2007:3-4.[7]CNNIC.第17次中国互联网络发展状况统计报告[R].北京:中国互联网络信息中心,2006.[8]孙锐,赵战生.隐私权"撞击"网络监控.信息网络安全[J],2003,6(7):25-26.[9]彭祚鹏,基于协议分析的网络信息还原及挖掘[D].成都:成都理工大学.2008.[10]尤文坚.利用WinPcap捕获网络底层数据包的方法[J].科技资讯,2006,8(25):84.[11]刘文涛.网络安全开发包详解[M].北京:电子工业出版社,2005:4-5.[12]甘刚,Linux/Unix网络编程[M].北京:中国水利水电出版社,2008:12-13.[13]刘文涛.网络安全编程技术与实力[M].北京:机械工业出版社,2008:183-185,222-223.[14]RFC2616,NetworkWorkingGroup[S],北京:中国标准出版社,1999.[15]LloydWood,PeterHolliday,DanielFloreani.MovingdatainDTNswithHTTPandMIME[R].London:CentreforCommunicationSystemsResearch,2009.[16]郭荷清,刘正喜.使用压缩技术改善WebService的传输性能[J].计算机应用与软件,2006,23(6):102-104.
附录1各模块详细代码1.数据包捕获模块部分代码voidCmonitorDlg::OnBnClickedBtnStart()//"开始截包"Button消息响应函数{ CButton*btn_start=(CButton*)GetDlgItem(ID_BTN_START); CButton*btn_stop=(CButton*)GetDlgItem(ID_BTN_STOP); CButton*btn_close=(CButton*)GetDlgItem(IDC_BTN_CLOSE); btn_start->EnableWindow(false); btn_close->EnableWindow(false); btn_stop->EnableWindow(true); is_cap_data=true; AfxBeginThread(Cappacketlivethread,GetSafeHwnd()); listctrl_column_clear(); OnTimer(1);}UINTCappacketlivethread(LPVOIDpParam)//线程函数 { intres; structpcap_pkthdr*header; constu_char*pkt_data; list_node*pnode=0; //AfxMessageBox("cap"); while(is_cap_data) { if((res=pcap_next_ex(adhandle,&header,&pkt_data))>=0) { packet_handler(header,pkt_data); if(complete_data_len>complete_data_last_print) { //想消息队列发送WM_TIMER消息 SendMessage(::AfxGetApp()->m_pMainWnd->m_hWnd,WM_TIMER,0,0); } } } return0;}2.数据包分析模块部分代码voidpacket_handler(conststructpcap_pkthdr*header,constu_char*pkt_data){ if((unsignedlong)pkt_data>0xcccccccc) { return; } structtm*ltime; chartimestr[16]; time_tlocal_tv_sec; ethernet_header*eh;//Ethernet头 size_t ethernet_len=0;//Ethernet封包长度 eh=(ethernet_header*)pkt_data;//获得Ethernet头部的位置 ethernet_len=header->len; local_tv_sec=header->ts.tv_sec; //将时间戳转换成可识别的格式 ltime=localtime(&local_tv_sec); strftime(timestr,sizeoftimestr,"%H:%M:%S",ltime); if(header->len!=0) { decEthernet(eh,ethernet_len); } }voiddecEthernet(constethernet_header*eh,size_tethernet_len){ size_tethernet_header_len=0; //Ethernet头长度 mac_addresssmac={0,0,0,0,0,0};//MAC发送地址 mac_addressdmac={0,0,0,0,0,0};//MAC接收地址 ip_header*ih; //IP头 size_tip_len=0; //IP封包长度 ethernet_header_len=sizeof(ethernet_header);//获得Ethernet头长度 ih=(ip_header*)((u_char*)eh+ethernet_header_len);//获得IP数据包头部的位置 ip_len=ethernet_len-ethernet_header_len;//获得IP数据包长度 smac.byte1=eh->smac.byte1;//获得MAC地址 smac.byte2=eh->smac.byte2; smac.byte3=eh->smac.byte3; smac.byte4=eh->smac.byte4; smac.byte5=eh->smac.byte5; smac.byte6=eh->smac.byte6; dmac.byte1=eh->dmac.byte1; dmac.byte2=eh->dmac.byte2; dmac.byte3=eh->dmac.byte3; dmac.byte4=eh->dmac.byte4; dmac.byte5=eh->dmac.byte5; dmac.byte6=eh->dmac.byte6; decIP(ih,ip_len);}voiddecIP(ip_header*ih,size_tip_len){ size_tip_header_len=0; //IP头长度 ip_addresssaddr={0,0,0,0};//发送端地址 ip_addressdaddr={0,0,0,0};//接收端地址 tcp_header*th; //TCP头 size_tTCP_len=0; //TCP封包长度 udp_header*uh; //UDP头 size_tUDP_len=0; //UDP封包长度 ip_header_len=(ih->ver_ihl&0xf)*4;//获得IP头长度 saddr.byte1=ih->saddr.byte1;//提取ip saddr.byte2=ih->saddr.byte2; saddr.byte3=ih->saddr.byte3; saddr.byte4=ih->saddr.byte4; daddr.byte1=ih->daddr.byte1; daddr.byte2=ih->daddr.byte2; daddr.byte3=ih->daddr.byte3; daddr.byte4=ih->daddr.byte4; switch(ih->proto) { case01: //printf("ICMP\n"); break; case02: //printf("ICMP\n"); break; case06: //printf("TCP\n"); th=(tcp_header*)((u_char*)ih+ip_header_len);//获得TCP首部的位置 TCP_len=ip_len-ip_header_len; decTcp(th,TCP_len,saddr,daddr); break; case17: //printf("UDP\n"); break; case89: //printf("OSPF\n"); break; default: //printf("notdefine\n"); break; }}voiddecTcp(consttcp_header*th,size_ttcp_len,ip_addresssaddr,ip_addressdaddr){ u_char*pTCP_data=0; //TCP数据段头指针(紧接着TCP头后面) size_ttcp_header_len=0; //TCP头长
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外贸参展课件下载指南
- 双十二战略解析
- 双十二服装营销全攻略
- 2007年上海高考英语真题及答案
- 《仓储管理实务》课件
- 幼儿园小班科学《水果百宝箱》课件
- 2025合作伙伴委托培训合同
- 2025聚氯乙烯塑料地板铺设合同
- 《夜晚的霓虹灯》小学语文课件
- 外贸单证商业发票课件
- 压花艺术-发现植物之美智慧树知到期末考试答案2024年
- (2024年)全新心肺复苏幻灯片课件
- 杏核破壳机的设计
- 部编版二年级语文下册全册大单元整体作业设计
- 肠内营养泵的使用护理课件
- 想成为一个什么样的人
- 量化投资策略开发报告总结
- Python程序设计项目化教程
- 2023年江苏省南京交通职业技术学院招聘30人笔试参考题库(共500题)答案详解版
- IATF16949内外部审核资料清单按条款
- 2023高压电气设备减隔震设计规程
评论
0/150
提交评论