专业计算机科学与技术学生崔佳

专业计算机科学与技术学生崔佳

ID:82886526

大小:229.19 KB

页数:57页

时间:2023-09-24

上传者:灯火阑珊2019
专业计算机科学与技术学生崔佳_第1页
专业计算机科学与技术学生崔佳_第2页
专业计算机科学与技术学生崔佳_第3页
专业计算机科学与技术学生崔佳_第4页
专业计算机科学与技术学生崔佳_第5页
专业计算机科学与技术学生崔佳_第6页
专业计算机科学与技术学生崔佳_第7页
专业计算机科学与技术学生崔佳_第8页
专业计算机科学与技术学生崔佳_第9页
专业计算机科学与技术学生崔佳_第10页
资源描述:

《专业计算机科学与技术学生崔佳》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

江南大学毕业设计报告2002-2003学年题目:路由器仿真专业:计算机科学与技术学生:崔佳指导老师:庄春兴时间:2003年3月——2003年6月

1摘要:路由器是什么所谓路由就是指通过相互连接的网络把信息从源地点移动到目标地点的活动。而路由器就是实现这ー功能的•个硬件设备。路由器是互联网的主要节点设备,它的・个作用是连通不同的网络,另ー个作用是选择信息传送的线路。本文是无锡江南大学信息工程学院计算机科学与技术系99级毕业生崔佳的毕业论文。文中分析了Windows平台上实现的免费数据包捕获工具——WinPcap的原理、功能和使用方法,介绍了网络嗅探的基本原理、嗅探程序的组成,以及协议分析模块的基本知识。还使用MicrosoftVisualC++开发的ー个基于网络嗅探的IP包捕获及存储转发程序。本文的作者只是对路由器仿真做了一些探索,只做了连接不同网络部分而已,不过作者在设计程序时就留给程序很大的扩展度,有兴趣的人可以继续研究下去。

2Abstract:whatisRouterSo-calledRouteristheactmovetheinformationofthetargetlocationfromthesendlocationandtherouterisahardwareequipmentstorealizesthisfunction.RouteristhemainnodeequipmentsofInternet,Oneofit'sfunctionisconnectsdifferentnetwork,anotherfunctionofitisachooseforinformation'sdeliver.ThisarticlewrittenbyJiaCui,whowillbegraduatedfromWuXiSouthernYangtzeUniversity,informationtechnologycollege,computerscienceandtechnologydepartment.Thereassaiedthetheorem,fuction,usemethodofthewinpcap,atooltogetfreedatapackageandthemoduleofprotocolanalyseinwindowsplat.Alsointroducdeitstheorem,componentoftheprograme.AlsoaprogramtoexaminetheembezzlingIPaddresswithCatchandsaveresendoftheIPpackbyMicrosoftVisualC++isintroduced.Thetextualauthorisjustdidsomequeststoimitatedtoreallyrouter,onlydidthelinkofdifferentnetwork,howeverauthorlevelabigexpanddegree,thepeoplewhohavingtheinterestedtocancontinuestudy.

3江南大学信息工程学院计算机科学与技术专业毕业设计任务书ー、论文题目:路由器仿真二、本设计(论文和其他)应达到的要求:本课题要求设计“用嗅探原理解决!P的存储转发从而达到以软件实现路由器功能的目的”主要任务为:1.IP包捕获和IP包存储转发程序的设计和运行2.采用MicrosoftVisualC++6.0作为本次设计的工具3.撰写毕业设计说明书、英文文献的阅读和翻译三、接受任务学生:计科992班崔佳四、开始及完成时间:自2003年3月至2003年6月五、设计(论文)指导(顾问)指导老师:庄春兴

4目录中英文摘要2毕业设计任务书4目录5第一章系统分析71.1需求分析71.2可行性分析7第二章概论82.1嗅探的基本原理82.2网络基础知识82.3SNIFFER的基本原理10第三章WinPcap论述123.I捕获程序的结构134.2Unix系统中的BPF143.2.1tap函数143.2.2包过滤器143.2.3BPF包捕获过程概述153.2.4ー个重要问题163.3与NDIS的交互17

53.4兼容性19第四章协议分析214.1链路层支持214.2网络层支持24第五章系统分析305.1总体分析305.2模块设计30第六章程序实现32小结42附录1:WPCAP库介绍43附录2:英文文献及翻译49参考文献及站点58

6第一章系统分析1.1需求分析路由器是什么所谓路由就是指通过相互连接的网络把信息从源地点移动到目标地点的活动。一般来说,在路由过程中,信息至少会经过ー个或多个中间节点。通常,人们会把路由和交换进行对比,这主要是因为在普通用户看来两者所实现的功能是完全ー样的。其实,路由和交换之间的主要区别就是交换发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层,即网络层。这ー区别决定了路由和交换在移动信息的过程中需要使用不同的控制信息,所以两者实现各自功能的方式是不同的。早在40多年之间就已经出现了对路由技术的讨论,但是直到80年代路由技术オ逐渐进入商业化的应用。路由技术之所以在问世之初没有被广泛使用主要是因为80年代之前的网络结构都非常简单,路由技术没有用武之地。直到最近十几年,大规模的互联网络オ逐渐流行起来,为路由技术的发展提供了良好的基础和平台。路由器是互联网的主要节点设备。路由器通过路由决定数据的转发。转发策略称为路由选择(routing),这也是路由器名称的由来(router,转发者)。作为不同网络之间互相连接的枢纽,路由器系统构成了基于TCP/IP的国际互连网络!nternet的主体脉络,也可以说,路由器构成了Internet的骨架。它的处理速度是网络通信的主要瓶颈之一,它的可靠性则直接影响着网络互连的质量。因此,在园区网、地区网、乃至整个Internet研究领域中,路由器技术始终处于核心地位,其发展历程和方向,成为整个Internet研究的・个缩影。在当前我国网络基础建设和信息建设方兴未艾之际,探讨路由器在互连网络中的作用、地位及其发展方向,对于国内的网络技术研究、网络建设,以及明确网络市场上对于路由器和网络互连的各种似是而非的概念,都具有重要的意义。路由器的ー个作用是连通不同送的线路。选择通畅快捷的近路,统通信负荷,节约网络系统资源,系统发挥出更大的效益来。从过滤网络流量的角度来看,相似。但是与工作在网络物理层,的网络,另一个作用是选择信息传能大大提高通信速度,减轻网络系提高网络系统畅通率,从而让网络路由器的作用与交换机和网桥非常从物理上划分网段的交换机不同,路由器使用专门的软件协议从逻辑上对整个网络进行划分。例如,台支持IP协议的路由器可以把网络划分成多个子网段,只有指向特殊IP地址的网络流量オ可以通过路由器。对于每ー个接收到的数据包,路由器都会重新计算其校验值,并写入新的物理地址。因此,使用路由器转发和过滤数据的速度往往要比只查看数据包物理地址的交换机慢。但是,对于那些结构复杂的网络,使用路由器可以提高网络的整体效率。路由器的另外一个明显优势就是可以自动过滤网络广播。从总体上说,在网络中添加路由器的整个安装过程要比即插即用的交换机复杂很多。一般说来,异种网络互联与多个子网互联都应采用路由器来完成。要解决由软件实现路由器功能,重点就是要实现IP包的存储转发,要实现IP包的存储转发,首先就要捕获!P包,这就涉及到网络上的包嗅探问题,只有先解决了包的捕获问题,然后才能进行包的存储转发,从而达到由软件实现路由器功能的目的。

7Sniffer作为嗅探器作用是很大的,正当用处主要是分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。在合理的网络中,sniffer的存在对系统管理员是致关重要的,系统管理员通过sniffer可以诊断出大量的不可见模糊问题,这些问题涉及两台乃至多台计算机之间的异常通讯有些甚至牵涉到各种的协议,借助于sniffer系统管理员可以方便的确定出多少的通讯量属于哪个网络协议、占主要通讯协议的主机是哪一台、大多数通讯目的地是哪台主机、报文发送占用多少时间、或着相互主机的报文传送间隔时间等等,这些信息为管理员判断网络问题、管理网络区域提供了非常宝贵的信息。我们这里主要使用它来捕获IP包。1.2可行性分析什么是Sniffer呢?我们知道在单选性网络中,以太网结构可以广播至网络上所有的机器,但是只有预定接受信息包的那台计算机オ会响应。不过网络上其他的计算机同样会“看到”这个信息包,如果它们不是预定的接收者,它们会排除这个信息包。当…台计算机上运行着Sniffer并且网络处于监听所有信息交通的状态,那么这台计算机就有能力浏览所有的在网络上通过的信息包。常见的Sniffer有SnifferPro、Snoop等。SnifferPro可以探测OSIRDFERENCE模式的7个层并且提供给你ー个详细的分析报告。在UNIX下的Sniffers有Snoop,Snoop是按Solaris的标准制作的,虽然Snoop不像是SnifferPro那样好用,但是它是ー个可定制性非常强的Sniffero此外,网上还提供了数据包捕获工具WinPcap,此数据包捕获架构使计算机具有数据包捕获的能力。从功能上讲,Sniffer只是从网络中捕获数据并不破坏数据或修改数据,而且,捕获器需要的资源很低,对网络不构成影响,可以说是替代服务器计费的好办法。sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。值得注意的是:sniffer是极其安静的,它是ー种消极的安全攻击。第二章概论2.1嗅探的基本原理SNIFFER真是ー个古老的话题,关于在网络上采用SNIFFER来获取敏感信息已经不是什么新鲜事,也不乏很多成功的案例,那么,SNIFFER究竟是什么呢?SNIFFER就是嗅探器,可以理解为ー个安装在计算机上的窃听设备,它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃听装置,可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。SNIFFER可以是软件,也可以是硬件,既然是软件那就要分平台,有WINDOWS下的、UNXI下的等,硬件的SNIFFER称为网络分析仪,反正不管硬件软件,目标只有一个,就是获取在网络上传输的各种信息。

82.2网络基础知识(1)TCP/IP体系结构开放系统互连(0SI)模型将网络划分为七层模型,分别用以在各层上实现不同的功能,这七层分别为:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。而TCP/IP体系也同样遵循这七层标准,只不过在某些0SI功能上进行了压缩,将表示层及会话层合并入应用层中,所以实际上我们打交道的TCP/IP仅仅有5层而已,网络上的分层结构决定了在各层上的协议分布及功能实现,从而决定了各层上网络设备的使用。实际上很多成功的系统都是基于0SI模型的,如:如帧中继、ATM、ISDN等。TCP/IP的网络体系结构(部分)应用层传输层网绢层数据链路层物理层从上面的图中我们可以看出,第一层物理层和第二层数据链路层是TCP/IP的基础,而TCP/IP本身并不十分关心低层,因为处在数据链路层的网络设备驱动程序将上层的协议和实际的物理接口隔离开来。网络设备驱动程序位于介质访问子层(MAC)。(2)网络上的设备中继器:中继器的主要功能是终结ー个网段的信号并在另ー个网段再生该信号,•句话,就是简单的放大而已,工作在物理层上。网桥:网桥使用MAC物理地址实现中继功能,可以用来分隔网段或连接部分异种网络,工作在数据链路层。路由器:路由器使用网络层地址(IP,X.121,E.164等),主要负责连接不同子网以及数据包的路由寻径,也能处理物理层和数据链路层上的工作。网关:主要工作在网络第四层以上,主要实现收敛功能及协议转换,不过很多时候网关都被用来描述任何网络互连设备。(3)TCP/IP与以太网以太网和TCP/IP可以说是相互相成的,可以说两者的关系几乎是密不可分,以太网在ー二层提供物理上的连线,而TCP/IP工作在上层,使用32位的IP地址,以太网则使用48位的MAC地址,两者间使用ARP和RARP协议进行相互转换。从我们上面TCP/IP的模型图中可以清楚的看到两者的关系。

