网络嗅探器的论文08212.doc
本科毕业论文(设计)题目 网络嗅探器的开发与设计摘 要随着网络技术的迅速发展和网络应用的普及,越来越多的信息资源在互联网上共享,网络的安全性和可靠性显得越发重要。嗅探技术作为网络安全攻防中最基础的技术,既可以用于获取网络中传输的大量敏感信息,也可以用于网络管理。通过获取网络数据包的流向和内容等信息,可以进行网络安全分析和网络威胁应对。本文对网络嗅探技术进行了简要分析,研究了网络数据包的捕获机制,利用原始套接字在windows平台下通过vc+编写了网络嗅探器程序,完成了对数据包捕获及分析,协议过滤的主要功能,实现了对网络协议,源IP地址,目标IP地址及端口号等信息的显示。关键词:网络嗅探;数据包;原始套接字;vc+ABSTRACTAlong with the rapid development of network technologies and the popularization of network applications, more and more information resources are put on internet.The network security and reliability become important increasingly. Sniffing network security technology as the most basic offensive and defensive techniques, both used to obtain a large number of network transmission of sensitive information can also be used for network management. Access to network packets through the flow and content and other information, can be network security threat analysis and response networks. Therefore, the network sniffer is of great significance.This thesis briefly analyzed the technology of network sniffer, and researched the capture mechanism of network data packets.The thesis uses raw sockets on windows vc+ platform to realize one sniffer which packet capture and analysis of data, protocol filtering of the main functions, the realization of network protocol, source IP address, destination IP address and port number and other information display.Key words: network sniffer;capture data;raw sockets;vc+目 录摘 要IABSTRACTII第一章 前言11.1 研究目的和意义11.2 国内外研究现状11.3 网络嗅探器的相关拓展2第二章 网络嗅探器的基本原理52.1 网络嗅探器的概述52.2 网络嗅探的原理52.3 网络嗅探的检测和防范62.4 数据包捕获机制72.4.1 WinPcap包捕获机制82.4.2 套接字包捕获机制9第三章 网络嗅探器的设计123.1 利用套接字开发网络嗅探器的步骤123.2 嗅探器的具体实现原理133.3 数据包捕获模块设计163.4 数据包分析模块设计163.5 数据包的显示18第四章 网络嗅探器的测试与实现19结论21参考文献22致 谢23第一章 前言1.1 研究目的和意义网络技术的日新月异发展突飞猛进,加速了全球信息化进程,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。网络安全问题变得越来越严重。现在,全球每年关于网络安全问题的损失是巨大的。每年关于网络安全的报道层出不穷,产生的损失越来越大,为解决网络安全问题而投入的资金也越来越多。网络安全问题严重影响了人们的生活和工作,以至整个国家的安全。它可能对国家的重大部门造成严重后果,因为现在大多数部门都实现了网络信息的系统,这样的网络安全问题提供了可能产生的土壤。根据网络安全技术发展分析一文中的数据,2007年以来网络监听技术出现了新的重要特征,传统的Sniffer技术是被动的监听网络通信,用户名和口令,而新的Sniffer技术则主动地控制通信数据。我们通过对网络嗅探器的数据包捕获与分析功能的进一步了解,才能做到知己知彼,有针对行地获取所需要的信息,利于对这些信息进行网络安全分析和网络威胁应对。因此,对网络嗅探器的研究具有重要意义。1.2 国内外研究现状目前已经有不少的嗅探工具,譬如在Windows环境下,最富盛名的工具是Netxray,Sniffer pro,在UNIX环境下是sniffer和snoop,以及同时支持Linux和windows平台的Ethereal等工具都是比较常见的。网络嗅探器实际是一把双刃剑,通过使用网络嗅探器可以把网卡设置于混杂模式,并可以实现对网络上传输的数据包的捕获与分析,此分析结果可供网络安全分析之用,也可以为黑客发动进一步的攻击提供有价值的信息。虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络安全方面,目前使用最广泛的TCP/IP协议存在很多安全缺陷,网络嗅探器可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。我们通过对网络嗅探器的数据包捕获与分析功能进一步了解,才能做到知己知彼,有针对性的获取所需要的信息,利用对这些休息进行网络安全协议和网络威胁应对。Sniffer中文翻译过来就是嗅探器,在当前网络技术中使用的非常得广泛。Sniffer既可以做为网络故障的诊断工具,已可以做为黑客嗅探和监听的工具。最近两年,网络嗅探监听(sniffer)技术出现了新的重要特征。传统的sniffer技术是被动地监听网络通信,用户名和口令。而新的sniffer技术出现了主动地控制通信数据的特点,把sniffer技术扩展到了一个新的领域,Sniffer技术除了目前在传统的网络侦测管理外,也开始被应用于在咨询保全的领域。可以这样说,sniffer技术是一把双刃剑,如何更好的利用它,了解它的一些特性,将能使用这项技术更好的为我们需求带来便利。Sniffer的编程方法比较通用的有以下几种:1) winpcap这是一个比较通用的库,相信做过抓包的工具大多人都不会陌生。2) raw socket在2000以后的版本都比较支持此项功能,2000server有个网络监视器就是基于raw socket。3) tdi,ndis,spi,hook socket技术,这种技术比较大的不同是,可以将包截取而不仅仅是获得包的一份拷贝。实际应用中的Sniffer还分软,硬两种。软件Sniffer的优点在于比较便宜,易于学习使用,同时也易于交流,缺点是往往无法抓取网络上所有的传输(不如碎片),某些情况下也就可能无法真正了解网络的故障和运行情况;硬件的Sniffer通常称为协议分析仪,一把都比较昂贵,它的优点恰恰是软件Sniffer所欠缺的,但是昂贵是它的致命的缺点。因此目前流行的Sniffer工具都是软件的。1.3 网络嗅探器的相关拓展网络监听是黑客们常用的一种方法。当成功地登录进一台网络上的主机,并取得了这台主机的超级用户的权限之后,往往要扩大战果,尝试登录或者夺取网络中其他主机的控制友。而网络监听则是一种最简单而且最有效的方法,它常常能轻易地获得用其他方法很难获得的信息。在网络上,监听效果最好的地方是在网关、路由器、防火墙一类的设备处,通常由网络管理员来操作。使用最方便的是在一个以太网中的任何一台上网的主机上,这是大多数黑客的做法。在电话线路和无线电、微波中监听传输的信息比较好理解,但是人们常常不太理解为什么局域网中可以进行监听。甚至有人问:能不能监听不在同一网段的信息。下面就讲述在以太网中进行监听的一些原理。在令牌环中,道理是相似的。 对于一个施行网络攻击的人来说,能攻破网关、路由器、防火墙的情况极为少见,在这里完全可以由安全管理员安装一些设备,对网络进行监控,或者使用一些专门的设备,运行专门的监听软件,并防止任何非法访关。然而,潜入一台不引人注意的计算机中,悄悄地运行一个监听程序,一个黑客是完全可以做到的。监听是非常消耗CPU资源的,在一个担负繁忙任务的计算机中进行监听,可以立即被管理员发现,因为他发现计算机的响应速度令人惊奇慢。 对于一台连网的计算机,最方便的是在以太网中进行监听,只须安装一个监听软件,然后就可以坐在机器旁浏览监听到的信息了。以太网协议的工作方式为将要发送的数据包发往连在一起的所有主机。在包头中包含着应该接收数据包的主机的正确地址。因此,只有与数据包中目标地址一致的那台主机才能接收信包。但是,当主机工在监听模式下,无论数据包中的目标物理地址是什么,主机都将接收。 在Internet上,有许多这样的局域网。几台甚至十几台主机通过一条电缆一个集线器连在一起。在协议的高层或用户看来,当同一网络中的两台主机通信时,源主机将写有目的主机IP地址的数据包发向网关。但是,这种数据包并不能在协议栈的高层直接发送出去。要发送的数据包必须从TCP/IP协议的IP层交给网络接口,即数据链路层。 网络接口不能识别IP地址。在网络接口,由IP层来的带有IP地址的数据包又增加了一部分信息:以太帧的帧头。在帖头中,有两个域分别为只有网络接口才能识别的源主机和目的主机的物理地址,这是一个48位的地址。这个48位的地址是与IP地址对应的。也就是说,一个IP地址,必然对应一个物理地址。对于作为网关的主机,由于它连接了多个网络,因此它同时具有多个IP地址,在每个网络中,它都有一个。发向局域网之外的帧中携带的是网关的物理地址。在以太网中,填写了物理地址的帧从网络接口中,也就是从网卡中发送出去,传送到物理的线路上。如果局域网是由一条粗缆或细缆连接机而成,则数字信号在电缆上传输,信号能够到达线路上的每一台主机。当使用集线器时,发送出去的信号到达集线器,由集线器再发向连接在信线器上的每一条线路。于是,在物理线路上传输的数字信号也能到达连接在集线器上的每一主机。 数字信号到达一台主机的网络接口时,在正常情况下,网络接口读入数据帧,进行检查,如果数据帧中携带的确良物理地址是自己的,或者物理地址是广播地址,则将数据帧交给上层协议软件,也就是IP层软件,否则就将这个帧丢弃。对于每一个到达网络接口的数据帧,都要进行这个过程。然而,当主机工作在监听模式下,则所有的数据帧都将被交给上层协议软件处理。 局域网的这种工作方式,一个形象的例子是,大房间就像是一个共享的信道,里面的每个人好像是一台主机。人们所说的话是信息包,在大房间中到处传播。当我们对其中某个人说话时,所有的人都能听到。但只有名字相同的那个人,才会对这些话语做出反映,进行处理。其余的人听到了这些谈话,只能从发呆中猜测,是否在监听他人的谈话。当连接在同一条电缆或集线器上的主机被逻辑地分为几个子网时,如果一台主机处于监听模式下,它还能接收到发向与自己不在同一子网(使用了不同的掩码、IP地址和网关)的主机的那些信包。也就是说,在同一条物理信道上传输的所有信息都可以被接收到。另外,要说明的是,Internet中使用的大部分协议都是很早设计的,许多协议的实现都是基于一种非常友好的,通信的双方充分信任的基础之上。因此,直到现在,网络安全还是非常脆弱的。在通常的网络环境下,用户的所有信息,包手户头和口令信息都是以明文的方式在网上传输。因此,对于一个网络黑客和网络攻击者进行网络监听,获得用户的各种信息并不是一件很困难的事。只要具有初步的网络和TCP/IP协议知识,便能轻易地从监听到的信息中提取出感兴趣的部分。首先,网络监听软件运行时,需要消耗大量的处理器时间,如果在此时,就详细地分析包中的内容,许多包就会来不信接收而漏掉。因此,网络监听软件通常都是将监听到的包存放在文件中,待以后再分析。其次,网络中的数据包非常复杂,两台主机之间即使连续发送和接受数据包,在监听到的结果中,中间必然会夹杂了许多别的主机交互的数据包。监听软件将同一TCP会话的包整理到一起,已经是很不错了。如果还希望将用户的详细信息整理出眯,需要根据协议对包进行大量的分析。面对网络上如此众多的协议,这个监听软件将会十分庞大。第二章 网络嗅探器的基本原理2.1 网络嗅探器的概述网络嗅探器又称为网络监听器,简称为Sniffer子系统,放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,这些数据可以是用户的账号和密码,可以是一些商用机密数据等等。Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的一种工具。Sniffer的正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。而嗅探器也可作为攻击工具被黑客所利用为其发动进一步的攻击提供有价值的信息。2.2 网络嗅探的原理嗅探器是一种常用的收集有用数据的方法,嗅探器是利用计算机的网络接口截获目的地为其它计算机的数据报文的一种工具。由于组网方式不同,嗅探器的工作原理也有所不同,总共可以分为三类:1、基于网卡混杂模式的嗅探原理;2、基于ARP欺骗的网络嗅探原理;3、基于中间人攻击的嗅探原理。本次设计就是利用第一种方式来实现嗅探器的功能,可见监听到所有流经同一以太网网段的数据包,这是一种被动嗅探的方式。从以太网的工作原理来看,数据传输是基于“共享”的,所有的同一本地网范围内的计算机共同接收到相同的数据包,这意味着计算机直接的通讯都是透明可见的。正是因为这样的原因,以太网卡都构造了硬件的“过滤器”,这个过滤器将忽略掉一切和自己无关的网络信息,事实上时忽略掉了与自身MAC地址不符合的信息。从网卡原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据包,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式:(1)广播方式:该模式下的网卡能够接收网络中的广播信息;(2)组播方式:设置在该模式下的网卡能够接收组播数据;(3)直接方式:在这种模式下,只有目的网卡才能接收该数据;(4)混杂模式:在这种模式下的网卡能够接收一切通过它的数据。而本次设计嗅探工具正是利用了这个特点,把网卡设置为“混杂模式”。因此,嗅探程序就能够接收到整个以太网内的网络数据信息了,而不管该数据是否是传给它的。正常模式和混杂模式的两者对比如图2.1所示:图2.1 网卡对数据包的处理方式2.3 网络嗅探的检测和防范网络监听是很难被发现的,因为运行网络监听的主机只是被动地接收在局域局上传输的信息,不主动的与其他主机交换信息,也没有修改在网上传输的数据包。51. 对可能存在的网络监听的检测(1)对于怀疑运行监听程序的机器,用正确的IP地址和错误的物理地址ping,运行监听程序的机器会有响应。这是因为正常的机器不接收错误的物理地址,处理监听状态的机器能接收,但如果他的IP stack不再次反向检查的话,就会响应。(2)向网上发大量不存在的物理地址的包,由于监听程序要分析和处理大量的数据包会占用很多的CPU资源,这将导致性能下降。通过比较前后该机器性能加以判断。这种方法难度比较大。(3)使用反监听工具如antisniffer等进行检测2. 对网络监听的防范措施(1)从逻辑或物理上对网络分段网络分段通常被认为是控制网络广播风暴的一种基本手段,但其实也是保证网络安全的一项措施。其目的是将非法用户与敏感的网络资源相互隔离,从而防止可能的非法监听。(2)以交换式集线器代替共享式集线器对局域网的中心交换机进行网络分段后,局域网监听的危险仍然存在。这是因为网络最终用户的接入往往是通过分支集线器而不是中心交换机,而使用最广泛的分支集线器通常是共享式集线器。这样,当用户与主机进行数据通信时,两台机器之间的数据包(称为单播包Unicast Packet)还是会被同一台集线器上的其他用户所监听。因此,应该以交换式集线器代替共享式集线器,使单播包仅在两个节点之间传送,从而防止非法监听。当然,交换式集线器只能控制单播包而无法控制广播包(Broadcast Packet)和多播包(Multicast Packet)。但广播包和多播包内的关键信息,要远远少于单播包。(3)使用加密技术数据经过加密后,通过监听仍然可以得到传送的信息,但显示的是乱码。使用加密技术的缺点是影响数据传输速度以及使用一个弱加密术比较容易被攻破。系统管理员和用户需要在网络速度和安全性上进行折中。(4)划分VLAN运用VLAN(虚拟局域网)技术,将以太网通信变为点到点通信,可以防止大部分基于网络监听的入侵。2.4 数据包捕获机制纵观国内外在网络嗅探技术中所使用的包捕获机制的方法,大致可归纳为两类:一类是由操作系统内核提供的捕获机制;另一类是由应用软件或系统开发包通过安装包捕获驱动程序提供的捕获机制,该机制主要用于Win32平台下的开发。操作系统提供的捕获机制主要有四种:BPF(Berkeley packet Filter),DLPI (Data Link Provider Interface),NIT(Network Interface Tap), Sock Packet类型套接口。BPF由基于BSD的Unix系统内核所实现。DLPI是Solaris(和其它System V Unix)系统的内嵌子系统。从性能上看, Sock Packet最弱。Windows操作系统没有提供内置的包捕获机制。它只提供了数量很少并且功能有限的API调用。WinPcap(Windows Packet Capture)是Win32上的第一个用来捕获数据包的开放系统软件包,它是一种新提出的强有力并且可扩展的框架结构。WinPcap包含了一系列以前系统所没有的创新特性。本文将对目前比较流行的WinPcap软件包提供的捕获机制进行简单介绍。2.4.1 WinPcap包捕获机制WinPcap的体系结构如图2.2所示:NetworkLeverAplicationKernlLeverPacketsUser codeCall WinpcapUser codeCall WinpcapUser codeMonitoringWpcap.dllWpcap.dllWpcap.dllWpcap.dllWpcap.dllUser-buffer1User-buffer2User codeDirectaccess tothe NPFpacket.dllcallsPacket.dllStatisticalFilter1Filter2Filter3KernelBuffer2KernelBuffer2NIC Driver(NDIS 3.0 or higher)OtherProtoclStacksUserNetgroupPacker filterNPF图2.2 Winpcap的体系结构由WinPcap体系结构图可以看出它采用的是分层化的驱动程序模型,并包含有三个组件: 1.内核级的数据包捕获驱动程序 2.低级的动态连接库(Packet.dll) 3.高级系统无关库(Wpcap.dll)WinPcap(Windows Packet Capture)是由微软资助的一个项目,其核心仍是基于NDIS的,但它对NDIS进行封装,它是Windows平台下一个免费、公共的网络访问系统,它为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:1.捕获原始数据报,包括在共享网络上各主机发送/接收以及相互之间交换的数据报;2.在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;3.在网络上发送原始的数据报;4.收集网络通信过程中的统计信息。在Windows NT下WinPcap包捕获驱动和网卡设备驱动的交互是通过NDIS(Network Device Interface Specification)来实现的。而且包捕获驱动既与网络驱动通信又与用户应用程序通信,所以它在NDIS结构中如同一个协议驱动,对WindowsNT操作系统中的NDIS结构中的高端驱动进行编程,这样编制的程序与上层应用程序更容易连接,应用程序对驱动设置的工作也更方便。如图2.3所示:应用程序应用程序协议驱动包捕获驱动NIC驱动数据包核心层网络层 图2.3 包捕获驱动在NDIS中所处位置2.4.2 套接字包捕获机制上世纪80年代初,加利福尼亚大学Berkeley分校在UNIX操作系统下实现了TCP/IP协议,它们为TCP/IP网络通信开发了一个应用程序接口(API),这个API称为socket(套接字)接口。Socket给程序员提供了一个高层接口,它的出现使得程序员在编写网络应用程序时只需要调用函数,对网络的底层细节并不需要精通,因此十分方便。socket实质上是提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须拥有各自的电话机一样。在网间和网内部,每一个socket用一个半相关描述:协议,本地地址,本地端口一个完整的socket连接则用一个相关描述:协议,本地地址,本地端口,远地地址,远地端口每一个socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket是面向客户服务器模型而设计出来的,针对客户和服务器程序提供不同的socket系统调用。客户随机申请一个socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的socket(在LINUX中,/etc/services用于存储全局公认的socket号),任何客户都可以向它发出连接请求和信息请求。下面我们一一给出重要的socket系统调用。函数socket()可以创建一个socket对象,socket()函数的原型如下:SOCKET socket(int af, int type, int protocol);创建一个socket实际上是向系统申请一个属于自己的socket号。af(Address Family)俗称套接字地址族,如表2.1所示:表2.1 Linux支持的套接字地址族套接字地址族描述UNIXUNIX域套接字INET通过TCP/IP协议支持的Internet地址族AX25Amater radio X25IPXNovell IPXAPPLETALKAppletalk DDPX25X25 协议族、socket类型和协议常用的组合如表2.2所示:表2.2 系统调用三参数组合关系协议族(af)Socket类型(type)协议(UNIX表示)实际协议AF_INETSock_DGRAMIPPROC_UDPUDPSock_STREAMIPPROC_TCPTCPSock_RAMIPPROC_ICMPICMPSock_RAMIPPROC_RAM某低级协议 指定本地地址使用函数bind()一一绑定socket()系统调用创建socket时,只指定了相关五元组的协议元,没有指定其余四元(本地地址、本地端口、远地地址、远地端口),因此需要别的系统调用加以补充。bind()将本地socket地址(包括本地主机地址和本地端口)与所创建的socket号联系起来,即将本地socket地址赋予socket,以指定本地半相关。其用于Linux性能评估的测试工具的设计与实现调用格式为: bind(sockid, localaddr, addrlen)总的来说,各种socket地址数据结构包括两大部分:地址类型和协议地址。网络协议地址又包括主机地址和端口号。监听 listen()对于服务器来说,在它接受客户机的连接之前,首先要监听。只有进入了监听模式,才能接受来自客户机的连接。这一点可以通过listen()函数来实现,它的原型如下:int listen(SOCKET s, int backlog);各参数意义如下:s:进行监听的套接字。Backlog:正在等待连接的最大队列的长度。如果backlog的只为3,有4个客户机同时发出连接请求,则前3个会放在等待连接队列中,最后一个将被忽略。如果函数成功,则返回0;否则返回SOCKET_ERROR。当客户机和服务器的连接建立起来后,用函数send()和recv()来进行数据传输。第三章 网络嗅探器的设计3.1 利用套接字开发网络嗅探器的步骤利用套接字开发网络嗅探器程序时的一般步骤如图3.1所示:关闭套接字是开始建立套接字绑定套接字设置网卡为混杂模式初始化数据包接收结构停止接收分析处理数据包否开始捕获显示分析结果 图3.1 嗅探器工作流程如图3.1所示,在利用套接字开发网络嗅探器程序时的一般步骤是:首先,创建原始套接字,并设置其操作选项;其次将原始套接字绑定到本地网卡地址上;设置网卡为混杂模式,这样网卡就可以收到任何在网络中传输的数据包;在以上条件下开始对数据包进行捕获、分析。3.2 嗅探器的具体实现原理嗅探器作为一种网络通讯程序,是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而本设计的要求通过网络嗅探器从网卡接收所有经过它的数据包,因此,在该系统中将网卡以混杂模式替代通常的正常模式。 具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过WSAIoctl ()来进行设置。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构,数据包的总体结构如表3.1所示:表3.1 数据包总体结构 数据包Ip头 tcp头(或其他信息) 数据 数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如表4.2所示: 表3.2 UDP 数据段头格式16位 16位源端口 目的端口Udp端口 udp效验和对于此UDP数据段头的分析在编程实现中可通过数据结构UDPPacketHead来定义:struct UDPPacketHead WORD SourPort; /源端口WORD DestPort; /目的端口WORD Len; /长度WORD ChkSum; /校验和;而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,表3.3给出TCP数据段头的格式组成: 表3.3 TCP数据段头格式16位 16位 源端口 目的端口 顺序号 确认号 TCP头长 (保留)7位 URG ACK PSH RST SYN FIN 窗口大小 校验和 紧急指针 可选项(0或更多的32位字) 数据(可选项) 对于此TCP数据段头的分析在编程实现中可通过数据结构TCPPacketHead来定义: Typedef struct_TCP WORD SrcPort; /源端口WORD DstPort; /目的端口DWORD SeqNum; /序列号DWORD AckNum; /位确认号BYTE DataOff; /TCP 头长 BYTE Flags; /标志(URG、ACK等) WORD Window; /窗口大小 WORD CHKSUM; / 校验口 WORD Urgptr; /紧急指针TCP;typedef TCP *LPTCP;typedef TCP UNALIGNED *ULPTCP;在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据段头格式如表3.4所示: 表3.4 IP数据段头格式16位 16位 版本 IHL 服务类型 总长 标识 标志 分段偏移 生命期 协议 头校验和 源地址 目的地址 选项(0或更多) 同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义: typedef struct _IP unionBYTE Version; /版本 BYTE HdrLen; /IHL; BYTE ServiceType; /服务类型 WORD TotalLen; /总长 WORD ID; /标识 Union WORD Flags; /标志 WORD FragOff; /分段偏移; BYTE TimeToLive; /生命期 BYTE Protocol; /协议 WORD HdrChksum; /头校验和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /选项IP;Typedef IP * LPIP; Typedef IP UNALIGNED * ULPIP; 在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。3.3 数据包捕获模块设计根据前面的设计思路,本文在windows平台下实现了一个嗅探器程序,开发工具使用visual C+。下面就给出本设计的部分程序代码,该设计可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号等信息。代码如下: /检查 Winsock 版本号,WSAData为WSADATA结构对象 WSAStartup(MAKEWORD(2,2),&WSAData);/创建原始套接字 Sock = socker(AF_INET,SOCK_RAW,IPPROTO_RAW); /设置IP头操作选项,其中flag设置为ture,亲自对IP头进行处理 Setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag); /获取本机名Gethostname(char * ) LocalName,sizeof(LocalName) - 1); /获取本地IP地址 pHost = gethostbyname(char *)LocalName); /填充SOCKADDR_IN结构addr_in.sina_addr = * (in_addr *) pHost ->