下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 基于VC局域网内的IP地址监控论文

基于VC局域网内的IP地址监控论文.doc

基于VC局域网内的IP地址监控论文

IT工作者
2012-02-22 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《基于VC局域网内的IP地址监控论文doc》,可适用于IT/计算机领域

局域网内的IP地址监控局域网内的IP地址监控摘要监听(Sniffer)最初是提供给网络管理员的一类极有威力的网络工具使用这类工具可以监视网络的状态、数据流动情况以及网络上传输的信息并利用这些信息来分析网络的性能、排除网络故障。建立在监听技术基础上的网络分析仪是专业网络工程师必不可少的工具其全球市场每年达数十亿美元。在局域网中IP地址的冲突常常发生更有些人盗用他人的IP地址上网。虽然许多操作系统(如Windows)自带IP冲突检测功能但那是一种被动的消极的检测方式它只能检测到局域网中是否IP地址与本机冲突不能解决盗用问题更不能监测整个网络的情况。文中分析了Windows平台上实现的免费数据包捕获工具WinPcap的原理、功能和使用方法介绍了网络嗅探的基本原理、嗅探程序的组成以及协议分析模块的基本知识。还使用MicrosoftVisualC开发的一个基于网络嗅探的IP地址监控程序。关键词:监听网络IP地址监控目录目录………………………………………………………………………………第一章系统分析………………………………………………………………….需求分析…………………………………………………………….可行性分析…………………………………………………………第二章概论……………………………………………………………………….嗅探的基本原理…………………………………………………….网络基础知识……………………………………………………….SNIFFER的基本原理………………………………………………第三章WinPcap论述…………………………………………………………….捕获程序的结构……………………………………………………..用户级:WinDump程序和Libpcap库…………………..内核级:NDIS包捕获驱动器…………………………….Unix系统中的BPF…………………………………………………..tap函数……………………………………………………..包过滤器……………………………………………………..BPF包捕获过程概述…………………………………………..一个重要问题………………………………………………….与NDIS的交互………………………………………………………….兼容性……………………………………………………………………第四章协议分析……………………………………………………………………….链路层支持……………………………………………………………….网络层支持………………………………………………………………第五章系统分析……………………………………………………………………….总体分析………………………………………………………………….模块设计…………………………………………………………………….数据结构(表)……………………………………………………………程序实现…………………………………………………………………………小结………………………………………………………………………………………附录:WPCAP库介绍…………………………………………………………………附录:英文文献及翻译…………………………………………………………………参考文献及站点…………………………………………………………………………第一章系统分析需求分析当今计算机网络及远程通信技术得到了广泛达到的应用Internet已经成功走进了学校公司政府部门乃至许多家庭每天都有新的应用与技术产生。在这种情况下计算机网络的功能日益增加最终用户的数量也越来越多人们对Internet的访问也越来越多网络流量也越来越频繁以前网络收费是靠代理服务器来完成但是随着网络用户数量的不断增加代理服务器的资源越来越少服务器速度越来越慢网络流量计费功能就下降机器已经不堪重负网络的风姿多彩给那些不安分的家伙提供了舞台、黑客攻击、捕获口令、捕获专用的或者机密的信息、危害网络邻居的安全或者用来获取更高级别的访问权限、窥探低级的协议信息等。那有没有什么技术可以使我们能够清楚网络中存在的问题更好的进行网络管理也可以帮助我们解决网络中的各种安全问题呢? 有!那就是Sniffer(嗅探器)。Sniffer的正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。在合理的网络中sniffer的存在对系统管理员是致关重要的系统管理员通过sniffer可以诊断出大量的不可见模糊问题这些问题涉及两台乃至多台计算机之间的异常通讯有些甚至牵涉到各种的协议借助于snifferC系统管理员可以方便的确定出多少的通讯量属于哪个网络协议、占主要通讯协议的主机是哪一台、大多数通讯目的地是哪台主机、报文发送占用多少时间、或着相互主机的报文传送间隔时间等等这些信息为管理员判断网络问题、管理网络区域提供了非常宝贵的信息。可行性分析Sniffer固然可以接受数据但是从可行性角度来看是否行呢?这点不用担心因为嗅探技术已经出现很长时间了现在黑客使用的网络数据的截取进攻服务器帐号密码的获取等等都利用了网络嗅探技术从技术上讲Internet网上出现了各种嗅探方法有Unix上的TcpDump,有应用于Windows和WindowsNT上的WinDump其原理基本上是一样的(关于网络嗅探的原理将在第二章介绍)而且Internet网上还提供了进行网络嗅探开发用的数据开发包供参考此外网上还提供了数据包捕获工具WinPcap,此数据包捕获架构使计算机具有数据包捕获的能力(关于WinPcap的原理功能结构等将在第三章详细介绍)。从功能上讲Sniffer只是从网络中捕获数据并不破坏数据或修改数据而且捕获器需要的资源很低对网络不构成影响可以说是替代服务器计费的好办法。sniffer工作在网络环境中的底层它会拦截所有的正在网络上传送的数据并且通过相应的软件处理可以实时分析这些数据的内容进而分析所处的网络状态和整体布局。值得注意的是:sniffer是极其安静的它是一种消极的安全攻击第二章概论嗅探的基本原理SNIFFER真是一个古老的话题关于在网络上采用SNIFFER来获取敏感信息已经不是什么新鲜事也不乏很多成功的案例那么SNIFFER究竟是什么呢?SNIFFER就是嗅探器可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃听装置,可以用来窃听双方通话的内容而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。SNIFFER可以是软件也可以是硬件既然是软件那就要分平台有WINDOWS下的、UNXI下的等硬件的SNIFFER称为网络分析仪反正不管硬件软件目标只有一个就是获取在网络上传输的各种信息。当你舒适的坐在家里惬意的享受网络给你带来的便利收取你的EMAIL购买你喜欢的物品的时候你是否会想到你的朋友给你的信件你的信用卡帐号变成了一个又一个的信息包在网络上不停的传送着你是否曾经这些信息包会通过网络流入别人的机器呢?你的担忧不是没有道理的因为SNIFFER可以让你的担忧变成实实在在的危险。就好象一个人躲在你身后偷看一样。。。。。。网络基础知识网络基础知识”是不是听起来有点跑题了?虽然听起来这和我们要谈的SNIFF没什么关系可是还是要说一说的万丈高楼平地起如果连地基都没打好怎么盖楼?!如果你对网络还不是十分清楚的话最好能静下心来好好看看要知道这是基础的基础在这里我只是简单的说一下免得到时候有人迷糊详细的最好能够自己去找书看看。()TCPIP体系结构开放系统互连(OSI)模型将网络划分为七层模型分别用以在各层上实现不同的功能这七层分别为:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。而TCPIP体系也同样遵循这七层标准只不过在某些OSI功能上进行了压缩将表示层及会话层合并入应用层中所以实际上我们打交道的TCPIP仅仅有层而已网络上的分层结构决定了在各层上的协议分布及功能实现从而决定了各层上网络设备的使用。实际上很多成功的系统都是基于OSI模型的如:如帧中继、ATM、ISDN等。TCPIP的网络体系结构(部分)从上面的图中我们可以看出第一层物理层和第二层数据链路层是TCPIP的基础而TCPIP本身并不十分关心低层因为处在数据链路层的网络设备驱动程序将上层的协议和实际的物理接口隔离开来。网络设备驱动程序位于介质访问子层(MAC)。()网络上的设备中继器:中继器的主要功能是终结一个网段的信号并在另一个网段再生该信号一句话就是简单的放大而已工作在物理层上。网桥:网桥使用MAC物理地址实现中继功能可以用来分隔网段或连接部分异种网络工作在数据链路层。路由器:路由器使用网络层地址(IP,X,E等)主要负责数据包的路由寻径也能处理物理层和数据链路层上的工作。网关:主要工作在网络第四层以上主要实现收敛功能及协议转换不过很多时候网关都被用来描述任何网络互连设备。()TCPIP与以太网以太网和TCPIP可以说是相互相成的可以说两者的关系几乎是密不可分以太网在一二层提供物理上的连线而TCPIP工作在上层使用位的IP地址以太网则使用位的MAC地址两者间使用ARP和RARP协议进行相互转换。从我们上面TCPIP的模型图中可以清楚的看到两者的关系。载波监听冲突检测(CSMACD)技术被普遍的使用在以太网中所谓载波监听是指在以太网中的每个站点都具有同等的权利在传输自己的数据时首先监听信道是否空闲如果空闲就传输自己的数据如果信道被占用就等待信道空闲。而冲突检测则是为了防止发生两个站点同时监测到网络没有被使用时而产生冲突。以太网采用广播机制所有与网络连接的工作站都可以看到网络上传递的数据。为了加深你的理解我们来看看下面的图一个典型的在以太网中客户与服务器使用TCPIP协议的通信。SNIFFER的原理要知道在以太网中所有的通讯都是广播的也就是说通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据而每一个网络接口都有一个唯一的硬件地址这个硬件地址也就是网卡的MAC地址大多数系统使用比特的地址这个地址用来表示网络中的每一个设备一般来说每一块网卡上的MFC地址都是不同的每个网卡厂家得到一段地址然后用这段地址分配给其生产的每个网卡一个地址。在硬件地址和IP地址间使用ARP和RARP协议进行相互转换。在正常的情况下一个网络接口应该只响应这样的两种数据帧:与自己硬件地址相匹配的数据帧。                                      发向所有机器的广播数据帧。在一个实际的系统中数据的收发是由网卡来完成的网卡接收到传输来的数据网卡内的单片程序接收数据帧的目的MAC地址根据计算机上的网卡驱动程序设置的接收模式判断该不该接收认为该接收就接收后产生中断信号通知CPU认为不该接收就丢掉不管所以不该接收的数据网卡就截断了计算机根本就不知道。CPU得到中断信号产生中断操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据驱动程序接收数据后放入信号堆栈让操作系统处理。而对于网卡来说一般有四种接收模式:广播方式:该模式下的网卡能够接收网络中的广播信息。                                组播方式:设置在该模式下的网卡能够接收组播数据。                                直接方式:在这种模式下只有目的网卡才能接收该数据。                              混杂模式:在这种模式下的网卡能够接收一切通过它的数据而不管该数据是否是传给它的。好了现在我们总结一下首先我们知道了在以太网中是基于广播方式传送数据的也就是说所有的物理信号都要经过我的机器再次网卡可以置于一种模式叫混杂模式(promiscuous)在这种模式下工作的网卡能够接收到一切通过它的数据而不管实际上数据的目的地址是不是他。这实际上就是我们SNIFF工作的基本原理:让网卡接收一切他所能接收的数据。嗅探程序组成一般的网络嗅探系统有如下几部分组成:硬件普通网络适配器或专门硬件后者可以进一步分析硬件错误(如CRC校验错误)信号电压电缆问题等等。捕获驱动程序这是最重要的组成部分它可把总线上捕获的数据信息进行过滤并把你要的数据存储到数据缓冲器中缓冲器用于存储接受的数据实时分析程序它可以对数据包中提出的小部分数据进行分析从而掌握网络运行状况和捕获出错信息解码程序有些网络数据是经过编码的解码程序可以使这些数据还原。混杂模式的设置为了能够捕获网络中的数据包必须改写相关的网卡驱动程序它不仅可以使网卡变成混杂模式还能缓存收到的数据包要编写这个驱动程序你必须深入了解有关的网络编程知识因为程序要直接对硬件进行控制与编程。具体的讲程序要对网络中所有的NIC(网络接口控制)芯片进行编程还要修改网卡的中断服务程序接受数据包并根据一定的规则过滤得到的有用包还要存入缓冲器或写入日志文件供进一步的分析之用。自己编写嗅探程序是非常困难的事情不过我们可以从Internet上得到一些商用或免费的驱动程序,如Winpcap数据包捕获架构。Winpcap是一个架构它使WIN系统增加了利用计算机网卡来捕获网络数据包的能力而且它为应用程序提供了高级的API使应用程序可以很方便地用其网络较低层的功能。Winpcap可以分为三个独立的组成部分:一个包捕获设备驱动器一个低级动态库和一个高级静态库。第三章WinPcap论述Winpcap是一个架构它使Win系统增加了利用计算机网卡来捕获网络数据包的能力而且它为应用程序提供了高级的API使应用程序可以很方便地了用其网络较低层的功能。Winpcap可以分为三个独立的组成部分:一个包捕获设备驱动器一个低级动态库和一个高级静态库。这个架构可以用来生成Windows新的包捕获工具也可以用来移植Unix中已有的应用程序因为它与BPF中的Libpcap是兼容的。本章中我们将会描述Winpcap的结构及其基本原理另外还要解释一些在本书中其他部分用到的概念。注意因为包捕获过程是在数据链路层进行的而该层封装后的数据被称为“帧”因此从较为严格的意义上讲用“帧”一词更为精确但是在本书中我们还是使用了“数据包”一词。捕获程序的结构为了捕获网络中传输的数据包捕获应用程序需要直接与硬件进行交互。因此操作系统应该提供一套与网络适配器进行通信并能直接接收数据的原函数。原函数的任务是从网络捕获数据包(它与网卡的交互过程对应用程序透明)并把接收到的数据传给调用它们的程序。这个过程要密切依赖操作系统来完成所以在不同的操作系统中实现这种架构的过程是不同的。包捕获过程应快而有效它必须能够在大流量的高速局域网上捕获数据包并限制丢包率同时它应使用较少的系统资源。为了在不同类型的应用程序(如网络分析器、网络监视及测试程序等)中使用它应该具有通用性及柔性。用户级的包捕获应用程序从该系统接收、解释并处理数据包并把它们以用户能理解的方式或作为一个产品提供给用户。因此这个包捕获架构必须容易使用独立于操作系统模块化可扩展能支持多种协议。另外由于目前网络协议的种类繁多它们的变化也非常快所以该架构应当能很方便地进行修改以支持其他的协议。总之包捕获架构应该具有非常好的完整性克可扩展性。WinDumpexe由一个运行在内核级的模块和一个运行在用户级的模块(包捕获架构的最高层部分)所组成这两个模块具有不同的目的相互独立。第一个模块直接基于Inter公司的计算机硬件第二个模块则象一个正常的Windows程序一样。内核部分因Windows版本不同而异用户级模块则于Unix中的实现方法相似并且杂爱Windows及WindowsNT中是相同的从网络适配器到具体应用程序(如WinDump)的框架结构如图所示:包捕获架构的最低层是网络适配器它用来直接捕获网络中的数据包。网卡在捕获数据时常常工作在一个特殊的模式(“混杂模式”)它被强迫接收所有的数据包而不仅仅接收只送给它的数据。数据包捕获驱动器时捕获架构的最低级软件模块它时工作在内核级部分的软件为了获得数据它必须于网络适配器交互。它提供了一套用于从网络链路层读和写数据包的函数。Packetdll工作在用户级但它与捕获应用程序是分开的。它是一个隔离捕获应用程序和提供独立于操作系统的捕获接口的驱动器的动态连接库。它可以使WinDump不需要重新编译就可以运行在不同的Windows平台上。Pcap库或者也称为Libpcap是一个静态库它由应用程序调用。Pcap利用了Packetdll输出的服务为应用程序提供了一个较高级别的强大的捕获接口。要注意的是它是一个静态库并且是应用程序的一个组成部分。用户接口是捕获应用程序的较高级部分它管理于用户的交互并且显示捕获的结果。我们将分别描述这些模块它们各自的行为以及影响它们性能的架构选择。用户级:WinDump程序和Libpcap库WinDump程序是捕获架构的最高端部分它负责管理用户和系统间的交互它从用户的命令行输入中获得数据(例如应该捕获哪些包以何中方式显示给用户)以及把结果显示的屏幕从用户的观点来看运行在Windows平台上的WinDump与运行在Unix工作站上的Tcpdump是相同的。这意味着这两个程序有几乎相同的输入参数和相同的输出格式。Unix上的Tcpdump在包捕获过程中利用的一个库被称为数据包捕获库也即Pcap或Libpcap库它是一个用户级的独立于操作系统的接口程序库。Libpcap提供的一整套函数都是独立于操作系统的应用程序利用它们可以从网络中捕获数据包。必须记住的是原始的Libpcap是一个通用意义上的捕获库它与其它网络工具及应用一样被Tcpdump程序调用。Tcpdump不与硬件直接交互而是利用了Libpcap输出的函数来捕获数据包设置包过滤器并与网络适配器进行通信。它基本上是独立于操作系统的可以很容易被移植到那些装有Libpcap库的任何系统。因此WinPcap架构应该完成的一个任务是要把Libpcap库全部移植到Win平台。另外这些Pcap库不仅仅限于用在WinDump中它还可以为那些准备从Unix系统移植网络监视器和分析器的技术人员提供帮助同时也可以成为Win环境下生成新的网络工具的强大基础。因此在我们实行的方案中试图保持Libpcap的原始结构只是在Libpcap与内核的通信部分以及与NDIS包捕获驱动器交互方面作了相应的修改。Winpcap的一个重要特性是只要同一个版本就可以分别正常工作在WindowsNT和等不同的Win平台上。这是由于在Libpcap和包捕获驱动器之间使用了一个称为Packetdll的动态连接库来实现的所以在不同的Windows环境下使用驱动器的系统调用是相同的。同样基于Libpcap的网络工具不需要作任何修改就可以同时工作在Windows和WindowsNT上。一旦Win中的Libpcap成功实现TcpDump的移植就很方便了。在WinDump中只采用了很少的几个改进措施如解决网络适配器名字的差别以及动态内核缓冲器等。内核级:NDIS包捕获驱动器包捕获架构的核心部分最基本的作用是从网络上获取链路层的数据包并不加修改地把它传送到应用层。为了完成这一工作我们在WindowsNT中生成了一个内核驱动器(packetsys)在Windows中生成了一个虚拟设备驱动器(packetoxd)。应用程序可以通过读和写函数来访问包驱动器在某种程度上可把网络适配器当成一个普通文件一样从中读取或写入数据。包捕获驱动器可以用在包括WinDump、网络分析器等任何需要捕获数据包的Win应用程序中。应用程序与包捕获驱动器的交互常常要通过Packetdll进行。该DLL实现了一整套功能似的程序与驱动器的通信变得十分简单避免了直接使用诸如系统调用或IOCTL等低级调用。包捕获驱动器通过NDIS与网卡设备驱动器进行交互NDIS是Win网络代码的组成部分之一它负责网络适配器的管理及适配器与网络协议软件端口之间的通信。NDIS的全称是网络驱动器接口规范(NetworkDriverInterfaceSpecification)它的最初目的是为网络接口卡(NIC)定义一组标准的API与NIC硬件操作有关的细节被封装在介质存取控制(MAC)设备驱动器中。这样具有相同介质(如以太网)的NIC驱动程序可以使用一个相同的编程接口。NDIS提供了一个函数库(有时也称函数包)它既可以被MAC驱动器使用也可以供高级协议驱动器(如TCPIP)使用。有了这些函数我们可以很容易开发MAC和协议驱动器并且在开发中程序员可以不用了解特定平台的相关特性。NDIS的早期版本由微软公司和COM公司合作开发目前NDIS已应用在Windows的各种版本中作为较低级别网络代码的一部分也是本文所述包捕获驱动器的开发基础。NDIS的相关信息及资源包含在微软公司给我们提供的驱动器开发工具(DDK)和软件开发工具(SDK)中它们可以在MSDN在线网站http:msdnmicrosoftcom上获得。值得注意的是WindowsNT和等各种Windows平台所用的DDK和SDK的版本是不同的。一个基本的网络包捕获驱动器可以非常简单它只需要从网络适配器读取数据包并把它复制到应用程序中然而为了达到适当的性能还需要对这一基本的结构进行改进最重要的是:为了减少数据包的丢失驱动器应能把读入的数据包存入一个缓冲器因为数据包进入是用户级应用程序不可能立即处理它们被缓存的数据包在应用程序准备好时应立即传送给应用程序。为了减少应用程序(运行在用户模式)和驱动器(运行在内核模式)之间的数据交换次数应能做到用一个读函数可以从缓冲器中传输几个数据包到应用程序。用户级的应用程序必须只接收自己感兴趣的数据包它常常是网络流量中的一个子集。应用程序应能指定它需要的数据包类型(如由特定主机产生的数据包)并且驱动器也只传输这些数据包给应用程序。换句话说应用程序应能对进入的数据包设置过滤器只接收那些满足过滤器要求的数据包子集。包过滤器是一个具有针对数据包的布尔返回值的一个函数。如果这个返回值是TRUE驱动器把该数据包传送到应用程序中否则该包被丢弃。这些特征和驱动器架构的实现借鉴了Unix内核中的BSD包过滤器(BPF)。在下一节中我们将对BPF作一个简单的介绍。Unix系统中的BPF参考资料对BPF即BSD包过滤器进行了详细的描述它是一个包捕获的架构最初是由StevenMcCanne和VanJacobson提出的。BPF工作于Unix内核它的输出函数被用于Tcpdump和其它一些Unix网络工具。在需要一高度优化的方式从网络适配器上获取数据包的Unix应用程序中BPF是一个必不可少的设备驱动器。BPF运行方式十分有趣它没有直接控制网络适配器而是适配器驱动器程序调用BPF来传送数据包。BPF由两个主要的组成部分:网络数据采集器(tap函数)和数据包过滤器。tap函数tap是一个自调用函数它作为BPF的组成部分之一但它不是直接由BPF运行的。当一个新的数据包到达时它被网络适配器驱动程序调用。网络驱动器的驱动程序必须针对每一数据包调用tap函数否则BPF就不能工作在适配器上。tap函数接收从网络适配器传来的数据包并把它们传送到正在监听的应用程序。进入的数据包如果被过滤器接受它们会被放入缓冲器然后在缓冲器满之前送给应用程序。包过滤器过滤器决定一个包是否应当被接受并送给正在监听的应用程序。大多数使用BPF的应用程序拒绝的数据包要远多于被接收的数据包因此对于一个具有较好性能的过滤器而言过滤必须非常严格而且功能也要很全面。包过滤器是一个具有布尔返回值的针对具体数据包的一个函数如果该布尔返回值是False则该包被丢弃。BPF包过滤器非常复杂它不仅要决定数据包是否要保留还要决定要保存的数据字节数这是因为包捕获应用程序有时是不需要整个数据包的。这个特征非常有用例如一个捕获应用程序常常值对数据包头而不是对包中的数据感兴趣这是包过滤器可以设置成只接收包的第一个数据从而只需要把一个数据送到应用程序这种行为大大加速了包捕获过程减少了数据包丢失的可能性因为它减少了从驱动器向应用程序传送数据的字节数也减少了存储数据包所需的缓冲器空间。历史上过滤器理论上的表达方法由两种:一是布尔表达式树二是直接控制流程图即CFG更多的细节可查阅参考资料。这两种过滤方式计算上是等价的即任何以一种方式表达的过滤器都可以用另一种方式来表达。但是这两种方式实现过程非常不同:树方式对很多机器来讲都可以很容易地影射到代码而CFG方式则可以影射到一个寄存器机器的代码。BPF生成器选择的是CFG方式因为它在基于寄存器的现代计算机上能够更为有效地实现。BPF虚拟机是一个虚拟处理器它由累加器、索引寄存器、临时存储器和内含的程序计数器组成。它可以实现加载和保存指令、分支程序以及算法指令等功能。因此那些想建立包过滤器的Unix应用程序必须为虚拟机建立一个程序并通过IOCTL调用送到BPF。BPF针对每一个数据包都执行过滤程序丢弃那些不满足过滤要求的数据包BPF过滤器具有一些很好的特征:它独立于协议这意味着内核程序不必经过修改就可以增加新的协议支持功能全面它可以处理一些无法预料的问题它经过了优化速度高有良好的性能。BPF包捕获过程概述图表示了BPF与操作系统内部其它部分的接口。对于那些需要用BPF服务进程捕获来说BPF都会提供一个过滤器和两个缓冲器。过滤器有应用程序生成并通过IOCTL调用传送给BPF缓冲器由BPF静态分配它们的大小通常为KB两个缓冲器之一(被称为存储缓冲器)用来从适配器接收数据第二个缓冲器(被称为保持缓冲器)用于把数据传送给应用程序。当存储缓冲器满而且保持缓冲器空时BPF就把它们互换。所以应用程序进程和适配器驱动程序始终使用不同的缓冲器空间它们在运行时不会互相干扰。当一个数据包到达网络接口时链路层设备驱动器通常会把它送给系统中的协议架构但当BPF监听该网络接口时驱动器首先会调用BPF的网络数据采集器Tap函数。Tap函数会把该数据包再反馈到每一个分享的应用程序对应的过滤器。该过滤器由程序员编制它会是否决定是否接收该包以及接收该数据包中多少字节。要注意的是过滤器过滤那些仍然处于链路层驱动器存储器中的数据包只有当该包满足过滤条件时才把它复制到应用程序。这大大地优化了包捕获的性能和存储器的使用因为如果一个数据包不满足过滤器条件系统不会对它进行复制等任何操作并会立即把它丢弃。如果数据包满足过滤器要求Tap函数仅从链路层驱动器存储器中复制由过滤器指定的字节数到过滤器的存储缓冲器中。这时接口设备驱动器重新获得控制权正常的协议进程得以继续进行。如果存储缓冲器满进入的数据包就被丢弃因而保持缓冲器也不会得到应用程序同样也就无法为了从BPF接收数据包应用程序要执行一个读系统调用当保持缓冲器满时(或者一个特定的超时设定过去时)BPF把缓冲器中的数据包复制到程序存储器并激活捕获进程。一个应用程序可以同时接收多个数据包为了保持数据包之间的边界BPF给每个捕获的数据包进行封装给它们加上一个包括时间戳、包长度以及包在数据队列中的偏移量等头部。一个重要问题请注意不是所有的Unix版本都有BPF(即内核部分的数据包过滤及缓冲能力)但Pcap库可以弥补这个缺陷。这个架构可以通过用户层以与BPF相兼容的方式过滤数据包这个方案在NDIS包驱动器的第一个版本中被采用。它很容易实现但是仍有有限的性能主要有以下两个原因:过滤过程在用户层完成所以在检测到用户应用程序是否需要之前所有的数据包都必须从内核中复制到应用程序缓冲器这显然会浪费CPU的时间和存储器。如果过滤过程在内核部分完成所有捕获应用程序不需要的数据包会被系统丢弃就不会再被复制到用户层。在内核中没有数据包缓冲器在多任务环境下捕获应用程序必须与其它程序一起分享处理器时间。有可能一个数据包到达时捕获应用程序没有被执行。另外应用程序也可能正在做其它工作因此不可能等待数据包到来。由于缺少内核缓冲器这种情况会导致数据包的丢失。这些原因决定了过滤过程及包的缓存是在包捕获驱动器中而不是在WinDump中实现。与NDIS的交互NDIS(网络驱动器接口规程)是一整套的规定它定义了网络适配器(或者更精确地说是管理网卡的驱动程序)和协议驱动器(IPIPX等)之间的通信。NDIS的主要目标就好象它是一个包裹它允许协议驱动器向网络LLAN或WAN中发送和从中接收数据而不需要关心所用何种适配器或何种Win操作系统。NDIS支持三种类型的网络驱动器:网络接口卡或NIC驱动器。NIC驱动器直接管理网络接口卡(称为NIC)NIC驱动器向下直接与硬件接口向上则为上层提供一个接口用来向网络发送数据包处理中断重位NIC停止NIC查询或设置驱动器的特性接口驱动器不可以与用户模式的应用程序通信只可以与NDIS中间驱动器或者协议驱动器进行通信。NIC驱动器既可以是最简化模式(miniports)和综合模式(legacy)。简化驱动器只完成管理NIC的面向硬件所需的操作包括从NIC发送和接收数据对于所有低层NIC驱动器的共同操作如信号同步等都有NDIS提供。简化驱动器不直接调用操作系统程序它们与操作系统的接口就是NDIS。简化驱动器不会跟踪协议绑定它仅完成把数据所送给NDISNDIS则确认这些包是送给正确的协议。综合驱动器同时执行硬件相关的操作和信号同步查询等通常由NDIS进行的操作。例如它可以为指定的接收数据维护自己的绑定信息。中间驱动器中间驱动器与上层驱动器如综合传输驱动器接口向下则与简化驱动器接口。对于高层驱动器而言中间驱动器就象一个简化驱动器对简化驱动器而言中间驱动器则象一个协议驱动器中间协议驱动器可以建立在另一个中间协议驱动器之上当然这样做对系统性能有负面作用开发中间驱动器的一个明显的原因是要在现存的综合传输协议和管理一种对于传输层驱动器未知的新介质NIC的简化驱动器之间的转换。例如中间驱动器可以从LAN协议转换成ATM协议。中间驱动器除了可以与NDIS驱动器通信外还可以与用户应用程序通信。传输协议或协议驱动器协议驱动器实现了诸如IPXSPX或TCPIP的网络协议架构它是在网络接口卡的上层提供服务。传输驱动器向上为应用层客户程序服务向下则与一个或多个NIC驱动器或者是中间NDIS驱动器进行连接。下图显示了一个示例NDIS结构它在同一网络适配器上有两个捕获架构。一个架构有NIC驱动器和一个协议驱动器另一个架构有NIC驱动器一个中间驱动器和协议驱动器组成。包捕获驱动器即要与网络驱动器(从网络取得数据)又要同用户层应用程序通信(向程序提供数据包)这由NDIS结构的协议驱动器实现。这使它可独立于网络硬件因此可以与Windows支持的所有网络接口一起工作。要注意的是由于要受到驱动器和过滤器结构引起的限制包捕获驱动器只能工作在以太网适配器环形适配器以及一些WAN连接上。同时也要注意在协议驱动器看来WAN连接象一个以太网NIC每一个接收的包都由NDIS生成一个伪装的以太网头这使得为以太网编写的协议驱动器不经任何修改就可工作于WAN的连接上。但也要指出的是象PPPNCPLCP等具体的数据包等协议驱动器是看不到的因为PPP连接是虚拟的。这意味着包驱动器不能捕获这种类型的包。请注意不同的Win操作系统有不同版本的NDIS:Windows上的NDIS版本是而WindowsNT上是NDISWindows上的是NDISNDIS和NDIS是NDIS的子集因此设计的与NDIS一起工作的驱动器(通常)也可以与NDIS和NDIS一起运行。为NDIS编写的包捕获驱动器但它也可与NDIS当前版本一起运行。这意味着驱动器和NDIS之间的交互过程在Windows和Windows中都是相同的。下图显示了在Win架构中包捕获驱动器所处的位置:与其下一层NDIS驱动器通信的协议驱动器使用了NDIS提供的函数协议驱动器例如为了向下一层NDIS驱动器发送一个或多个数据包协议驱动器必须调用NDISSend或NDISSendPackets函数。另外一方面较低层次的驱动器以异步的方式与协议驱动器进行通信。它们通过调用协议驱动器的自调用函数指出一个新的包的到达并生成一个批向预期的缓冲器指出它的大小以及接收的数据包的总的大小。包捕获驱动器中自调用函数称为数据采集器(PacketTap)。包驱动器的行为方式与一个标准的协议驱动器是非常不同的。实际上:包驱动器接收并处理当前网络上传输的所有数据包。这种行为可以通过适配器设置成“混杂模式”来实现即强制它接收来自网络的所有的数据包。而一个标准的协议驱动器仅管理那些送来的单播组播及广播数据包。包驱动器不实现了一个协议但它存储并传输数据及它们的时间戳及长度到它们应到的应用程序中。一个标准的协议驱动器删除数据包上的各类头部数据仅把包中的数据传送到应用程序。而包驱动器则保留了头部并把捕获数据复制到应用程序。请注意在Unix实现方案中BPF直接由网络接口驱动器在协议架构之前调用。而捕获驱动器是协议架构的一部分不可能在协议架构之前调用。这就是为什么包捕获驱动器不能捕获PPP类型数据包的原因。因为它不工作在硬件层只在NDIS之上工作。如要在NDIS前就意味着要改变内核或NIC驱动器这在Windows中是不可能的。兼容性操作系统支持当前的包捕获驱动器都支持几乎所有的Win操作系统Windows、Windows、WindowsNT及Windows。在WindowsX版本中使用可以安装到或的一个驱拟设备(驱动器Lxd)。另一方面WindowsNT和Windows中则使用另一种驱动器(sgs)这是因为系统安装和初始化的过程是不同的。WindowsCE中的包捕获驱动器版本目前正在研发中。硬件兼容性包捕获驱动器最初主要是为以太网适配器而研发的。在以后的研究中又增加了基于其它MAC层设备的功能但以太网还是它所支持的主要硬件。主要的原因在于我们的所有研发工作站上都有以太网适配器所以我们的实验都是在这类网络中完成的。但是目前的情况是:Windows:包捕获驱动器在以太网上可正确运行同时它也可以运行在PPP广域网连接上只是有一些限制(如它不可以捕获LCP和NCP数据包)。WindowsNT:包捕获驱动器可以在以太网上正确运行但我们不能使它工作在PPP广域网连接上这是因为在NDIS广域网适配器的绑定问题还没有解决。从版本开始我们增加了FDDIARCNET和HTM等网络支持但是国为我们没有此类硬件所以这些功能还没有经过测试所以不要指望它们在这些网络上能较好地运行。TokenRing网络不支持我们也没有计划要在以后实现对该网络的支持。第四章协议分析协议分析是网络监听程序的最重要功能之一通过对网络数据流的实时或事后的解码分析可以了解到网络上运行的协议和服务、数据帧的源地址和目的地址、数据帧的格式等。作为网络监听主要应用之一的网络分析仪(也称为规程分析仪)能解码多少种协议是衡量其性能的最重要的指标。对局域网分析仪来说它一般应能对EthernetMAC、TCPIP、NovellIPX、AppleTalk、DECnet等协议的解码。对广域网分析仪而言它一般应能支持各种流行的WAN技术包含X、ISDN、FrameRelay、TE。对于应用服务而言优秀的网络分析仪往往能提供对数百种上层协议的解码。这一章我们将介绍该程序中用到的链路层的MAC帧和网络层的IP数据报的结构以及对他们的分析。其他协议的分析请查阅《监听与隐藏网络侦听揭密与数据保护技术》一书的相关章节。链路层支持第一章中我们粗略的讲了MAC帧,这里我们将详细的介绍一下以太网通信时的帧结构由以下几个部分组成:帧头(Preamble)、帧的起始定界标志(SFDStartofFrameDelimiter)、目的地址(Destination)、源地址(Source)、数据长度(Lenth)、数据(Data)、帧校验序列(FCS)。图描述了以太网数据链路层的帧格式必须注意的是网络接口卡的驱动程序会负责计算校验和并取走帧中的前同步码字段和校验和字段因此pcap接收的数据包仅是其中的帧头和载荷部分。前同步码目的地址源地址类型数据CRC字节字节字节字节字节字节|帧头||载荷||帧尾|图以太网帧格式其中帧头是位的、交替的位序列主要是为通信提供同步信号起始定界符表示有效帧的起始位置为位目的地址是帧在网络中传输的目的主机网卡的MAC地址为字节。目的地址有三种:物理地址、多址地址和广播地址。物理地址即接收方网卡地址多址地址可代表多达个地址而广播地址则是表示该帧能到达的所有地址它的字节中所有位都为“”。源地址为本机网卡的MAC地址同样也占个字节。数据长度表示数据域中有效数据的字节数。而数据域可以包含字节的有效数据少于时应填充一些无用数据多于则应把数据分成多个帧。帧校验为帧数据的CRC位校验和。除帧头、帧起始定界符和帧校验字段由硬件自动填加外其它字段必须由程序指定。下面的代码定义了以太网帧类型域不同协议对应的常量和其他一些以太网常数以及以太网帧头的数据结构。*以下为一些以太网常量定义**ETHERNERTYPEXXX常量定义了不同协议对应的帧类型域常数值通过*类型域的值可以确定上层协议奠定进一步分析的基础*#defineETHERNETTYPEIPx#defineETHERNETTYPEARPx#defineETHERNETTYPEREVARPx#defineETHERNETTYPEIPVxdd#defineETHERNETTYPEIPXx#defineETHERNETTYPEPPPoEDISCx#defineETHERNETTYPEPPPoESESSx#defineETHERNETTYPEQx#defineETHERNETTYPECDPx#dedineETHDSAPSNAx#dedineETHSSAPSNAX#dedineETHDSAPSTPx#dedineETHSSAPSTPx#dedineETHDSAPIPxaa#dedineETHSSAPIPxaa#defineETHORGCODEETHRx#defineETHORGCODECDPxc#defineETHERNETHEADERLEN#defineETHERNETMTU*以下为以太网帧头数据结构定义*typedefstructEtherHdr{uinttetherdstuinttethersrcuinttethertype}EtherHdrtypedefstructEthLlc{uinttdsapuinttssap}EthLlctypedefstructEthLlcOther{uinttctrluinttorgcodeuinttprotoid}EthLlcOther网络层支持网络层有IP协议支持、ARPRARP协议支持、ICMP协议支持这里只介绍IP协议支持。IP协议支持图描述了IP数据包格式IP数据由包头(Bytes的固定部分和变长的可选部分变长部分最长字节)TCP数据组成。||||||||||||||||||VersionIHLTypeofServerTotalLengthIdentiFicationFlagsFragmentationOffsetTimetoLiveProtocolHeaderChecksumSourceAddressDestinationAddressOptionsPaddingDatabeginshere…图IP数据包结构IP数据包以位的协议版本号(Version当前版本号)和位的头部长度(IHL)开始头部长度指出以位字长为单位的头部长度。服务类型(TypeofService)域包含的值指明发送方是否希望以一条低延迟的路径或是以一条高吞吐率的路径来传送该数据包当一个路由器知道多条通往目的地的路径时就可以靠这个域对路径加以选择但事实上目前几乎所有路由器都忽略服务类型域。总长(TotalLength)域长位说明以字节计的数据包总长度包括头部长度和数据长度因字长限制数据包最长为字节。标识(Identification)域长为位用于让目的主机判断本分段属于哪个数据包属于同一数据包的分段具有相同的标识值。标志(Flags)域长位第一位保留为第二位表示是否允许对该数据包分段除数据包最后一个段外的所有段都要置第三位为。段偏移量(Fragmentoffset)域长位表示该分段在原数据包中的偏移量此域的基本单位是字节除最后段外的其他段的数据长度取值应是字节的倍数。生存时间(TimetoLive)域长位用于限制分组的生存周期防止其在网络中无限制的转发当软件发生故障或管理人员错误的配置路由器时就会产生这样的问题。发送方负责初始化生存时间域它是~之间的整数。每个路由器处理数据包时会将头部里的生存时间减如果达到数据包将被丢弃并发送一个出错消息给源主机。协议(Protocol)域长位用于确定上层使用哪种传输协议如果传输层协议是TCP取值为如果传输层协议是UDP取值为。头部校验和(HeaderChecksum)域长位用于确保头部在传输过程中不被改变。发送方将除了校验和域的头部数据每位对取补所有结果累加并将和的补放入头部校验和域中。接收方进行同样计算但包括了校验和域。如果校验和正确则累加结果应该为。发现校验和错时的处理非常简单:数据包必须立即丢弃而不作进一步的处理。接收者不能相信数据包头部中的任何域因为接收者不知道哪一位被改变了。甚至也不能发一个出错消息给发送者因为接收者不能相信包头重的源地址。同样接收者也不能转发被损坏的数据包因为它也不能相信包头中的目的地址。因此接收者除了将被损坏的数据包丢弃外别无选择。源地址(SourceAddress)域长位表示源主机(发送该数据包的主机)的IP地址。目的地址(DestinationAddress)域同样是位表示目的主机(该数据包的最终接收主机)的IP地址。当一个IP数据包没携带选项(Options)时头部长度(IHL)域的值为头部长度以目的地址域作为结束。为了便于后续版本引进新信息,提供可扩展能力,IP定义了一套选项(Options)。每种选项用一个字节标明选项类型一个字节标明长度(可有可无)其余是若干数据字节。每种选项的总长度为字节的倍数不够则以全填充(Padding)以保证头部长度为字节的倍数选择项最长为字节。IP已经定义了下面五种选项但是并不是所有的路由器都支持全部五种选项。安全性(

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/60

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利