9载波监听/冲突检测(CSMA/CD)技术被普遍的使用在以太网中,所谓载波监听是指在以太网中的每个站点都具有同等的权利,在传输自己的数据时,首先监听信道是否空闲,如果空闲,就传输自己的数据,如果信道被占用,就等待信道空闲。而冲突检测则是为了防止发生两个站点同时监测到网络没有被使用时而产生冲突。以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。为了加深你的理解,我们来看看下面的图,ー个典型的在以太网中客户与服务器使用TCP/IP协议的通信。用户进程FTP客户く>FTP服务器内核中的协议栈TCP<>TCP内核中的协议栈!P<以太网驱动程序(>以太网驱动程序应用层传输层网络层数据链路层2.3SNIFFER的原理

10要知道在以太网中,所有的通讯都是广播的,也就是说通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据,而每ー个网络接口都有…个唯・的硬件地址,这个硬件地址也就是网卡的MAC地址,大多数系统使用48比特的地址,这个地址用来表示网络中的每ー个设备,一般来说每…块网卡上的MFC地址都是不同的,每个网卡厂家得到ー段地址,然后用这段地址分配给其生产的每个网卡一个地址。在硬件地址和IP地址间使用ARP和RARP协议进行相互转换。在正常的情况下,ー个网络接口应该只响应这样的两种数据帧:1.与自己硬件地址相匹配的数据帧。2.发向所有机器的广播数据帧。在ー个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。CPU得到中断信号产生中断,操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据,驱动程序接收数据后放入信号堆栈让操作系统处理。而对于网卡来说…般有四种接收模式:式式式式方方方模播播接杂广组直混:该模式下的网卡能够接收网络中的广播信息。:设置在该模式下的网卡能够接收组播数据。:在这种模式下,只有目的网卡才能接收该数据。:在这种模式下的网卡能够接收ー切通过它的数据,而不管该数据是否是传给它的。好了,现在我们总结ー下,首先,我们知道了在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过我的机器,再次,网卡可以置于一种模式叫混杂模式(promiscuous),在这种模式下工作的网卡能够接收到ー切通过它的数据,而不管实际上数据的目的地址是不是他。这实际上就是我们SNIFF工作的基本原理:让网卡接收一切他所能接收的数据。•嗅探程序组成一般的,网络嗅探系统有如下几部分组成:1.硬件,普通网络适配器或专门硬件,后者可以进ー步分析硬件错误(如CRC校验错误),信号电压,电缆问题等等。2.捕获驱动程序,这是最重要的组成部分,它可把总线上捕获的数据信息进行过滤并把你要的数据存储到数据缓冲器中;3.缓冲器,用于存储接受的数据;4.实时分析程序,它可以对数据包中提出的小部分数据进行分析,从而掌握网络运行状况和捕获出错信息;5.解码程序,有些网络数据是经过编码的,解码程序可.以使这些数据还原。•混杂模式的设置为了能够捕获网络中的数据包,必须改写相关的网卡驱动程序,它不仅可以使网卡变成混杂模式,还能缓存收到的数据包,要编写这个驱动程序,你必须深入了解有关的

11网络编程知识,因为程序要直接对硬件进行控制与编程。具体的讲,程序要对网络中所有的NIC(网络接口控制)芯片进行编程,还要修改网卡的中断服务程序,接受数据包并根据一定的规则过滤,得到的有用包还要存入缓冲器或写入日志文件供进一步的分析之用。自己编写嗅探程序是非常困难的事情,不过我们可以从Internet上得到ー些商用或免费的驱动程序,如Winpcap数据包捕获架构。Winpcap是ー个架构,它使WIN32系统增加了利用计算机网卡来捕获网络数据包的能力,而且,它为应用程序提供了高级的API,使应用程序可以很方便地用其网络较低层的功能。Winpcap可以分为三个独立的组成部分:ー个包捕获设备驱动器,ー个低级动态库和一个高级静态库。第三章WinPcap论述Winpcap是ー个架构,它使Win32系统增加了利用计算机网卡来捕获网络数据包的能力,而且,它为应用程序提供了高级的APL使应用程序可以很方便地了用其网络较低层的功能。Winpcap可以分为三个独立的组成部分:ー个包捕获设备驱动器,•个低级动态库和一个高级静态库。这个架构可以用来生成Windows新的包捕获工具,也可以用来移植Unix中已有的应用程序,因为它与BPF中的Libpcap是兼容的。本章中,我们将会描述Winpcap的结构及其基本原理,另外还要解释ー些在本书中其他部分用到的概念。

12注意,因为包捕获过程是在数据链路层进行的,而该层封装后的数据被称为“帧”,因此,从较为严格的意义上讲,用“帧”ー词更为精确,但是,在本书中我们还是使用了“数据包”ー词。3.1捕获程序的结构为了捕获网络中传输的数据,包捕获应用程序需要直接与硬件进行交互。因此,操作系统应该提供ー套与网络适配器进行通信并能直接接收数据的原函数。原函数的任务是从网络捕获数据包(它与网卡的交互过程对应用程序透明),并把接收到的数据传给调用它们的程序。这个过程要密切依赖操作系统来完成,所以在不同的操作系统中实现这种架构的过程是不同的。包捕获过程应快而有效,它必须能够在大流量的高速局域网上捕获数据包并限制丢包率,同时它应使用较少的系统资源。为了在不同类型的应用程序(如网络分析器、网络监视及测试程序等)中使用,它应该具有通用性及柔性。数据包网络适配器图2-1包捕获体系结构用户级的包捕获应用程序从该系统接收、解释并处理数据包并把它们以用户能理解的方式或作为ー个产品提供给用户。因此,这个包捕获架构必须容易使用,独立于操作系统,模块化,可扩展,能支持多种协议。另外,由于目前网络协议的种类繁多,它们的变化也非常快,所以该架构应当能很方便地进行修改以支持其他的协议。总之,包捕获架构应该具有非常好的完整性克可扩展性。WinDump.exe由一个运行在内核级的模块和一个运行在用户级的模块(包捕获架构的最高层部分)所组成,这两个模块具有不同的目的,相互独立。第・个模块直接基于Inter公司的计算机硬件,第二个模块则象一个正常的Windows程序ー样。内核部分因Windows版本不同而异,用户级模块则于Unix中的实现方法相似,并且杂爱Windows95及WindowsNT中是相同的,从网络适配器到具体应用程序(如WinDump)的框架结构如图2-1所示:包捕获架构的最低层是网络适配器,它用来直接捕获网络中的数据包。网卡在捕获数据时常常工作在

13ー个特殊的模式(“混杂模式”),它被强迫接收所有的数据包,而不仅仅接收只送给它的数据。数据包捕获驱动器时捕获架构的最低级软件模块,它时工作在内核级部分的软件,为了获得数据,它必须于网络适配器交互。它提供了一套用于从网络链路层读和写数据包的函数。Packetdl工作在用户级,但它与捕获应用程序是分开的。它是一个隔离捕获应用程序和提供独立于操作系统的捕获接口的驱动器的动态连接库。它可以使WinDump不需要重新编译就可以运行在不同的Windows平台上。Pcap库或者也称为Libpcap是ー个静态库,它由应用程序调用。Pcap利用了Packet.dll输出的服务,为应用程序提供了一个较高级别的强大的捕获接口。要注意的是,它是ー个静态库,并且是应用程序的ー个组成部分。用户接口是捕获应用程序的较高级部分,它管理于用户的交互并且显示捕获的结果。我们将分别描述这些模块,它们各自的行为以及影响它们性能的架构选择。3.2Unix系统中的BPF3.2.1tap函数tap是一个自调用函数,它作为BPF的组成部分之一但它不是直接由BPF运行的。当ー个新的数据包到达时它被网络适配器驱动程序调用。网络驱动器的驱动程序必须针对每ー数据包调用tap函数,否则BPF就不能工作在适配器上。tap函数接收从网络适配器传来的数据包,并把它们传送到正在监听的应用程序。进入的数据包如果被过滤器接受,它们会被放入缓冲器,然后在缓冲器满之前送给应用程序。3.2.2包过滤器过滤器决定一个包是否应当被接受并送给正在监听的应用程序。大多数使用BPF的应用程序拒绝的数据包要远多于被接收的数据包,因此,对于ー个具有较好性能的过滤器而言,过滤必须非常严格而且功能也要很全面。包过滤器是ー个具有布尔返回值的针对具体数据包的ー个函数;如果该布尔返回值是False则该包被丢弃。BPF包过滤器非常复杂,它不仅要决定数据包是否要保留,还要决定要保存的数据字节数,这是因为包捕获应用程序有时是不需要整个数据包的。这个特征非常有用,例如,ー个捕获应用程序常常值对数据包头而不是对包中的数据感兴趣,这是包过滤器可以设置成只接收包的第一个数据,从而只需要把ー个数据送到应用程序,这种行为大大加速了包捕获过程,减少了数据包丢失的可能性,因为它减少了从驱动器向应用程序传送数据的字节数,也减少了存储数据包所需的缓冲器空间。历史上,过滤器理论上的表达方法由两种:ー是布尔表达式树,二是直接控制流程图即CFG,更多的细节可查阅参考资料[1]。这两种过滤方式计算上是等价的,即任何以ー种方式表达的过滤器都可以用另ー种方式来表达。但是,这两种方式实现过程非常不同:树方式对很多机器来讲都可以很容易地影射到代码,而CFG方式则可以影射到ー个寄存器机器的代码。BPF生成器选择的是CFG

14方式,因为它在基于寄存器的现代计算机上能够更为有效地实现。BPF虚拟机是一个虚拟处理器,它由累加器、索引寄存器、临时存储器和内含的程序计数器组成。它可以实现加载和保存指令、分支程序以及算法指令等功能。因此,那些想建立包过滤器的Unix应用程序必须为虚拟机建立一个程序并通过IOCTL调用送到BPF。BPF针对每…个数据包都执行过滤程序,丢弃那些不满足过滤要求的数据包,BPF过滤器具有一些很好的特征:1.它独立于协议,这意味着内核程序不必经过修改就可以增加新的协议支持;2.功能全面,它可以处理一些无法预料的问题;3.它经过了优化,速度高,有良好的性能。3.2.3BPF包捕获过程概述图2.2表示了BPF与操作系统内部其它部分的接口。对于那些需要用BPF服务进程捕获来说,BPF都会提供一个过滤器和两个缓冲器。过滤器有应用程序生成并通过IOCTL调用传送给BPF;缓冲器由BPF静态分配,它们的大小通常为4KB,两个缓冲器之一(被称为存储缓冲器)用来从适配器接收数据,第二个缓冲器(被称为保持缓冲器)用于把数据传送给应用程序。当存储缓冲器满而且保持缓冲器空时,BPF就把它们互换。所以应用程序进程和适配器驱动程序始终使用不同的缓冲器空间,它们在运行时不会互相干扰。当ー个数据包到达网络接口时,链路层设备驱动器通常会把它送给系统中的协议架构,但当BPF监听该网络接口时,驱动器首先会调用BPF的网络数据采集器——Tap函数。Tap函数会把该数据包再反馈到每ー个分享的应用程序对应的过滤器。该过滤器由程序员编制,它会是否决定是否接收该包以及接收该数据包中多少字节。要注意的是,过滤器过滤那些仍然处于链路层驱动器存储器中的数据包,只有当该包满足过滤条件时ォ把它复制到应用程序。这大大地优化了包捕获的性能和存储器的使用,因为如果ー个数据包不满足过滤器条件,系统不会对它进行复制等任何操作并会立即把它丢弃。如果数据包满足过滤器要求,Tap函数仅从链路层驱动器存储器中复制由过滤器指定的字节数到过滤器的存储缓冲器中。这时接口设备驱动器重新获得控制权,正常的协议进程得以继续进行。应用程序

15图2-2BPF的结构如果存储缓冲器满,进入的数据包就被丢弃,因而保持缓冲器也不会得到,应用程序同样也就无法为了从BPF接收数据包,应用程序要执行一个读系统调用,当保持缓冲器满时(或者ー个特定的超时设定过去时),BPF把缓冲器中的数据包复制到程序存储器并激活捕获进程。ー个应用程序可以同时接收多个数据包,为了保持数据包之间的边界,BPF给每个捕获的数据包进行封装,给它们加上一个包括时间戳、包长度以及包在数据队列中的偏移量等头部。3.2.3ー个重要问题请注意,不是所有的Unix版本都有BPF(即内核部分的数据包过滤及缓冲能力),但Pc叩库可以弥补这个缺陷。这个架构可以通过用户层以与BPF相兼容的方式过滤数据包,这个方案在NDIS包驱动器的第一个版本中被采用。它很容易实现,但是仍有有限的性能,主要有以下两个原因:过滤过程在用户层完成,所以在检测到用户应用程序是否需要之前,所有的数据包都必须从内核中复制到应用程序缓冲器,这显然会浪费CPU的时间和存储器。如果过滤过程在内核部分完成,所有捕获应用程序不需要的数据包会被系统丢弃,就不会再被复制到用户层。在内核中没有数据包缓冲器,在多任务环境下,捕获应用程序必须与其它程序ー起分享处理器时间。有可能一个数据包到达时捕获应用程序没有被执行。另外,应用程序也可能正在做其它工作,因此不可能等待数据包到来。由于缺少内核缓冲器,这种情况会导致数据包的丢失。这些原因决定了过滤过程及包的缓存是在包捕获驱动器中而不是在WinDump中实现。3.3与NDIS的交互NDIS(网络驱动器接口规程)是一整套的规定,它定义了网络适配器(或者,更精确地说是管理网卡的驱动程序)和协议驱动器(IP,IPX等)之间的通信。NDIS的主要目标就好象它是ー个

16包裹,它允许协议驱动器向网络LLAN或WAN中发送和从中接收数据而不需要关心所用何种适配器或何种Win32操作系统。NDIS支持三种类型的网络驱动器:网络接口卡或NIC驱动器。NIC驱动器直接管理网络接口卡(称为NIC),NIC驱动器向下直接与硬件接口,向上则为上层提供一个接口,用来向网络发送数据包,处理中断,重位NIC,停止NIC,查询或设置驱动器的特性,接口驱动器不可以与用户模式的应用程序通信,只可以与NDIS中间驱动器或者协议驱动器进行通信。NIC驱动器既可以是最简化模式(miniports)和综合模式(legacy)〇简化驱动器只完成管理NIC的面向硬件所需的操作,包括从NIC发送和接收数据,对于所有低层NIC驱动器的共同操作,如信号同步等,都有NDIS提供。简化驱动器不直接调用操作系统程序;它们与操作系统的接ロ就是NDIS〇简化驱动器不会跟踪协议绑定,它仅完成把数据所送给NDIS,NDIS则确认这些包是送给正确的协议。综合驱动器同时执行硬件相关的操作和信号同步,查询等通常由NDIS进行的操作。例如它可以为指定的接收数据维护自己的绑定信息。中间驱动器中间驱动器与上层驱动器如综合传输驱动器接口,向下则与简化驱动器接口。对于高层驱动器而言,中间驱动器就象-个简化驱动器,对简化驱动器而言,中间驱动器则象一个协议驱动器,中间协议驱动器可以建立在另ー个中间协议驱动器之上,当然这样做对系统性能有负面作用,开发中间驱动器的一个明显的原因是要在现存的综合传输协议和管理一种对于传输层驱动器未知的新介质NIC的简化驱动器之间的转换。例如中间驱动器可以从LAN协议转换成ATM协议。中间驱动器除了可以与NDIS驱动器通信外,还可以与用户应用程序通信。传输协议或协议驱动器协议驱动器实现了诸如!PX/SPX或TCP/IP的网络协议架构,它是在网络接口卡的上层提供服务。传输驱动器向上为应用层客户程序服务,向下则与一个或多个NIC驱动器或者是中间NDIS驱动器进行连接。下图显示了一个示例NDIS结构,它在同一网络适配器上有两个捕获架构。ー个架构有NIC驱动器和一个协议驱动器,另ー个架构有NIC驱动器,ー个中间驱动器和协

17数据包网络图2-3简单NDIS结构议驱动器组成。包捕获驱动器即要与网络驱动器(从网络取得数据),又要同用户层应用程序通信(向程序提供数据包),这由NDIS结构的协议驱动器实现。这使它可独立于网络硬件,因此可以与Windows支持的所有网络接口ー起工作。要注意的是,由于要受到驱动器和过滤器结构引起的限制,包捕获驱动器只能工作在以太网适配器,环形适配器以及ー些WAN连接上。同时也要注意,在协议驱动器看来WAN连接象一个以太网NIC,每ー个接收的包都由NDIS生成一个伪装的以太网头,这使得为以太网编写的协议驱动器不经任何修改就可工作于WAN的连接上。但也要指出的是,象PPPNCP-LCP等具体的数据包等,协议驱动器是看不到的,因为PPP连接是虚拟的。这意味着包驱动器不能捕获这种类型的包。请注意,不同的Win32操作系统有不同版本的NDIS:Windows95上的NDIS版本是3.0,而WindowsNT上是NDIS4.0,Windows2000上的是NDIS5.0,NDIS4.0和NDIS.05是NDIS3.0的子集,因此设计的与NDIS3.0ー起工作的驱动器(通常)也可以与NDIS4.0和NDIS5.0ー起运行。为NDIS3.0编写的包捕获驱动器,但它也可与NDIS当前版本ー起运行。这意味着驱动器和NDIS之间的交互过程在Windows95/98和Windows2000中都是相同的。下图显示了在Win32架构中包捕获驱动器所处的位置:与其下ー层NDIS驱动器通信的协议驱动器使用了NDIS提供的函数,协议驱动器,例如为了向下ー层NDIS驱动器发送一个或多个数据包,协议驱动器必须调用NDISSend或NDISSendPackets函数。另外一方面,较低层次的驱动器以异步的方式与协议驱动器进行通信。它们通过调用协议驱动器的自调用函数指出ー个新的包的到达并生成一个批向预期的缓冲器,指出它的大小以及接收的数据包的总的大小。包捕获驱动器中自调用函数称为数据采集器(PacketTap)〇包驱动器的行为方式与一个标准的协议驱动器是非常不同的。实际上:

18数据包网络图2-4NDIS中的数据包捕获驱动器包驱动器接收并处理当前网络上传输的所有数据包。这种行为可以通过适配器设置成“混杂模式”来实现,即强制它接收来自网络的所有的数据包。而一个标准的协议驱动器仅管理那些送来的单播,组播及广播数据包。包驱动器不实现了一个协议,但它存储并传输数据及它们的时间戳及长度到它们应到的应用程序中。•个标准的协议驱动器,删除数据包上的各类头部数据,仅把包中的数据传送到应用程序。而包驱动器则保留了头部并把捕获数据复制到应用程序。请注意,在Unix实现方案中,BPF直接由网络接口驱动器在协议架构之前调用。而捕获驱动器是协议架构的一部分,不可能在协议架构之前调用。这就是为什么包捕获驱动器不能捕获PPP类型数据包的原因。因为它不工作在硬件层,只在NDIS之上工作。如要在NDIS前就意味着要改变内核或NIC驱动器,这在Windows中是不可能的。3.3兼容性操作系统支持当前的包捕获驱动器都支持几乎所有的Win32操作系统,Windows95、Windows98、WindowsNT4及Windows2000〇在Windows9X版本中使用可以安装到95或98的一个驱拟设备(驱动器L.Oxd)。另一方面,WindowsNT4和Windows2000中则使用另ー种驱动器(.sgs),这是因为系统安装和初始化的过程是不同的。WindowsCE中的包捕获驱动器版本目前正在研发中。硬件兼容性包捕获驱动器最初主要是为以太网适配器而研发的。在以后的研究中又增加了基于其它MAC

19层设备的功能,但以太网还是它所支持的主要硬件。主要的原因在于我们的所有研发工作站上都有以太网适配器,所以我们的实验都是在这类网络中完成的。但是,目前的情况是:Windows95/98:包捕获驱动器在以太网上可正确运行,同时它也可以运行在PPP广域网连接上,只是有一些限制(如它不可以捕获LCP和NCP数据包)。WindowsNT4/2000:包捕获驱动器可以在以太网上正确运行,但我们不能使它工作在PPP广域网连接上,这是因为在NDIS广域网适配器的绑定问题还没有解决。从2.02版本开始,我们增加了FDDI,ARCNET和HTM等网络支持;但是国为我们没有此类硬件,所以这些功能还没有经过测试,所以不要指望它们在这些网络上能较好地运行。TokenRing网络不支持,我们也没有计划要在以后实现对该网络的支持。

20第四章协议分析协议分析是网络监听程序的最重要功能之一,通过对网络数据流的实时或事后的解码分析,可以了解到网络上运行的协议和服务、数据帧的源地址和目的地址、数据帧的格式等。作为网络监听主要应用之一的网络分析仪(也称为规程分析仪)能解码多少种协议,是衡量其性能的最重要的指标。•对局域网分析仪来说,它一般应能对EthernetMAC、TCP/IP>NovellIPX,AppleTalk.DECnet等协议的解码。•对广域网分析仪而言,它一般应能支持各种流行的WAN技术,包含X.25JSDN、FrameRelay、Tl/Elo•对于应用服务而言,优秀的网络分析仪往往能提供对数百种上层协议的解码。这一章我们将介绍该程序中用到的链路层的MAC帧和网络层的IP数据报的结构以及对他们的分析。其他协议的分析请查阅《监听与隐藏——网络侦听揭密与数据保护技术》一书的相关章节。4.1链路层支持第一章中我们粗略的讲了MAC帧,这里我们将详细的介绍一下.以太网通信时的帧结构由以下几个部分组成:帧头(Preamble)、帧的起始定界标志(SFD-StartofFrameDelimiter),目的地址(Destination)、源地址(Source)、数据长度(Lenth)、数据(Data)、帧校验序列(FCS)。图3-1描述了以太网数据链路层的帧格式,必须注意的是网络接口卡的驱动程序会负责计算校验和,并取走帧中的前同步码字段和校验和字段,因此pcap接收的数据包仅是其中的帧头和载荷部分。前同步码目的地址源地址类型数据CRC8字节6字节6字节2字节46-1500字节4字节I帧头II载荷II帧尾I

21图3-I以太网帧格式其中,帧头是62位的1、〇交替的位序列,主要是为通信提供同步信号,起始定界符表示有效帧的起始位置,为2位1,目的地址是帧在网络中传输的目的主机网卡的MAC地址,为6字节。目的地址有三种:物理地址、多址地址和广播地址。物理地址即接收方网卡地址,多址地址可代表多达64个地址,而广播地址则是表示该帧能到达的所有地址,它的6字节中所有位都为“1”。源地址为本机网卡的MAC地址,同样也占6个字节。数据长度表示数据域中有效数据的字节数。而数据域可以包含46—1500字节的有效数据,少于46时应填充一些无用数据,多于1500则应把数据分成多个帧。帧校验为帧数据的CRC-32位校验和。除帧头、帧起始定界符和帧校验字段由硬件自动填加外,其它字段必须由程序指定〇下面的代码定义了以太网帧类型域不同协议对应的常量和其他ー些以太网常数以及以太网帧头的数据结构。/*以下为ー些以太网常量定义*//*ETHERNER_TYPE_XXX常量定义了不同协议对应的帧类型域常数值,通过・类型域的值可以确定上层协议,奠定进ー步分析的基础*/#dedineETH_DSAP_SNA0x08#defineETHERNET_TYPEJP0x0800#defineETHERNET_TYPE_ARP0x0806#defineETHERNET_TYPE_REVARP0x8035#defineETHERNET_TYPEJPV60x86dd#defineETHERNET.TYPEJPX0x8137#defineETHERNET_TYPE_PPPoE_DISC0x8863#defineETHERNET_TYPE_PPPoE_SESS0x8864#defineETHERNET_TYPE_8021Q0x8100#defineETHERNETTYPECDP0x2000#dedineETH_SSAP_SNA0X00#dedineETH_DSAP_STP0x42#dedineETH_SSAP_STP0x42

22#dedineETH_DSAP_IPOxaa#dedineETH_SSAP_IPOxaa#defineETH_ORG_CODE_ETHR0x000000#defineETH_ORG_CODE_CDPOxOOOOOc#defineETHERNET_HEADER_LEN14#defineETHERNET_MTU1500/*以下为以太网帧头数据结构定义*/typedefstruct_EtherHdr{u_int8_tether_dst[6];u_int8_tether_src[6];u_int8_tether_type;}EtherHdr;typedefstruct_EthLlc{u__int8_tdsap;u_int8_tssap;JEthLlc;typedefstruct_EthLlcOtheru_int8_tCtrl;

23u_int8_torg_code[3];u_intl6_tproto_id;}EthLlcOther;4.2网络层支持网络层有IP协议支持、ARP/RARP协议支持、ICMP协议支持,这里只介绍IP协议支持。IP协议支持图3-2描述了IP数据包格式,IP数据由包头(20Bytes的固定部分和变长的可选部分,变长部分最长40字节)+TCP数据组成。III11II121212311014181216101418VersionIHLTypeofServerTotalLengthIdentiFicationFlagsFragmentationOffsetTimetoLiveProtocolHeaderChecksumSourceAddressDestinationAddressOptionsPaddingDatabeginshere...图3-2IP数据包结构•IP数据包以4位的协议版本号(Version,当前版本号4)和4位的头部长度(IHL)开始,头部长度指出以32位字长为单位的头部长度。•服务类型(TypeofService)域包含的值指明发送方是否希望以一条低延迟的路径或是以一条高吞吐率的路径来传送该数据包,当一个路由器知道多条通往目的地的路径时,就可以靠这个域对路径加以选择,但事实上目前儿乎所有路由器都忽略服务类型域。•总长(TotalLength)域长16位,说明以字节计的数据包总长度,包括头部长度和数据长度,因字长限制,数据包最长为65535字节。•标识(Identification)域长为16位,用于让目的主机判断本分段属于哪个数据包,属于同一数据包的分段具有相同的标识值。•标志(Flags)域长3位,第一位保留为0.第二位表示是否允许对该数据包分段,除数据包最后ー个段外的所有段都要置第三位为1。•段偏移量(Fragmentoffset)域长!3位,表示该分段在原数据包中的偏移量,此域的基本单位是8字节,除最后段外的其他段的数据长度取值应是8字节的倍数。•生存时间(TimetoLive)域长8位,用于限制分组的生存周期,防止其在网络中无限制的转发;当软件发生故障或管理人员错误的配置路由器时,就会产生

24这样的问题。发送方负责初始化生存时间域,它是1~255之间的整数。每个路由器处理数据包时,会将头部里的生存时间减1,如果达到0,数据包将被丢弃,并发送ー个出错消息给源主机。•协议(Protocol)域长8位,用于确定上层使用哪种传输协议;如果传输层协议是TCP,取值为6;如果传输层协议是UDP,取值为17。•头部校验和(HeaderChecksum)域长16位,用于确保头部在传输过程中不被改变。发送方将除了校验和域的头部数据每16位对1取补,所有结果累加,并将和的补放入头部校验和域中。接收方进行同样计算,但包括了校验和域。如果校验和正确,则累加结果应该为0。发现校验和错时的处理非常简单:数据包必须立即丢弃,而不作进ー步的处理。接收者不能相信数据包头部中的任何域,因为接收者不知道哪一位被改变了。甚至也不能发ー个出错消息给发送者,因为接收者不能相信包头重的源地址。同样,接收者也不能转发被损坏的数据包,因为它也不能相信包头中的目的地址。因此,接收者除了将被损坏的数据包丢弃外别无选择。•源地址(SourceAddress)域长32位,表示源主机(发送该数据包的主机)的IP地址。目的地址(DestinationAddress)域同样是32位,表示目的主机(该数据包的最终接收主机)的1P地址。当ー个IP数据包没携带选项(Options)时,头部长度(IHL)域的值为5,头部长度以目的地址域作为结束。为了便于后续版本引进新信息,提供可扩展能力,IP定义了一套选项(Options)。每种选项用ー个字节标明选项类型,ー个字节标明长度(可有可无),其余是若干数据字节。每种选项的总长度为4字节的倍数,不够则以全。填充(Padding),以保证头部长度为4字节的倍数;选择项最长为40字节。IP已经定义了下面五种选项,但是并不是所有的路由器都支持全部五种选项。•安全性(Security)说明信息的安全程度。实际上,几乎所有路由器都忽略此选项。•严格源路由(StrictSourceRouting)将从源到目的地的完整路径上所有的!P地址都记录下来。数据包必须严格地按照这条路径传送。当路由器崩溃时,该字段可用于发送紧急分组或测量时间。•松散源路由(LooseSourceRouting)同样是记录ー系列的IP地址,但只要求该数据包按照指定次序遍历所列的路由器,不是一条严格路径,可以穿越其他路由器。•记录路由(RecordRoute)令该数据包穿越的路由器将其IP地址加到选项域,但现在已经不够用了。•时间戳(TimeStamp)在记录路由的同时还记录ー个32位的时间标记,用于路由算法的纠错。下面的代码段将分别定义其固定部分数据结构:#defineIP_HEADER_LEN20/*IP包头固定部分长度・//*以下定义!P数据包固定部分数据结构*/#ifdefWIN32/・设置VisualC++pragma选项以关闭“nonstandardbitfieldtype”警告信息・/#pragmawarning(disable:4214)#endiftypedefstract_IPHdr(#ifdefined(WORDS_BIGENDIAN)u_int8_tip_ver:4,/*IPversion*/ip_hlen:4;

25#elseu_int8_tip_hlen:4,ip_ver:4;#endifu_int8_tip_tos;/*服务类型字段・/u_intl6_tipjen;/*数据包长度字段・/u_intl6_tip_id;/*identification字段・/u_intl6_tip_off;/・段偏移量字段*/u_int8_tip_ttl;/・生存时间字段*/u_int8_tip_proto;/・协议字段・/ujntl6_tip_csum/・校验和字段*/structin_addrip_src;/・源ip字段*/structin_addrip_dst;/*目标ip字段*/}IPHdr;#ifdefWIN32/・设置VisualC++pragma选项以开启“nonstandardbitfieldtype"警告信息・/#pragmawarning(disable:4214)#endif下面代码定义了可选项数据结构,将相应选项类型、长度和内容写入Packet结构中,以供最后分析使用。/*以下为!p可选项数据结构定义*/typedefstruct_Options(

26u_int8_tcode;u_int32_tlen;u_int8_t*data;}Options;/*以下为IP可选项类型常量定义*//*ipoptiontypecodes:预定义!P可选项类型・/#ifndefIPOPTEOL

27#defineIPOPT_EOL0x00#endif#ifndefIPOPT_NOP#defineIPOPT_NOP0x01#endif#ifndefIPOPT_RR#defineIPOPT_RR0x07#endif/*EndofOptionList选项表结束・//*NoOption无选项・//"RecordRoute记录路由选项・/#ifndefIPOPT_RTRALT#defineIPOPT.RTRAUT0x14/*RouteAlert路由警告选项・/#endif#ifndefIPOPT_TS#defineIPOPT_TS0x44/*TimeStamp时间戳选项・/#endif#ifndefIPOPT_SECURITY#defineIPOPT_SECURITY0x82/"Security安全性选项・/#endif

28#defineIPOPT_LSR0x83/*LooseSourceRouterRecor・松散源路由选项・/#endif#ifndefIPOPT_LSRR_E#defineIPOPT_LSRR_E0x84/"ExtendedLSRR・扩散松散源路由选项・/#endif#ifndefIPOPT_SATID#defineIPOPT_SATID0x88/"StreamID流代号选项"/#endif#ifndefIPOPT_SSRR#defineIPOPT_SSRR0x89/"StrictSourceRouterRecord・严格源路由选项・/#endif

29第五章系统分析5.1总体设计图4.1总体设计框图本次软件设计的总目标是利用WinPcap数据包捕获架构,Libpcap包捕获库,Packet.dl!库函数编写ー个能进行数据包捕获,分析以及盗用判断和记录的VC程序。根据这一目标,本人设计了上面的总体设计框图,程序分为两大模块:捕获模块和统计模块。捕获模块的功能当然是捕获数据包。使用WinpCap将网卡设为混杂模式,用Linpcap捕获数据包并放入缓冲区中,以供分析程序使用。分析模块分为数据包过滤(只分析以太网中的IP数据包),盗用判断(判断该数据包内的IP地址是否合法),记录数据(记录感兴趣的数据)。

305.1模块设计1.捕获数据:・般来说,网卡能收到网络中所有的数据包,但当网卡判断到该数据报不是发送到本机上的时,就会丢弃或转发掉。为了能够捕获网络中的数据包,必须改写网卡驱动程序,它不仅可以使网卡变成混杂模式,还能缓存收到的数据包,要编写这个驱动程序,你必须深入了解有关的网络编程知识,因为程序要直接对硬件进行控制与编程。具体的讲,程序要对网络中所有的NIC(网络接口控制)芯片进行编程,还要修改网卡的中断服务程序,接受数据包并根据・定的规则过滤,得到的有用包还要存入缓冲器或写入日志文件供进ー步的分析之用。自己编写嗅探程序是非常困难的事情,一个快捷的方法是我们可以从Internet上的到ー些商用或免费的驱动程序,比如,WinPcap数据包捕获架构,该架构是Win32操作系统增加了从网络中捕获数据包的能力,BPF是著名的可用在许多Unix系统上的有效的内核组件,它支持ー个强大的用户级接ローLibpcap库,利用这个库中的主要接口函数,我们就可以编写应用程序了,有关其库函数的详细信息请参阅附录1。2.数据包过滤:捕获程序捕获到的数据包多种多样,但不是所有的数据包都是我们感兴趣的。在本程序中,我们只对以太网中的!P数据包感兴趣,因此我们只要分析这类数据包。在以太网中我们捕获到的大多数包是MAC帧,其结构在上一章已经分析过了。中间有两个字节表示帧类型。如果是IP数据包,那么它的值应该是0800(16进制),此时帧中数据就是IP数据包,也就是说当它的值是0800时,就可以进行下一步的分析,否则,直接丢弃。3.IP包转发:既然我们用捕获程序捕获到了数据包,而且通过了过滤,那么我们就可以进行最后ー步,转发了。我们可以简单的通过存储ッ改写IP地址つ发送,三步来达到转发IP包的目的,至于IP包到目的后来源的鉴别,由于时间的仓促,水平的有限,我并没有涉及,有兴趣的读者可以自行完善。

31第六章程序实现上一章我们进行了系统设计,分析了各个模块和数据结构,这一章我们就来编程实现它。程序运行框图如下图5.1程序运行框图程序思路如下:首先要声明一个结构体以表示DIX格式的以太网帧头:typedefstruct

32(u_charDestMac[6];〃目的MAC地址u_charSrcMac[6];〃源MAC地址u_charEtype⑵;〃协议类型u_charOtherl[12];〃其他字段u_charSrcIP[4];〃源!P地址u_charDestIP[4];〃目的IP地址}ETHHEADER,*PETHHEADER;查找所有可用的适配器:char*psz=pcap_lookupdev(ebuf);for(inti=0;i=strlen(psz);psz+=i+l)m_wndComboBox.AddString(psz);m_wndComboBox.SetCurSel(1);建立捕获器:voiddispatcher_handler(u_char*params,constpcap_pkthdr*hdr,constu_char*data)(PPARAMSpParams=(PPARAMS)params;pParams->hdr=hdr;pParams->pszData=data;::SendMessage(pParams->hwnd,WM_CAPTURED,0,(LPARAM)pParams);}UINTCaptureProc(LPVOIDpVoid)

33IPPARAMSpParams=(PPARAMS)pVbid;〃开始捕获pcap_loop(pParams->pcap,0,dispatcher_handler,(u_char*)pVbid);return0;)开始捕获:voidCIPCheckDlg::OnStart()(//TODO:Addyourcommandhandlercodehereif(m_fStart)(MessageBox("正在运行…”);return;}m_fStart=true;m_fStop=false;m_wndStatusBar.SetPaneText(6,”运行中…”);〃选择适配器m_wndComboBox.GetLBText(m_wndComboBox.GetCurSel(),ad叩ter);if(adapter==NULL)

34(AfxMessageBox(nPCAPerror!'*);return;}〃打开指定的适配器m_pcap=pcap_open_live(adapter,2000,1,20,ebuf);if(m_pcap==NULL)(AfxMessageBox(**PCAPerror!**);return;}〃检查数据链路类型if(pcap_datalink(m_pcap)!=DLT_EN10MB)(AfxMessageBox(**NotEthernet10MBadapter!**);pcap_close(m_pcap);return;)m_params.hwnd=GetSafeHwnd();m_params.pcap=m_pcap;m_params.pszdfile=(u_char*)m_pdfile;m_list.DeleteAHItems();m_uNo=0;m_No=0;

35m_pthr=AfxBeginThread(CaptureProc,&m_params);分析数据报:#defineETHERNET_TYPEJP0x0800voidCIPCheckDlg::OnCaptured(WPARAMwParam,LPARAMIParam)(PPARAMSpParams=(PPARAMS)lParam;constpcap_pkthdr*hdr=pParams->hdr;constu_char*pszData=pParams->pszData;CStringstritem;PETHHEADEReth_header=(PETHHEADER)pszData;if((eth_header->SrcIP[01=eth_header->DestIP[01)==192&&(eth_header->SrcIP[l]=eth_header->DestIP[1]=168))(stritem.FormatC1%dM,m_uNo);m」ist.AddItem(m_uNo,0,stritem);strItem.Format(**%d.%d.%d.%d**,eth_header->SrcIP[0],eth_header->SrcIP[l],eth_header-

36>SrcIPf2],eth_header->SrcIP[3]);m」ist.AddItem(m_uNo,1,stritem);strItem.Format(n%d.%d.%d.%dM,eth_header->DestIP[0],eth_header->DestIP[l],eth_header->DestIP[2],eth_header->DestIP[3]);m_list.AddItem(m_uNo,2,stritem);CTimet=CTime::GetCurrentTime();strItem.Format(',%02d:%02d:%02d',,t.GetHour(),t.GetMinute(),t.GetSecond());m_list.AddItem(m_uNo,3,stritem);++m_uNo;-iIx|选择网络试配器:|RTL8139序号I函"地址「目的ip地址I时间01234567ooow1192.168.136.130192.168.0.25010:33:33192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:34192.168.136.130192.168.0.25010:33:37192.168.136.130192.168.0.25010:33:37looiQ91Afinクくn1介•Qd&IP包捕获转换

37转换IP地址//Other.cpp:implementationfile//#include"stdafx.h"#include"ipcheck.h"#include"Other.h"include"IPCheckDlg.h"#ifdef.DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=_FILE_;#endiflllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll//COtherdialogclassCIPCheckDlg;COther::COther(CWnd*pParent/*=NULL*/):CDialog(COther::IDD,pParent)

38//{{AFX_DATA_INIT(COther)//NOTE:theClassWizardwilladdmemberinitializationhere//}}AFX_DATAJNIT}voidCOther::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(COther)DDX_Control(pDX,IDC_LIST1,mjist);//}}AFX_DATA_MAPBEGIN_MESSAGE_MAP(COther,CDialog)//{{AFX_MSG_MAP(COther)ON_BN_CLICKED(IDC_exit,Oncancel)ON_BN_CLICKED(IDC_send,Onsend)//}}AFX_MSG_MAPEND_MESSAGE_MAP()〃〃〃〃〃ル〃〃〃〃〃/〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃/〃〃〃〃/〃〃〃///COthermessagehandlersBOOLCOther::OnInitDialog()

39CDialog::OnInitDialog();CIPCheckDlg*parent=(CIPCheckDlg*)GetParent();CStringstr;intncount,width;/*PPARAMSpParams=(PPARAMS)lParam;constpcap_pkthdr*hdr=pParams->hdr;constu_char*pszData=pParams->pszData;CStringstritem;PETHHEADEReth_header=(PETHHEADER)pszData;*/width二m」ist.GetStringWidth("序号")+20;m」ist.InsertColumn(〇,”序号",LVCFMT_LEFT,width);width=m_Ust.GetStringWidth('WIP地址”)+70;m」ist.InsertColumn(l,"源IP地址",LVCFMT_LEFT,width);width=m」ist.GetStringWidth("目的IP地址")+70;m」ist.InsertColumn(2,"目的IP地址",LVCFMT_LEFT,width);width=m_list.GetStringWidth("时间")+60;m」ist.InsertColumn(3,"时间",LVCFMT_LEFT,width);for(ncount=0;ncountm_list,GetItemCount();ncount++)m_list.InsertItem(ncount,,M,);//eth_header->SrcIP[O]=eth_header->DestIP[O];

40str=parent->m_list.GetItemText(ncount,0);m_list.SetItemText(ncount,0,str);str=parent->m_list.GetItemText(ncount,1);m_list.SetItemText(ncount,1,str);str=parent->m_Iist.GetItemText(ncount,2);m」ist.SetItemText(ncount,2,str);str=parent・>m」ist.GetItemText(ncount,3);m」ist.SetItemText(ncount,3,str);returnTRUE;voidCOther::Oncancel(){CDialog::OnCancel();)voidCOther::Onsend()〃其中SEND请参照程序TG

41小结Sniffer(嗅探器)是ー种常用的收集有用数据方法,这些数据可以是用户的帐号和密码,可以是一些商用机密数据等等。Snifffer可以作为能够捕获网络报文的设备,ISS为Sniffer这样定义:Sniffer是利用计算机的网络接口截获目的地为其他计算机的数据报文的ー种工具。好好利用Sniffer,它可以有以下正当用途:监测网络中的数据流量,分析网络故障;把网上数据进行存储并进过处理后转发到属于另一个网络的网卡上,实现包过滤功能;网络入侵检测;记录网络通信日志,査看网络安全状况。经过儿个月的学习和实践,我已经初步掌握了嗅探的原理,基本实现了数据包的捕获,地址的分析及!P包的重写。在整个过程里我经历了系统的需求分析、总体设计、详细设计等儿个阶段,基本上对ー个项目的开发有了比较完整的认识,对网络知识也有了深ー层了解。但是,在开发过程中我也遇到了不少问题。首先,对开发工具不够熟悉,VC++是ー个强劲的开发工具,它在网络和接口方面的编程十分方便,但是它也是ー门很深奥的语言,它所提供的库未能充分利用,也没能充分利用其面向对象的特点;其次,虽然对嗅探原理的认识比较深刻,但由于作者编程水平不行,实施起来很容易出现这样那样的问题,导致在整个开发过程中手忙脚乱,这对系统的开发有一定的影响。第三,作者捕获的是以太网中所有的!P数据包,其目的地址不一定是我们要的网内主机的地址,造成程序性能的下降,数据库的冗余,应该进ー步的过滤数据包。我认为这些主要还是因为本人实践机会太少,学习面太窄的原因。由于作者水平有限,只是完成数据捕获,IP包的转发这些基础功能,并没有做到真正意义上的路由器仿真而且对于程序的完善性也没有做太大的工作,有兴趣的读者可以在此基础上进ー步完善扩展它;可以对TCP包的端口字段实施监控;可以判断是否有不安全用户在访问本网;可以对网络实现全方位的监控;可以捕获用户数据查看用户隐私获取用户机密(可能触犯法律,请三思),当然作者的意思最好还是在此基础上扩展功能做成一个真正的软件路由器。

42附录1:WPCAP库介绍WPCAP库提供了对数据报捕获系统的ー个高层接口。所有的网络数据报(甚至是向其他主机发送的),都可以通过这种机制捕获。1.库函数列表#includepcap_t*pcap_open_live(char.device,intsnaplen,intpromise,intto_ms,char*ebuf)pcap_t*pcap_open_dead(intlinktype,intsnaplen)pcap_t*pcap_open_offline(char*fname,char*ebuf)pcap_dumper_t*pcap_dump_open(pcap_t*p,char*fname)charerrbuf[PCAP_ERRBUF_SIZE];char*pcap_lookupdev(char*errbuf)intpcap_lookupnet(char*device,bpCu_int32"netp,bpf_u_int32"maskp,char*errbuf)intpcap_dispatch(pcap_t*p,intent,pcap_handlercallback,u_char*user)intpcap_loop(pcap_t*p,intent,pcap_handlercallback,u_char*user)voidpcap_dump(u_char"user,structpcap_pkthdr"h,u_char*sp)intpcap_compile(pcap_t*p,structbpLprogram*fp,char*str,intoptimize,bpf_u_int32netmask)intpcap_compile_nopcap(int,int,structbp匚program*,char*,int,bpf_u_int32);intpcap_setfilter(pcap_t*p,structbpf_program*fp)voidpcap_freecode(structbpf_program*);u_char*pcap_next(pcap_t*p,structpcap_pkthdr*h)intpcap_datalink(pcap_t*p)intpcap_snapshot(pcap_t*p)intpcap_is_swapped(pcap_t*p)intpcap_major_version(pcap_t*p)intpcap_minor_version(pcap_t*p)intpcap_stats(pcap_t*p,structpcap_stat*ps)FILE*pcap_file(pcap_t*p)intpcap_fileno(pcap_t*p)voidpcap_perror(pcap_t*p,char"prefix)

43char*pcap_geterr(pcap_t*p)char*pcap_strerror(interror)voidpcap_close(pcap_t*p)voidpcap_dump_close(pcap_dumper_t*p)WIN32下特定函数:intpcap_setbuff(pcap_t*p,intdim)intpcap_setmode(pcap_t*p,intmode)intpcap_setmintocopy(pcap_t*p,intsize)HANDLEpcap_getevent(pcap_t*p)intpcap_sendpacket(pcap_t*p,u_char*buf,intsize)注意:在inpcap_open_live(),pcap_open_offline(),pcap_lookupdev(),和pcap_lookupnet()函数中的errmZ1参数规定至少要有PCAP_ERRBUF_SIZE的字节长。pcap_t*pcap_open_live(char*device,intsnaplen,intpromise,intto_ms,char*ebuf)pcap_open_live()返回一个用来嗅探网络中的数据报捕获的描述符。device是指定要打开的网络试配器名称的字符串。在2.2以后的版本的Linux中,如果把“any”或NULL传给血ガce,就可以捕获来自主机中所有网络试配器的数据报。snaplen指定要捕获的数据报的最大字节数。pm/nisc指定是否打开网络适配器的混杂模式。(注意:即使本参数被错误设置,网络试配器也可能因为其他原因工作在混杂模式)目前,该参数还不能在“any”设备上工作:假如把“any”或NULL传给deガce,promise的值将被忽略。か」ns指定读取延时毫秒数。读取延时的作用是当ー个数据报到达时,函数不会立即返回,它会等待一定的时间允许更多的数据报到达,实现从系统的核心层一次读取多个数据报。读取延时并不能得到所有系统的支持:在不支持该特性的系统中,读取延时将被忽略。动”/用作返回错误文本,且只在pcap-open」ive()执行失败并且返回NULし时被设置。pcap_t*pcap_open_dead(intlinktype,intsnaplen)pcap_open_dead()当调用libpcap库中其他的函数时用来产生一个pcap_t结构。它通常配合libpcap库编译BPF代码使用。pcap_t*pcap_open_offline(char*fname,char*ebuf)调用pcap-open.offline。可以打开并读取ー一个已保存的网络流量文件。ガ⑷指定要打开的文件名。文件格式与在tcpdump(l)和tcpslice(l)中使用的文件格式相同。文件名“-”等同与stdin〇ebu/用作返回错误文本,且只在pcap-open-offline。执行失败并且返回NULし时被设置。pcap_dumper_t*pcap_dump_open(pcap_t*p,char*fname)

44调用pcap_dump_open。可以打开并写入,ー个文件。文件名等同与stdout0函数执行失败时返冋NULLop是pcap结构类型的pcap_open」ive()或pcap_open_offline()的返回值。/name指定要+丁开山文件名。当返回值あNULし时,pcap_geterr()可以用来获得错误文本。char*pcap_lookupdev(char*errbuf)pcap_lookupdev()返回・个适用于pcap_open」ive()和pcap_lookupnet()的网络设备指针。国有执行错误时,函数返回NULL笄且填云em/ー个适当的错误消息文本。intpcap_lookupnet(char*device,bpf_u_int32*netp,bpf_u_int32*maskp,char*errbuf)pcapjookupnet。用作取得网络设备device的网络号和掩码。netp和maskp都是buf_u_int32结构的指针。返回值-1表示函数执行错误,并且eかび被填充一个适当的错误消息文本。intpcap_dispatch(pcap_t*p,intent,pcap_handlercallback,u_char*user)pcap_dispatch()用作i攵集ネロ处理数骑报。c両指定在函数返回之前最多要处理的数据报数。这不是最少数目:当读取ー个实时捕获驱动器时,一次仅读取ー个缓冲区的数据报,所以可能少于C両个数据报被处理。当C両被设置为ー1,如果读取的是ー个实时捕获驱动器,一次处理一个缓冲区的数据报;如果读取的是ー个“savefile”,一次处理该文件中所有的数据报。callback指定一个带有3个参数的函数指针:•个从pcap_dispatch()传入的u_char指针;ー个用来处理网络头部和数据的pcap.pkthdr结构的指针;一个指向数据报中数据的u_char指针。函数返回值为实际读到的数据报数。如果返回值为〇,要么ー个实时捕获驱动器中未读到数据报(比如,数据报因为没有通过过滤器而被丢弃掉;在一个支持读取延时的系统中整个延时过程中都没有数据报到达;捕获设备件描述符处于非阻塞模式而其中又没有数据报可读取),要么"savefile”中没有更多的数据报可读取。返回值为ー1表示有一个错误,可以通过pcap_perror()或pcap_geterr()显示错误文本。注意:在读取ー个实时捕获驱动器时,pcap.dispatch。不一定在时间延时过后返回。ー些系统不支持时间延时;在另外一些系统上,时间延是在收到至少ー个数据报后オ开始起作用。这意味着时间延时不应该被用在交互的程序中周期性的对用户输入进行检测,因为pcap_dispatch()不保证在时间延时过后返回。intpcap_loop(pcap_t*p,intent,pcap_handlercallback,u_char*user)pcap_loop()和pcap_dispatch()很相似,有一点不同的是它直到读取完ent个数据报或遇到ー个错误后オ返冋。它不会在时间延时过后返回。相对地,为pcap-open」ive()指定・ー个非〇值然后调用pcap_dispatch()允许在ー个时间延时后接受和处理到达的任何个数据报。ー个负的ent值让pcap.loop。永久循环执行(或者至少直到ー个错误发生)。u_char*pcap_next(pcap_t*p,structpcap_pkthdr*h)pcap_next()返回一个指向木ー个数施报的u_char指针。voidpcap_dump(u_char*user,structpcap_pkthdr*h,u_char*sp)pcap_dump()篇出ー个数据报到由pcap_dump_open()打开的“savefile”。注意它的参数适用于pcap一dispatch。和pcap_loop()ointpcap_compile(pcap_t*p,structbpf_program*fp,char*str,intoptimize,bpf_u_int32netmask)

45pcap_compile()用于编辑ー,个字符串str成为ー个过滤器程序。program是ー个指向bpf_program结构的指针,被pcap_compile()修改。。0ガ加ze控制结果代码是否耍优化。指定本网络中的掩码。返回值为-1表示有-个错误,可以通过pcap_gete门<。显示错误文本。intpcap_compile_nopcap(int,int,structbpf_program*,char*,int,bpf_u_int32)pcap_compile_nopcap()与pcap_compile()相似,不同的是作为参数传给它的不是pcap结构而是精确的最大数据长度和链接类型。这是ー种直接的BFP用法,不用调用pcap.open。就可以编辑过滤器。返回值为ー1表示有一个错误,但没法得到错误文本。pcap_compile_nopcap()是pcap_open_dead(),pcap_compile()和pcap_close()的整合;后3个函数可以直接使用来获得编辑过滤器出错时产生的错误文本。intpcap_setfilter(pcap_t*p,structbp匚program*fp)pcap_setfilter()用来キ旨定一个过滤器程序。fp是一个指向bpf_program结构的指针,通常通过pcap_compile()设置。返回值为ー1表示有一个错误,可以通过pcap_geterr()显示错误文本。返回值为〇时表示正常返回。voidpcap_freecode(structbpf_program*);pcap_freecode()当BPF程序不再需要时,释放由pcap_compile()产生的被ー个bpf_program结构指向的ー块内存空间。比如,在调用完pcap_setfilter()之后。intpcap_datalink(pcap_t*p)pcap_datalink()返冋薮加!・链路层的类型,比如DLT_EN10MBointpcap_snapshot(pcap_t*p)pcap_snapshot()扳回pcap_open」ive()中设置的最大数据长。intpcap_is_swapped(pcap_t*p)pcap_is_swapped()当当前"savefile”中的字节顺序与当前系统的不同时返回值为真。intpcap_major_version(pcap_t*p)pcap_major_version()返回写入“savefile"中的pcap的主版本号。intpcap_minor_version(pcap_t*p)pcap_minor_version()返回写入“savefile"中的pcap的次版本号。FILE*pcap_file(pcap_t*p)pcap_file()返回savefile"文件名。intpcap_stats(pcap_t*p,structpcap_stat*ps)pcap_stats()返回宿为〇,设置ー个pcap_stat结构。该结构包含了从捕获过程开始运行到函数调用这段时间中的数据报统计值。当有错误或底层的数据报捕获驱动器不支持数据报统计,返回值为T,并且可以通过pcap_perror()或pcap_geterr()显示错误文本。intpcap_fileno(pcap_t*p)pcap_fileno()返回usavefile"文件描述号。

46voidpcap_perror(pcap_t*p,char*prefix)pcap_perror()在strerr上打印pcap库上一次错误的文本,前面加上字符串prefix〇char*pcap_geterr(pcap_t*p)pcap_geterr()返回pcap库上一次错误的文本。注意:当传给它的pcap_t关闭后,该指针将不再指向一个有效的错误文本字符串。使用者必须在pcap_t关闭前使用或拷贝该字符串。char*pcap_strerror(interror)pcap_strerror()在strerror⑴不能使用时提供。voidpcap_close(pcap_t*p)pcap_close()关闭与p关联的文件,并且释放所有资源。voidpcap_dump_close(pcap_dumper_t*p)pcap_dump_close()关闭"savefile”。intpcap_setbuff(pcap_t*p,intdim)pcap一setbuff。设置箱p关联的内核缓存大小为由,〃。当执行顺利时返回值为〇,否则为-lo当以前的缓存也是由pcap-setbuff()生成的,它将被释放,其中的数据报也将被丢弃。pcap.setbuff。在默认情况下开辟1MB缓存。intpcap_setmode(pcap_t*p,intmode)pcap_setmode()设置施置接口p的工作方式。可选值有MODE_CAPT(默认捕获模式)和MODE_STAT(统计模式)。如果接口工作在统计模式下,在pcap_dispatch()或pcap」oop()中被设置的被叫函数将每隔to_ms亳秒被调用一次(to_ms为传给pcap_open」ive()的时间延时)。收到数据报包括2个64位整数,分别表示数据报数和满足在pcap.filter。中设置的过滤器的数据报总字节数。intpcap_setmintocopy(pcap_t*p,intsize)pcap_setmintocopy()设置施使读ー个数据报驱动器过程返回(不是因为过了时间延时)的内核缓存中的最少数据量。如果size比较大,内核将等待足够的数据报到达オ将其一起拷贝给用户。这保证了较少的系统调用(比如较少的CPU使用率),适用于数据报嗅探和协议分析等应用软件。相反地,较小的size值将使数据报一到达内核就拷贝给用户。这适用于需要内核最快响应的实时分析的软件。HANDLEpcap_getevent(pcap_t*p)pcap_getevent()返回与接口p相关联的事件的句柄。这个事件可以传给像WaitForSingleObject或WaitForMultipleObjects这样的函数使得在驱动器的缓存中有数据之后オ调用读过程。intpcap_sendpacket(pcap_t*p,u_char*buf,intsize)pcap_sendpacket()不通过直接调用底层AP!而是使用libpcap库向网络发送原始数据报。p是要发送数据报的网络接口。砥/•包含了要发送的数据报内容(包括各种协议头)。size是"/所指向的缓存的尺寸。MACCRC不需要计算并加到数据报中去,它是由网络接口透明的加到数据报末尾去的。

47附录2:参考文献(英文)RunningSnortonIISWebServers:PartIbyMarkBurnettlastupdatedJan.17,2000IntroductionNottoolongagowhentalkingaboutnetworksecuritytoolslikeSnortorNmap,thoseofusintheWindowsworldwereoftenleftontheoutsidelookingin.TheproblemwasthatthosetoolssimplywerenotavailableforanyWindowsplatform.Butrecentlythingshavechanged.Snort,Nmap,Ngrep,andmanyothernetworksecuritytoolshavebeenportedtotheWin32platform.Finallywecanplaytoo.Inaworldofbloatedapplicationsandclutteredwindows,thesimplicityofacommand-linetoolsuchasSnortcanbeattractive.IamaWindowsuserandyetIfindmyselffrequentlyopeningupthecommandpromptforsomeMS-DOSaction.Thesimpleeleganceofrunningthe175KSnortexecutableonacommand-lineismuchpreferabletoamemory-hoggingWindowsapplicationthatisnotanyeasierto

48learnoruse.It*sthissimplicitythatmakesSnortsopopular.Itissimpleandyetithasenoughpowertoprotectagood-sizednetwork.Itdoesnottrytobeeverything-itdoesonejobanditdoesitefficiently.Itwatchesnetworktraffic,lookingforrule-basedintrusionsignatures,alertingandloggingwhenamatchismade.ThereisnoGUI,noreportingengine,andnopop-uphelpfile,justasimplecommand-lineutilitythatsniffstrafficandkeepsonsniffinguntilyoutellittostop.Althoughtherearethosewhowouldconsiderthisaweakness,itisexactlywhatmakesitsoversatileandsopowerful.Snort-ABriefOverviewMartinRoeschdevelopedSnortin1998forUnixplatforms.Dubbingita"LightweightIntrusionDetectionSystem,"MartinmadethetoolopensourceandthenumberofpeopleusingSnorthasbeengrowingeversince.Inthesummerof2000,MikeDaviscreatedthefirstWin32portofSnort,bringingagreattooltoawholenewworldofWindowsusersandbringingaworldofWindowsuserstoadifferentunderstandingofsecurity.ThetoolhasasmallmemoryfootprintandnormallyusesverylittleCPUpowertodoitsjob.Theapplicationrunsquitesociallywithotherapplications,veryrarelycrashingorcausingotherprogramstocrash.Andbestofall,itiscompletelyopensourceandfreeforanyonetouse.However,aswithanysecuritytool,itiseasytofeelafalsesenseofsecurityonceitisupandrunning.OnemustappreciateSnortforwhatitisanduseitforitsstrengths,namelysniffingtrafficlookingforattacksignatures.ItmustberememberedthatSnortwillonlyserveasonecomponentinaneffectivesecuritystrategy:firewalls,loganalysis,andgoodsecuritypolicyarestillimportantaspectsofasecurenetwork.UsingSnortSnort*susesarewidespreadandvaried,includingnetworkintrusiondetection,protocolanalysis,troubleshooting,controllingunauthorizedapplications,andevenpasswordsniffing.Dependingontherule-setandconfigurationused,Snortcanbeaninvaluabletoolforbothnetworkandsecurityadministrators.OnethingthatSnortisparticularlygoodatiswatchingawebserverforweb-basedattacks.Itcanrunonthewebserveritselforonanothercomputerwithinthatsamenetwork.Andwiththerightrule-set,veryfewattackswillgobyundetected.ThemostdifficultpartaboutusingSnortisgettingitinstalledandrunning.SnortandtheWinpcapdriversmustbeinstalledmanuallyandrequirearebootofthecomputer.Althougheverythingusuallyinstallswithoutproblems,therearetheoccasionalconfigurationsthatneedsometweaking.Totestyourinstall,openacommandpromptandfromtheSnortdirectorytype:"snort.exe-dve".Then,openupanInternetbrowserwindow,orusesomeothernetworktool.Thecommandpromptwindowshouldinstantlybefilledwithnetworkpacketcaptures.Ifthatiswhatyousee,thenyouareinbusiness.IfSnortdoesnothingoryougetanerror,thenyoumustgobackandretraceyourstepstoseewhatwentwrong.ThefirstdecisiontomakewhenusingSnortiswhereyouaregoingtorunit.Snortcanlistentoalltraffictoonecomputeroritcanputthenetworkadaptorinpromiscuousmodeandlistentoalltrafficonthewire.Theamountoftrafficithastoanalyzecaneffectitsperformance.Withthatinmind,Ipreferto

49haveonecopyofSnortwithalargerule-setrunningonthewebserverlisteningonlytothatcomputer'straffic.Atthesametime,Ikeepanothercopyrunninginpromiscuousmodewithamoregeneralrule-setonanothernetworkcomputer.Thatway,thecomputerthatisexposedtotheInternethasalargerrule-settomonitor,butmonitorsfewerpackets,i.e.onlythosethataredirectedatthatcomputer.Ontheotherhand,thecopyofSnortrunningonthenetworkwillmonitorthewholenetworkbutwillhaveasmallerrule-settoprocess.Itisalsoimportanttoconsiderwhatcommand-lineoptionstousewhilerunningSnort.Usingfastalerting,loggingtoTCPDUMPformat,andavoidingtheuseofverbosemodewillallhelptospeedupSnorttohandlemediumtolarge-sizednetworks.RefertotheSnortdocumentationforacompletelistingofalltheoptionsandtheirdescriptions.AnotherdecisiontheuserwillhavetomakeishowtolaunchSnort.Sure,youcanopenupacommandpromptandrunittherebutthecommandpromptwindowmustremainopenwhileSnortisrunning.OnWindowsNT/2000themoreefficientmethodistorunitasaservice.RunningSnortasaserviceallowsyoustartandstopSnortfromthecommandprompt.Anotheroption,andonethatworksbetterwithWin9xcomputers,istouseXato'sfreewaresnort.paneltool.Snort.panelhasbeendesignedtosetSnortoptionseasily,aswellastomonitorSnortandthelogsitcreates.Snort.panelwilllaunchSnortinthebackgroundandflashatrayiconwhenalertsarelogged.Finally,althoughSnortishardlyaresourcehog,itdoesuseCPUtime,memory,andpotentiallyahugeamountofdiskspace.Ifasystemisalreadyoverloaded,itobviouslywouldnotbeagoodplacetorunSnort.Youshouldconsiderhowmuchspaceyouwanttodedicatetologsandbesureyouhaveplentyofspacetostorethelogs.RulesStrategyAwellthoughtoutrulesstrategyiscrucialtotheeffectiveimplementationofSnort.RulesestablishtheparameterswithinwhichSnortoperates.Withoutarulesfile,Snortwilllogallpacketsthatitsniffsonthewire.Asthiswouldcreateanenormousamountofinformation,usersmustgiveSnortarulesfilethatclearlydefineswhattologandwhentoalert.Therulesfileisthegutsofthesystemanddetermineshoweffectiveitwillbe.Developinganeffective,efficientrulesfileiscrucial,itisalsotricky.Arulesfilecannotbesocompletethatitcreatestoomany(oftenfalse)alarms,therebycausingalertstobeignored.Ontheotherhand,itmustbecompleteenoughtodetectawiderangeofattacks.Forthisreason,itisimportantthattheuserhaveaclearunderstandingofwhatheorshewantstoaccomplishwithSnort,andtoconfiguretherulesfileforoptimalattainmentofthoseobjectives.RulesshouldalsobeoptimizedsothatSnortdoesnotputtoomuchofaloadonthesystem.SnortisaprogramandprogramsrequireCPUtime.Themorecodeaprogramruns,themoreCPUtimeitrequires.Iftherearemanynetworkpacketstocompareagainstalargerule-setitwilltakemoreCPUtimethatasmallrule-set.Ultimately,yournetworkconfigurationandtrafficloadwilldeterminewhatsizerule-setwillworkbestforyou,butcarefulconsiderationshouldbegiventoyourrulesstrategy.Youmustknow

50yournetworkandcustomizetherulesforyourparticularneeds.Onethingusersavoiddoing,istodownloadthegenericrule-setfromtheSnortwebsiteandblindlyimplementit.Bydoingthat,youwillprobablygetmanyfalsealertswhilelettingmanyattacksgobyundetected.Evenworse,thismaycreateafalsesenseofsecuritythatcouldpreventyoufromimplementingothersecuritymeasures.Ifyoudonotwanttobotherwithmakingyourownrules,perhapsSnortisnotthebesttoolforyou.(Infact,ifthatisthecase,youdonotdeservetouseSnort.)Inadditiontothenumberofrules,itisalsoimportanttoconsiderthecomplexityoftherules.Rulesthatusethe"content"optionaremuchmorecomplexthanotherrules.ContentmatchingrequiresmanyCPUinstructionsandloops.Tolightentheload,userscanincluderuleoptionsthatarelessprocessor-intensive,suchasthe"flags"option.WebrequestswillhavethePSHandACKflagssetbyusing"flags:PA"beforethecontentoption;asaresult,the"flags"criteriamustbematchedbeforethecontent.Ifitdoesnotpassthe"flags"criteria,thecontentmatchwillnotevenbeperformed.Keepinmindthattheorderinwhichtheoptionsappearintherulewillaffecttheorderinwhichtheyareevaluated.Thisisacommonsourceofusererror,anditcanhaveanegativeeffectontheruleperformance.Onrulesthatarecheckingforwebattacks,youmaywanttolimitthedestinationtothespecificIPaddressofyourwebserver,whichwillkeepmanypacketsfromhavingtobechecked,thereforefurtherlighteningtheload.IfyoulookatIISvulnerabilities,youwillseethatmanyrulescanbecombinedtomakeamoreefficientrule-set.Forexample,thereareseveralvulnerabilitiesintheiissamplesandsamplesdirectories.Allofthesecouldbecombinedbysimplycheckingforthecontent"samples/"withinapacketdestinedforport80.Thiswillalertwhenanyofthefollowingrequestsaremade:/iissamples/exair/howitworks/Codebrws.asp/iissamples/exair/howitworks/Code.asp/iissamples/exair/howitworks/Codebrwl.asp/iissamples/sdk/asp/docs/codebrws.asp/iissamples/sdk/asp/docs/codebrw2.asp/iissamples/query.asp/iissamples/exair/search/advsearch.aspTotakethatconceptevenfurther,youcouldmakeitsimplymatchon“samples/"andalsogetthefollowingurls:

51/samples/search/queryhit.htm/adsamples/config/site.csc/scripts/samples/search/webhits.exe/msadc/samples/adctest.asp/scripts/samples/details.idc/scripts/samples/ctguestb.idc/msadc/Samples/selector/showcode.asp/Sites/Samples/Knowledge/Membership/InspiredAriewCode.asp/Sites/Samples/Knowledge/Membership/Inspiredtutorial/ViewCode.asp/Sites/Samples/Knowledge/Push/ViewCode.asp/Sites/Samples/Knowledge/Search/ViewCode.aspInthisway,throughcarefulplanning,youcaneasilyturneighteenrulesintoasinglerule.Certainly,youdonothavethegranularityinyouralerts,butifsomeoneislookingforsamplefilesonyourwebserver,doyoureallycareexactlywhichfiletheyarelookingfor?AnotherdecisiontobemadeinruleselectioniswhetheryoushouldincluderulesmatchingvulnerabilitiesforotherwebserverssuchasNetscapeorApache.Someusersarguethatifanattackisnotsomethingthataffectsyourwebserver,therereallyisnopointinbeingalertedifsomeonescansforit.Forexample,onemaychoosetoleaveoffcgi-binrulesiftheydonotevenhaveacgi-bindirectoryontheirwebserver.Theothersideoftheargumentisthatanintrusiondetectionsystemshouldwarnofanattemptedattack,regardlessofwhetheritwouldactuallyhavesucceeded.Ifyourstrategyistokeeptherule-settrim,thenyoumayonlywanttocheckforafewofthemostcommonscansintendedforotherservertypes,especiallythosethatdonotproducemanyfalsealerts.Ontheotherhand,ifyouarefindingthatyouhaveenoughsystempowertospareyoumaywanttothrowinjustaboutanythingyoucan.Thebalanceistogetenoughpre-warningofanattackwithoutproducingtoomanyfalsealerts.Afulldiscussionoftheintricaciesofimplementinganeffectiverule-setisbeyondthescopeofthisarticle.ForcompleteinstructionsonusingSnortrules,refertothedocumentWritingSnortRules.ConclusionThroughtheimplementationofcarefullyconsideredrulesandsmartrulestrategies,youcandetect,logandminimizemostIISattacksbeforetheybecometooserious.Youcanalsohaveabetterpictureofwhatishappeningontheirwebsite.Youcancatchscriptkiddiesbeforetheycaninflictmeaningfuldamageonauser'ssite,andeventhemoreadvancedattackerswillgenerateafewalerts.Youwillpick

52uponallkindsofnetworkabuse,comingfromtheoutsideaswellasfromwithin.Allfromatinycommand-linetoolnamedSnort.参考文献(翻译):在IIS网络伺候器上运行Snort:PartI作者MarkBurnett最后更新2000.1.17介绍不久以前当谈论到网络安全工具像Snort或Nmap,那些被我们在Windows世界中时常用做外部访问。问题是那些工具不是任何的Windows平台可以使用的。但是最近这种情况已经改变。Snort,Nmap,Ngrep和多数其他的网络安全工具已经被移植到Win32平台。最后我们也能用了。在ー个充斥着许多应用软件的Windows世界中,命令行工具,像简单的Snort是很吸引人的。我是Windows的使用者,但我还是时常自己打ー些MS-DOS指令。简单而高雅的在ー个命令行上运行175K的Snort命令和Windows内存申请相比,无论是对学习或是对使用都是比较容易的。它是如此的简单而使Snort如此流行。它很简单,然而它依然有充足的力量保护ー个大的网络。它并不是全能型的ー它做ー个工作,而且它做的很有效率。它嗅探网络交通,找寻规则并做记号ー在入侵的基础上,;提醒,当ー个匹配被建立的时候。没有GUI(图形用户接口),没有报告引擎,没有帮忙文件,只是一个交通嗅探器,它会继续嗅探,直到你它告诉它停止。虽然有会考虑这缺陷的人,但这是正确的,这使它功能如此完全。Snort-摘要概述MartinRoesch在1998年为Unix平台编写了Snort〇配给它ー个“轻型入侵发现系统",Martin公开了工具使得使用Snort的人数已经一直增加至今。在2000年夏天,MikeDavis编写了Snort的第一个Win32接口,带ー个很棒的工具给Windows使用者的ー个全新的世界而且带Windows使用者的ー个对安全有着不同理解世界。エ具有一个小的内存,当正常地使用他时占用很少CPU来做它的工作。这个软件和其他软件之间的兼容性很好,很少发生冲突。最好的是,它是完全公开而自由的让任何人使用。然而,如同任何别的安全工具一样,当它运行时很容易产生一个假安全感。你必须知道Snort是什么而且使用它的力量,即嗅探交通找寻攻击迹象。Snort将只会提供一个有效的安全策略:防火墙,经过长时间分析,好安全政策仍然是一个安全的网络的重要方面。使用SnortSnort有很广泛的用处,包括网络闯入发现,记录分析,故障修理,控制未经认可的申请,和密码验证。依赖规则和使用的结构,无论对网络或网络安全管理人来说Snort都是一个无价的工具。Snort

53很独特,当遇到ー个基于WEB服务器的WEB攻击时。它能涉及网伺候器它本身或在另外的一部计算机上在那个相同的网络里面。而且由于正确的规则ー放置,只有很少的攻击能躲过Snort的监控。最困难的部份是关于Snort的安装和运行的。Snort和Winpcap驱动程序必须手动安装而且需要计算机重新启动。虽然很多事平时安装不会有问题,但是有些情况下会有结构混乱。测试你的安装,从Snort目录类型打开ー个命令提示:"snort.exe-dve".然后,打通一个英特网浏览窗口,或使用ー些其他的网络工具。窗口应该立即充满被捕获的数据包。如果你的到的是这个,那么你可以开始工作了。如果Snort什么也不做或你得到ー个错误,那么你一定回去ー步步的来,试着找出错误。第一•需要作出的决定是当使用Snort的时候是你要在那里用它。Snort能监听一部计算机的所有通信,或者把网卡设为混杂模式来监听线上所有数据。它要分析总计的数据包。由于这个原因,我更喜欢ー个大的在WEB服务器上的只监听传输的Snort副本。同时,我让另ー个副本在ー个一般的混杂模式中运行在另外的一部网络计算机上。那样,连接在英特网的计算机要遵守更多的规则监测,只是监听较少的包,也就是只有在那一部计算机被指示的那些。另ー方面,涉及网络的Snort副本将会检测整个的网络但是将会遵守较少的规则。当运行Snort时候命令行的选项也是很重要的。使用快速地传送,TCPDUMP格式,避免用字多的模态将会全面帮助加速Snort在大的网络中处理媒体的速度。关于所有的选项的描述请参照Snort清单文件。另ー个使用者必须作出的决定是如何载入Snorto当然,你能打通一个指令提示面且在那里运行它,但是当Snort正在运行的时候,Windows一定保持的指令提示打开。在WindowsNT/2000上较有效率的方法是把它当作一个服务器。当以一个服务器运行时,你可以通过指令提示控制Snort的开始或停止。另外的选项,ー个在Win9x计算机上工作的更好,使用Xato's的共享软件snort,panel工具。Snort,pane!已经被设计地很容易设定Snort选项,和检测Snort日志。当日志被建立时,Snort,panel将会在后台载入Snort而且闪出ー个盘符来提醒你。最后,虽然Snort几乎不占用资源,但是它运行是占用CPU时间,内存,以及极大量的磁盘空间。如果ー个系统已经被超载,它明显地不是ー个运行Snort的好地方。你应该考虑你准备了多少空间来存放日志,并且确定你有那么多空间。规则策略ー个好的规则策略对Snort的有效执行是决定性的。规则在Snort运行内决定参数。没有一个规则文件,Snort将会捕获它在线上嗅探到的所有包。这会产生巨大的数据量,使用者一定给Snort一个规则文件以清楚地定义什么要被记录下来和什么时候提醒。规则文件是系统的核心并且决定它将以什么样的效率运行。发展一个有效的,有效率的规则文件是非常重要的,它也是机警的。ー个规则文件不可能如此的完全以致它产生太多警报,因此引起被忽略警告。另一方面,它一定要能够完全发现大范围的攻击。因为这ー个理由,使用者他或她要对于Snort完成的任务有清楚的理解,这很重要,为达到那些目的使用最佳的配置规则文件。规则也需要被优化以便Snort在系统上负荷不太多。Snort是ー个进程,面且是需要CPU时间的进程。ー个进程使用更多的代码,它也就需要更多的CPU时间。如果有许多包的话遵守较多的规则会比遵守较少的规则花更多的CPU时间。最后,你的网络结构和流量将会决定须设置的规则的大小,但是小心的考虑会给你合适的规则策略。你要为你的特别需要面定制你的网络规则。

54有一件事使用者应避免去做,从Snort网站下载一般的规则并盲目地使用它。那样,你将会不能发现许多错误。甚至更更坏,这可能产生一个假安全感会阻止你实现其他的安全措施。如果你不对于设置你自己的规则烦扰,也许Snort对于你来说不是最好工具。(事实上,如果是那样的话,你不该使用Snort)。除了规则的数量,规则的复杂性也要考虑。使用〃内容〃选项的规则是比其他的规则更复杂。内容相配需要许多CPU指令和环。为了减少负荷,使用者可以在选项里包括规则那样就可以减轻负荷,像是〃门ag〃选项。网络请求将会在PSH和ACK标记设置之前使用〃flag:PA〃;结果,〃门ag〃标准一定在被相配之前得到满足。如果它不经过“flag〃标准,匹配甚至不会被运行。注意命令在哪个选项中出现将会影响他们正在评估的命令。这是使用者错误的ー个通常的来源,而且它会给规则执行带来负面影响。对于检测WEB攻击的规则,你想限制ー些特殊的IP地址,那些带有很多数据包的,有助于进ー步减轻负荷。如果你看HS攻击,你会发现许多规则可能被组合起来形成更有效率的规则。举例来说,有几个对于iissamples和简单地址的攻击。这些全部都可能被组合通过简单的检验ー个简单的通过80接口的包。当任何一个下列请求被请求的时候,会发出提醒:/iissamples/exair/howitwork/Codebrws.asp/iissamples/exair/howitwork/Code.asp/iissamples/exair/howitwork/Codebrwl.asp/iissamples/sdk/asp/doc/codebrws.asp/iissamples/sdk/asp/doc/codebrw2.asp/iissamples/query,asp/iissamples/exair/search/advsearch,asp带着这ー观点我们再看,你可以让它简单的基于"samples/”匹配得到下列各项urls:/samples/search/queryhit.htm/adsamples/config/site.esc/scripts/samp1e/search/webhits.exe/msadc/sample/adctest.asp/scripts/sample/details.ide/scripts/sample/ctguestb.ide/msadc/sample/selector/showcode,asp/Sites/sample/knowledge/membership/inspired/ViewCode.asp

55/Sites/sample/knowledge/membership/Inspiredtutorial/ViewCode.asp/Sites/sample/knowledge/push/ViewCode.asp/Sites/samp1e/knowledge/search/ViewCode.asp这样,经过小心的计划,你能容易地将十八条规则变成一条单ー规则。确定地,你没有找到警告的尺度,但是如果某人正在找寻在你的WEB伺候器上的ー个文件,你能完全地知道他们正在找寻哪ー个文件吗?另外一个要被做出的决定是你应该包括哪些规则来防止被其他的WEB伺候器攻击,就像是NetscapeorApache〇ー些使用者对于ー个攻击如果不影响你的WEB伺候器,就没必要扫描并报警。举例来说,ー个人会选择不再使用cgi-bin规则,如果他们从来在他们的WEB伺候器就没有过cgi-bin规则。争论的另ー边是ー个闯入发现系统发现ー个尝试的攻击应该发出警告,不管它事实上能不能成功。如果你的策略只是要维持规则的完整,那么你只可能只是对于其他的伺候器类型做最通常的扫描检查,尤其不产生许多错误的警报。另ー方面,如果你发现你的系统有充足的能力剩余你可能想把所有你能丢的都丢进去。平衡点是要没有产生太多错误的警告而得到一个攻击前的警告。实现有效的规则完整的讨论是超过这ー个文章的范围。对于完全使用Snort规则的操作,可以去看编著Snort规则文档。结论经过小心地考虑过的规则和灵巧的规则策略,你能发现,大多数的IIS攻击在变成太严重之将被记录起来或被处理。你也能得到ー张在WEB位置发生事件的图片。你能捕捉到他们的踪迹,在他们以…个使用者身份造成大的事故之前,甚至较先进的攻击者也会触发警报。你将会得到各种网络弊端,不论来自外面或来自里面。所有的这些都从ー个被命名Snort的极小命令行工具里得到。参考资料:1.《VisualC++技术内幕第四版》[美]DavidJ.Kruglinski著潘爱国王国印译清华大学出版社2.《VisualC++6.0开发使用手册》[美]KateGregory著前导工作室译机械工业出版社3.《监听与隐藏——网络侦听揭密与数据保护技术》

56求是科技谭思亮著人民邮电出版社1.网上站点:http://netgroup-serv.polito.it/winpcaphttp://netgroup-serv.polito.it/windumphttp://winpcap.polito.it

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