深度剖析WinPcap.docx_第1页
深度剖析WinPcap.docx_第2页
深度剖析WinPcap.docx_第3页
深度剖析WinPcap.docx_第4页
深度剖析WinPcap.docx_第5页
已阅读5页,还剩139页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深度剖析WinPcap之(序言)分析WinPcap源代码的缘由 2009-09-02 20:03:08标签:分析 源代码 WinPcap原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/918801/198054过去我一直在开发软件,包括Windows操作系统的应用软件,Linux操作系统的应用软件与驱动程序,也开发过一些嵌入式软件,并在后来的工作中逐渐专注于对软件的测试工作,主要从事软件测试技术与测试方法、软件工程的研究。 在此过程中与其他开发人员、测试人员一同工作,帮助他们构建达到工业级标准的软件,或者指导他们提高软件开发或测试的技术水平。随着不断的遇见问题、解决问题,我也在思考一个问题:那就是软件开发人员与软件测试人员除了对应用程序需要清晰的理解之外,是否还需要对支撑应用软件运行的操作系统,共享库等有深入的了解?下面通过我亲身经历的两个案例来考虑该问题:案例1:嗅探软件掉包问题某自行开发的网络数据包嗅探软件,在对被测试设备进行数据包分析时,发现有掉包现象,但待测设备运行正常。经过仔细分析,发现该嗅探软件设计有如下问题:针对高速网络流量,从软件架构上就没考虑到如何防止掉包的问题。软件开发人员对该嗅探软件进行各种优化,比如增加缓冲区的大小,降低显示的复杂度、分析代码性能瓶颈,但都改善不大。通过对所调用WinPcap库的仔细分析,获得下列解决方案:让WinPcap的内核驱动程序NPF实现协议过滤,而不是通过嗅探软件进行过滤,同时就在内核实现数据包的存储,而不导入应用层后进行存储。该案例提醒我们,在测试人员开发测试工具时,需要对所用的支撑软件有深入的了解,才能更好的解决所遇到的实际问题。内核层的过滤与转储功能是WinPcap的NPF驱动程序提供的优化功能,就是解决高速网络流量掉包问题的。案例2:AD数据采集系统掉点问题某AD数据采集系统,基于嵌入式Linux系统实现,对所采集的数据进行分析,出现掉点现象。经过仔细调试发现采样率还不到所要求一半时就开始出现掉点现象,采样率越高掉点现象越严重。项目组相关人员对Linux 驱动程序的机制了解不够深入,应用层软件开发人员对软件进行各种调优,收效甚微,曾一度怀疑是文件系统存储速度慢或硬件问题导致,项目陷入困境。后对AD驱动程序进行仔细分析,发现导致问题的原因:内核缓冲机制不对,采用双缓冲机制;内核向用户层提交数据耗时,直接从内核存储所采集的数据。该案例提醒我们,开发人员开发软件时,需要对底层系统软件有深入的了解,才能有效地实现高性能的软件。Linux驱动程序所采用的实现机制对用户层软件的性能影响非常大,针对不同的应用类型提供了多种不同的解决方案。从上述案例,我们知道问题的答案是肯定的,尤其对于从事软件系统架构设计与分析、软件故障问题定位与软件性能评测的高级开发人员与高级测试人员,这是一定要掌握的基础知识。在软件系统日益复杂的今天,浅尝辄止的学习是不可能在技术上有所成就的。但是,如何进行这种有效的、深入的学习?尤其是对于软件行业中的“菜鸟”而言。在Linux平台下,我们几乎可以查看任何源代码,所以从资源的角度来说这样的学习并不存在难度。但是在Windows平台下,资源首先就阻止了你的前进。笔者经过长时间的探索,发现通过对WinPcap开源库与Wireshark开源软件的源代码进行深入分析,可显著的加快学习的步伐。WinPcap 本身带有内核的协议驱动程序NPF、用户层的库packet.dll与wpcap.dll,常用的嗅探软件Wireshark在Windows平台下是基 于WinPcap库实现的。通过对WinPcap与Wireshark源代码的分析,至少可带来下列收获:1) 知其然,还要知其所以然2) 通过对内核层与用户层的了解,可获得全面的系统概念3) 获得一个很好的学习途径。可以在任何条件下借鉴、学习与分享别人的经验,在今后的职业生涯中更游刃有余4) 通过对这些源代码的分析,可以对内核层与用户层的交互具有更深入的了解5) 对内核协议驱动程序具有更深入了解6) 对软件的架构具有更深入的体会,本系列文章主要用来剖析WinPcap 内核层驱动程序NPF的源代码与分析相关的理论基础,并对用户层packet.dll与wpcap.dll库源代码进行分析。主要涵盖了我认为对提高读者 能力最为重要的一些内容,力图使读者通过阅读能够对WinPcap的NPF获得深入的理解,在理解的基础上学到内核层与用户层如何交互、NDIS协议驱动 的编写、相关软件体系架构的设计与实现,当然对WinPcap的使用可达到炉火纯青的程度啦,从而使读者今后遇见类似问题时具有较清晰地解决思路,使技术水平更上一层楼。在这里我不仅会尽力把WinPcap 的源代码分析清楚,同时还会把源代码之外的一些相关知识尽量解释清楚。因为我相信,知道“这样做”是很容易的事情,理解“怎样做”是困难的,但知道“什么时候这样做”与“为什么这样做”那就是专家必须面对的极度困难的问题了。除了把“这样做”弄清楚外,我还会尽力解决后面几个困难的问题。如果你不仅仅是只想做一些应付差事的简单的“玩具”软件,而是对软件的性能与架构有着精益求精的追求,同时不希望在遇到软件“莫名其妙”故障时不致于茫然失措,最后以一句“鬼知道怎么回事”打发别人。那么我建议你仔细阅读这一系列文章,这儿并没有“包治百病”的灵丹妙药,但是如果你对操作系统从内核层到 用户层的交互有一个清晰的认识,能够对支撑应用软件运行的基石有一个深入的了解,问题还能阻挡你吗?如果你的工作与开发网络软件相关,无论你是开发人员还是测试人员,强烈建议你阅读。这儿可以看到WinPcap开发人员许多“真枪实弹”的搏斗,以争取性能的每一寸土地。了解这些背后的秘密,软件丢包时,你不会再那么无助,数据包发送不出去时,你不再那么孤单。其实我的本意是指只要是软件开发人员与测试人员,都应该从这儿有所收获,当然我写blog的目的主要是针对软件行业的初、中级人员,所以就不浪费真正的“寂寞高手”的宝贵时间了。为了更好的学习本书的内容,要求读者:1) 熟悉C语言。不要求你能编写很棒的C代码,但是对C语言的熟悉会很有帮助。2) 有一些网络的基本知识。不要求你熟悉网络的各方面,但是对集线器、UDP这些术语有一定的感性认识是会很有帮助的。本文出自 “千江月” 博客,请务必保留此出处/918801/1980541. 深度剖析WinPcap之(一)WinPcap简介 2009-08-29 15:08:33标签:WinPcap 网络嗅探原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/918801/196909WinPcap简介WinPcap是Windows平台下访问网络数据链路层的开源库,该库已达到工业标准的应用要求。WinPcap允许应用程序绕开网络协议栈来捕获与传递网络数据包,并具有额外的有用特性,包括内核层的数据包过滤、一个网络统计引擎与支持远程数据包捕获。1.1. 什么是WinPcap大多数网络应用程序通过被广泛使用的操作系统原语来访问网络,诸如sockets。操作系统已经处理了底层的细节问题(如协议处理,数据包的封装等),并提供与读写文件类似的、熟悉的接口,这使得用该方法可以很容易的访问网络中的数据。 然而有些时候,这种“简单的方式”并不能满足任务要求,因为有些应用程序需要直接访问网络中的数据包。也就是说,应用程序需要访问网络中的“原始”数据包,即没有被操作系统使用网络协议进行处理过的数据包。WinPcap的目的就是为Win32应用程序提供这种访问方式。WinPcap提供下列功能: 捕获原始数据包,无论是发送到运行WinPcap机器上的数据包,还是在其它主机(共享介质)上进行交换的数据包 在数据包分派给应用程序前,根据用户指定的规则过滤数据包 将原始数据包发送到网络 收集网络流量的统计信息1.2. WinPcap的优点自由 WinPcap遵循BSD open source licence发布。这意味着你的应用程序拥有全部自由来修改与使用它,即使应用程序是商业化的。高性能 WinPcap实现了有关数据包捕获文献中描述的所有典型的优化方法(比如内核级的过滤与缓冲,减少上下文交换,数据包部分内容复制),加上一些原创的优化方法,如JIT过滤器编辑(JIT filter compilation)与内核级的统计过程。因为这些原因,WinPcap胜过其它可比的方法。普及 WinPcap被许多工具作为网络接口使用无论是自由软件还是商业软件。包括网络协议分析器、网络监视器、网络入侵检测系统、网络嗅探器、网络流量生成器、网络测试器等等。如Wireshark、Nmap、 Snort、WinDump、ntop这些工具,在网络社群中是众所周知的。WinPcap每天被下载上千次。 测试充分与可信赖 许多用户对WinPcap在广泛的平台上的测试与发现最难以发现的缺陷做出了经年的贡献。WinPcap的开发者是富有经验的Windows驱动程序编写者,同时他们软件开发方法的重点就是强调固若顽石(rock-solid)的稳定性。记住:一个多缺陷的驱动程序意味着蓝屏(Windows操作系统在崩溃后,屏蔽该系统所有处理器的所有中断后,将显示器切换到低分辨率的VGA图形模式下,绘制一个蓝色背景,然后显示停止码,后面紧跟着一些文本信息来建议用户应该怎么办的画面)。最终用户易于使用 WinPcap作为单个小的可执行文件发布,可运行在每个所支持的操作系统上。开始使用这个可执行文件后,Windows就能捕获与发送原始数据包。不可能再有更简单的操作了。程序员易于使用 每个版本的WinPcap带有一个开发者包(developers pack),包括文档、库与include文件,是你立即开发应用程序所必需的。开发者包还包含一个示例程序集,可用Visual Studio或Cygnus编译,用来作为一个极好的起点。多平台 WinPcap在Windows NT、Windows 2000、Windows XP与Windows Server 2003平台上被积极地维护。WinPcap也能工作在Windows 95、Windows 98 与Windows ME平台上,但在这些操作系统上将不再维护。对Windows Vista具有初步的支持,但有一些特性并不具备。可移植 WinPcap与libpcap具有完全的兼容性。这意味着能够使用它移植已在Unix或Linux下存在的工具到Windows下。这也意味着Windows应用程序可以很容易的移植到Unix下使用。 良好的文档 WinPcap手册用一种容易理解的超文本链接方式描述,对API与内部进行了文档化。该文档包含一个指南,让你一步一步地熟悉WinPcap的所有特性。 商业化支持 如果你对专业的WinPcap支持感兴趣、或当一些事情出错时你需要一个电话号码寻求帮助,或者在开发底层网络代码时需要帮助,CACE Technologies(/support)可以帮助你。1.3. 哪类程序使用了WinPcapWinPcap可被许多类型的网络工具使用,比如具有分析,解决纷争,安全和监视功能的工具。特别地,一些基于WinPcap的典型工具如下所示: 网络与协议分析器 (network and protocol analyzers) 网络监视器 (network monitors) 网络流量记录器 (traffic loggers) 网络流量生成器 (traffic generators) 用户层网桥及路由 (user-level bridges and routers) 网络入侵检测系统 (network intrusion detection systems (NIDS) 网络扫描器 (network scanners) 网络安全工具 (security tools) 1.4. 什么是WinPcap不能做的WinPcap独立于诸如TCP-IP协议的主机协议来发送和接收网络数据包。这意味着WinPcap不能阻塞、过滤或操纵同一机器上其它应用程序的通信。它只是简单地嗅探网络上所传输的数据包,因此WinPcap不能提供诸如网络流量控制、服务质量调度和个人防火墙之类的功能支持。 本文出自 “千江月” 博客,请务必保留此出处/918801/1969092. WinPcap所涉及的Windows驱动基础知识(1) 2009-08-29 15:13:06标签:网络嗅探原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/918801/196911WinPcap所涉及的Windows驱动基础知识1.1 Windows驱动的基础知识本节主要描述在WinPcap的NPF中经常使用一些编写Windows驱动程序所需掌握的部分基础知识,以便于后面的理解。1.1.1 驱动对象(DRIVER_OBJECT)每个驱动程序都有唯一的驱动对象与之对应,该驱动对象在驱动程序被加载时由内核的对象管理程序所创建。驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动程序的一个实例被内核加载,对一个驱动程序内核I/O管理器只加载一个实例。驱动对象数据结构在wdm.h文件中的定义如下。typedef struct _DRIVER_OBJECT CSHORT Type;CSHORT Size;/* *DeviceObject为每个驱动程序所创建的一个或多个设备对象链表,*Flags提供一个扩展的标识定位驱动对象*/PDEVICE_OBJECT DeviceObject;ULONG Flags;/*下列各成员字段描述驱动程序从哪儿被加载*/PVOID DriverStart;ULONG DriverSize;PVOID DriverSection;PDRIVER_EXTENSION DriverExtension;/*DriverName成员被错误日志线程用来*确定一个I/O请求越界的驱动名称*/UNICODE_STRING DriverName;/*指向注册表中硬件信息的路径*/PUNICODE_STRING HardwareDatabase;/*如果驱动支持“fast I/O”,*就指向一个“fast I/O”的派遣函数数组*/PFAST_IO_DISPATCH FastIoDispatch;/*描述该特定驱动的入口点。*主函数(major function)派遣函数表必须是对象最后的成员,*因此它仍然是可扩展的*/PDRIVER_INITIALIZE DriverInit;PDRIVER_STARTIO DriverStartIo;PDRIVER_UNLOAD DriverUnload;PDRIVER_DISPATCH MajorFunctionIRP_MJ_MAXIMUM_FUNCTION + 1; DRIVER_OBJECT;typedef struct_DRIVER_OBJECT *PDRIVER_OBJECT;下面分别描述驱动对象中驱动程序可访问的成员。PDEVICE_OBJECT DeviceObject 每个驱动对象会有一个或多个设备对象。每个设备对象都有一个指针(NextDevice)指向下一个驱动对象,最后一个设备对象指向空。此处的DeviceObject指向驱动对象的第一个设备对象。该成员在成功调用IoCreateDevice后自动更新。一个驱动程序使用该程成员与设备对象(DEVICE_OBJECT)的NextDevice可遍历给驱动对象的所有设备对象。在驱动被卸载的时候,需要遍历每个设备对象,并将其删除。PUNICODE_STRING HardwareDatabase 指向注册表中硬件配置信息的路径,用UNICODE字符串表示。该字符串一般为REGISTRYMACHINEHARDWAREDESCRIPTIONSYSTEM。PFAST_IO_DISPATCH FastIoDispatch 指向一个定义驱动快速 I/O结构体的入口点,该成员只用于文件系统驱动与网络传输驱动。PDRIVER_INITIALIZE DriverInit 是DriverEntry例程的入口点,由I/O管理器设置。PDRIVER_STARTIO DriverStartIo 是Startl0例程的的入口点,如果需要,由DriverEntry例程设置,否则为NULL。PDRIVER_UNLOAD DriverUnload 指向驱动卸载时所用回调函数的入口点。PDRIVER_DISPATCH MajorFunctionIRP_MJ_MAXIMUM_FUNCTION+1 一个函数指针数组, 数组MajorFunction中的每个成员保存着一个指针,每一个指针指向一个处理对应IRP(IRP_MJ_XXX)的派遣函数(DispatchXxx)。每个派遣函数(DispatchXxx)声明如下: NTSTATUS(*PDRIVER_DISPATCH) ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );1.1.2 设备对象(DEVICE_OBJECT)设备对象保存设备特征和状态的信息。一个设备对象表示一个逻辑的、虚拟的或物理的设备,由一个驱动对象操控设备对象的I/O请求。每一个内核模式的驱动必须创建设备对象,通过调用IoCreateDevice一次或多次。每个驱动程序会创建一个或多个设备对象,用DEVICE_OBJECT数据结构表示。每个设备对象有一个指针(NextDevice)指向下一个设备对象,从而形成一个设备链表。设备链表第一个设备是由驱动对象结构体中DeviceObject指明的。设备对象数据结构在wdm.h文件中的定义如下。typedef structDECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT CSHORT Type;USHORT Size;LONG ReferenceCount;struct _DRIVER_OBJECT *DriverObject;struct _DEVICE_OBJECT *NextDevice;struct_DEVICE_OBJECT *AttachedDevice;struct _IRP *CurrentIrp;PIO_TIMER Timer;ULONG Flags; ULONG Characteristics; _volatile PVPB Vpb;PVOID DeviceExtension;DEVICE_TYPE DeviceType;CCHAR StackSize;union LIST_ENTRY ListEntry;WAIT_CONTEXT_BLOCK Wcb; Queue;ULONG AlignmentRequirement;KDEVICE_QUEUE DeviceQueue;KDPC Dpc;/*下列成员是为支持文件系统的互斥操作,*为了对文件系统处理线程使用设备的计数保持跟踪*/ULONG ActiveThreadCount;PSECURITY_DESCRIPTOR SecurityDescriptor;KEVENT DeviceLock;USHORT SectorSize;USHORT Spare1;struct _DEVOBJ_EXTENSION *DeviceObjectExtension;PVOID Reserved; DEVICE_OBJECT;typedef struct_DEVICE_OBJECT *PDEVICE_OBJECT;下面分别描述设备对象中驱动程序可访问的成员。PDRIVER_OBJECT DriverObject 指向驱动程序中的驱动对象。同属于一个驱动程序的驱动对象指向的是同一个驱动对象。 PDEVICE_OBJECT NextDevice 指向下一个设备对象。这里的下一个设备对象是同一个驱动程序创建的若干设备对象。每个设备对象根据NextDevice域形成链表,从而可以遍历每个设备对象。在每次成功调用IoCreateDevice 后I/O管理器更新该链表。在驱动被卸载的时候,需要遍历该链表,删除每个设备对象。PIRP CurrentIrp 如果驱动使用Startl0例程时,此成员指向当前IRP结构。否则为NULL。 ULONG Flags 此成员是一个32位昀无符号整型,每个位有不同的含义。通过位或操作为新创建的设备对象设置不同的特性。ULONG Characteristics 当驱动程序调用IoCreateDevice时,设置下列一个合适的值:FILE_REMOVABLE_MEDIA FILE_READ_ONLY_DEVICE FILE_FLOPPY_DISKETTE FILE_WRITE_ONCE_MEDIA FILE_DEVICE_SECURE_OPENPVOID DeviceExtension 指向设备扩展对象。设备扩展对象是由程序员在驱动中自行定义的结构体,结构体的大小在调用IoCreateDevice时设置。每个设备都会指定一个设备扩展对象,设备扩展对象记录的是特别定义的结构体。在驱动程序中应该尽量避免全局变量的使用,因为全局变量涉及不容易同步的问题,解决的办法可将全局变量存储在设备扩展中。DEVICE_TYPE DeviceType 指明设备的类型,由IoCreateDevice设置。根据设备需要填写相应的设备类型。. CCHAR StackSize 在多层驱动的情况下,驱动与驱动之间形成类似堆栈的结构。IRP会依次从最高层传递到最底层。StackSize就是指定发送到该驱动的IRP在堆栈位置的最小层数。IoCreateDevice在一个新创建的设备对象中设置该成员。ULONG AlignmentRequirement 设备在大容量传输的时候,为了保证传输速度需要内存对齐。每个设备对象在它新创建的设备对象中设置该成员。 1.1.3 设备扩展(_DEVICE_EXTENSION)设备对象记录设备的“通用”信息,而另外一些“特殊”信息记录在设备扩展中。设备扩展由程序员自行定义,指定内容与大小,由I/O管理器创建,保存在非分页内存中。在驱动程序中,尽量避免使用全局函数,因为全局函数往往导致函数的不可重入性。一个解决办法就是将全局变量以设备扩展的形式存储,并加以适当的同步保护措施。WinPcap中NPF的设备扩展结构体,主要用于存储每个被NPF绑定的适配器的一些信息,结构体定义如下:typedef struct_DEVICE_EXTENSION /适配器名称NDIS_STRING AdapterName;/设备导出的名称,也就是通过WinPcap应用程序使用该名称来打开该适配器PWSTR ExportString; DEVICE_EXTENSION, *PDEVICE_EXTENSION;1.1.4 IRP与派遣函数驱动程序的主要功能是负责处理l/O请求,大部分1/0请求是在派遣函数中处理的。IRP的处理机制类似Windows应用程序中的“消息处理”机制。用户空间对驱动程序的所有1/0请求,全部由操作系统转化为一个IRP数据结构,不同的IRP数据会被“派遣”到不同的派遣函数中,在派遣函数中处理IRP。 IRP是Windows内核中输入输出请求包(I/O Request Package,IRP)的缩写。IRP具有两个基本属性:MajorFunction与MinorFunction,分别记录IRP的主功能和子功能。操作系统根据MajorFunction将IRP“派遣”到不同的派遣函数中,在派遣函数中还可以根据MinorFunction继续判断该IRP属于哪种子功能。一般来说驱动程序都是在DriverEntry函数中注册派遣函数的。在DriverEntry的驱动对象pDriverObject中,有个函数指针数组MajorFunction,每个数组元素都记录着一个派遣函数的地址。通过设置该数组,可以将不同类型的IRP和对应的派遣函数关联起来。大部分的IRP都源于文件I/O处理的API,如CreateFile、ReadFile、WriteFile、CloseHandle等函数会使操作系统产生IRP_MJ_CREATE、IRP_MJ_READ、IRP_ MJ_WRITE、IRP_MJ_CLOSE等不同类型的IRP,这些IRP会被传送到驱动程序中,调用对应的派遣函数。此外,内核中的文件I/O处理函数,如ZwCreateFile、ZwReadFile、ZwWriteFile、ZwClose也同样会创建IRP_MJ_CREATE、IRP_MJ_READ、lRP_MJ_WRITE、IRP_MJ_CLOSE等IRP,并将lRP传送到驱动程序中,调用对应的派遣函数。 处理IRP最简单的方法就是在相应的派遣函数中,将IRP的状态设置为成功,然后结束IRP的请求,并让派遣函数返回成功。结束IRP的请求使用函数IoCompleteRequest。下面为NPF中NPF_Close的代码,为处理IRP_MJ_CLOSE类型IRP的派遣函数。NTSTATUS NPF_Close(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)Irp-IoStatus.Status = STATUS_SUCCESS;Irp-IoStatus.Information = 0;IoCompleteRequest(Irp, IO_NO_INCREMENT);return STATUS_SUCCESS;函数NPF_Close设置IRP的完成状态为STATUS_SUCCESS。这样发起请求的 API(如CloseHandle)将会返回TRUE。相反,如果将IRP的完成状态设置为不成功,发起I/O请求的 API(如CloseHandle)将会返回FALSE。出现该情况时,可以使用GetLastError API获得错误代码。所得的错误代码会和IRP设置的状态一致。除了设置IRP的完成状态,函数还要设置这个IRP请求操作了多少字节。在本代码中,将操作字节数设置成了0。如果是ReadFile产生的IRP,这个字节数代表从设备读了多少字节。如果是WriteFile产生的IRP,这个字节数代表对设备写了多少字节。最后函数通过IoCompleteR0quest函数将IRP请求结束。IoCompleteRequest的声明如下:VOID IoCompleteRequest(IN PIRP Irp,IN CCHAR PriorityBoost);参数Irp代表需要被结束的IRP。参数PriorityBoost代表线程恢复时的优先级别,指的是被阻塞的线程以何种优先级恢复运行。一般情况下,优先级设置为IO_NO_INCREMENT。本文出自 “千江月” 博客,请务必保留此出处/918801/1969113. 深度剖析WinPcap之(二)网络分析与嗅探的基础知识(1) 2009-09-10 19:06:58标签:基础知识 WinPcap 网络分析 嗅探原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/918801/200736工欲善其事,必先利其器。为了有利于深入了解WinPcap的内部机制,我们需要对网络分析与嗅探、网络模型与硬件基础作必要了解。1.1 什么是网络分析与嗅探 网络分析(Network analysis) (也称为网络流量分析、协议分析、嗅探、数据包分析、窃听,等等)就是通过捕获网络流量并深入检查,来决定网络中发生了什么情况的过程。一个网络分析器对通用协议的数据包进行解码,并以可读的格式显示网络流量的内容。嗅探器(sniffer)是一种监视网络上所传输数据的程序。未经授权的嗅探器对网络安全构成威胁,因为它们很难被发现并且可在任何地方被插入,这使得它们成为黑客最喜欢使用的一种工具。网络分析器之间的差别,在于诸如支持能解码的协议数量、用户接口、图形化与统计能力等主要特性的不同。其它的差别还包括了推理能力(比如,专家分析特性)与数据包解码的质量。尽管几个不同的网络分析器针对同一个协议进行解码,但在实际环境中可能其中的一些会比另外一些工作得更好。图2-1为Wireshark网络分析器的显示窗口。一个典型的网络分析器用三个窗格显示所捕获的网络流量:图2-1 Wireshark网络分析器的显示窗口概要 该窗格对所捕获的内容显示一行概要。包含日期、时间、源地址、目标地址、与最高层协议的名字与信息字段。详情 该窗格提供所捕获数据包所包含的每层细节信息(采用树形结构)。数据 该窗格用十六进制与文本格式显示原始的被捕获数据。一个网络分析器是由硬件与软件共同组成。可以是一个带有特定软件的单独硬件设备,或者是安装在台式电脑或膝上电脑之上的一个软件。尽管每种产品之间具有差别,但都是由下列五个基本部分组成。硬件 多数网络分析器是基于软件的,并工作于标准的操作系统与网卡之上。然而,一些硬件网络分析器提供额外的功能,诸如分析硬件故障(比如循环冗余纠错(CRC)错误、电压问题、网线问题、抖动、逾限(jabber)、协商错误等等)。一些网络分析器仅支持以太网或无线网适配器,而其它的可支持多重适配器,并允许用户定制它们的配置。依据实际情况,可能也需要一个集线器或一个网线探针(cable tap)连接已有的网线。捕获驱动器 这是网络分析器中负责从网线上捕获原始网络流量的部分。它滤出了所需保持的流量,并把所捕的获数据保存在一个缓冲区中。这是网络分析器的核心没有它就无法捕获数据。缓冲区 该组件存储所捕获的数据。数据能够被存入一个缓冲区中只到该缓冲区被填满为止,或者采用循环缓冲的方式,那么最新的数据将会替换最旧的数据。采用磁盘或内存均可实现缓冲区。实时分析 当数据一离开网线,该特性就可对数据执行分析。一些网络分析器利用该特性发现网络性能问题、同时网络入侵检测系统利用它寻找入侵活动。解码(器) 该组件显示网络流量的内容(带有描述),所以是可读的 。解码是特定于每个协议的,因此网络分析器当前支持可解码的协议数目是变化的,网络分析器可能经常加入新的解码。本文出自 “千江月” 博客,请务必保留此出处/918801/2007364. 深度剖析WinPcap之(二)网络分析与嗅探的基础知识(2) 2009-09-06 20:20:56标签:基础 WinPcap 网络分析 深度 mdash1.2 谁需要使用网络分析? 系统管理员、网络工程师、安全工程师、系统操作员、与程序员都需要使用网络分析器,其对诊断与解决网络问题、系统配置问题、与应用程序的难点(或瓶颈)都是无价的工具。在历史上,网络分析器曾经专注于昂贵与难于使用的硬件设备。然而,新出现的先进技术允许基于软件进行网络分析器开发,其为有效解决网络问题提供了一种更为方便与廉价的工具,它也具备网络分析的能力。网络分析的技术是一个双刃剑。当网络、系统、与安全的专业人员使用它处理网络故障与监视网络时,入侵者为了非法的目的正在使用网络分析器。网络分析器是一种工具,就像所有的工具一样,它可被用在好的与坏的目的之上。网络分析器的用途为: 将在数据包中的二进值数据转换成易读的格式 处理网络故障 分析网络性能以发现瓶颈 网络入侵检测 为了辩护与证据记录网络流量 分析应用程序的操作 发现有问题的网卡 发现病毒爆发的源头或拒绝服务(DoS)的攻击 发现间谍软体 在开发阶段对网络编程进行调试 发现一部泄密的计算机 确认符合公司的政策 学习协议时作为学习的资源 Reverse-engineering protocols to write clients and supporting programs(逆向工程协议去写客户与支持计划)1.2.1 入侵者如何使用嗅探器? 当被心怀恶意的人使用时,嗅探器能对网络安全构成重要威胁。网络入侵者使用嗅探的方式获取秘密的信息,嗅探和窃听在该应用中通常是相互关联的。然而,嗅探正成为一个非负面的术语;大多数人互换地使用嗅探和网络分析这两个术语。以非法方式使用一个嗅探器被视为一个被动的攻击,因为它不直接与网络上任何其它系统相互作用或连接。一个嗅探器也能被安装在网络的一台计算机上,并作为一个主动攻击的泄密部分。嗅探器的被动特性使得很难被检测(用的检测方法稍后详细说明)。入侵者在网络上使用嗅探器做下列事情: 取得明文的用户名和密码 发现一个网络上用户的使用模式(usage patterns) 泄密私有信息 捕获与回放VoIP电话通话 映射网络的部署 被动的操作系统指纹识别(Passive OS fingerprinting)上述都是嗅探器的非法使用,除非你是一个渗透测试人员,找出并报告这些类型的弱点就是你的工作。为了嗅探,一个入侵者首先得获取所感兴趣系统的通信网线的访问权,这意谓着要在同一共享网段上或在通信路径之间的网线某处接入探针。如果侵入者不是与目标系统或通信访问点(AP)物理接触,仍然有方法嗅探网络流量,包括: 闯入一部目标计算机而且安装远程嗅探器 闯入一个通信访问点(举例来说,一个因特网服务提供着ISP) 并安装嗅探软件。 在已经装入嗅探软件的ISP上定位一个系统 使用社会的工程学(social engineering)得到一个ISP的物理访问,安装一个数据包嗅探器 在目标计算机组织或ISP内部有一个同谋者,并在那儿安装嗅探器。 重定向或复制通信(Redirecting or copying communications),使路径包含入侵者的计算机嗅探程序大多数都包含了rootkits工具,该工具安装在泄密系统中是极具代表性的。Rootkits通过替换命令和使用、并清除日志条目,被用来掩盖入侵者的踪迹。入侵者也安装其它的程序,像嗅探器,键盘记录器和后门软件。Windows嗅探可作为远程操控特洛伊(RAT)的一部分被实现,诸如SubSeven 或Back Orifice。入侵者通常使用嗅探程序,并把嗅探程序配置成能检测特定事情(如密码)的状态, 然后把所嗅探的事情发送给入侵者(或者储存它们,由入侵者稍后取回)。易受该类活动攻击的协议包括Telnet、文件传送协议(FTP)、第3版邮局协议 (POP3) 、网际报文存取协议 (IMAP)、简单邮件传输协议(SMTP)、 超文本传输协议 (HTTP)、远程登录 (rlogin)和简单网络管理协议(SNMP)。rootkit 的一个例子是在 Solaris 和 Linux 上工作的“T0rnKit”,和rootkit 包含在一起的嗅探器叫做“t0rns”,并被安装在隐藏目录/usr/srec/.puta中。rootkit的另一个例子是 Linux Rootkit 5(Lrk5)和linsniff嗅探器一起安装。入侵者也可以使用嗅探程序控制后门(这一个实践不是相当“常见的” ,但并不是没听说过)。一个方法是将在一个监听特定信息的嗅探器安装在目标系统上,然后发送后门控制信息到一个邻近的系统。因为嗅探器固有的被动特性,该类型的后门控制很难被发现。 cd00r就是一个后门嗅探的例子,并在非混杂模态中操作,它很难被检测到。1.2.2 被嗅探的数据看起来像什么? 最容易领会嗅探器概念的方法就是在实际应用中看一看具体实例。图2-2演示了从一台电脑连接到一个 Linux系统请求FTP服务器服务,并通过Wireshark嗅探传输的数据包。第一、二个数据包显示了采用数据包嗅探器,获得用户名与密码是多么容易的事情(也就是,从数据包直接可知用户名为lxf和密码为lxf)。图2-2 嗅探一个连接1.2.3 常见的网络分析器 具有大量各种各样的嗅探器软件可用,下面列出一些最优异的: Wireshark Wireshark 是可得到的最好的嗅探器之一,并被作为一个自由的、商业化质量的嗅探器开发。它有很多的特征,如好的图形用户界面(GUI)、解码超过 400个协议、并被积极地开发与维护。它可在UNIX、Mac OS X与 Windows系统上运行。在产品环境中使用这是一个伟大的嗅探者,可从获取。 WinDump WinDump 是Windows版本的tcpdump,从 /windump可获取。它使用 WinPcap库,并可运行在Windows 95、Windows 98、Windows ME、Windows NT、Windows 2000与WindowsXP上。 Network General Sniffer Network General Sniffer是一个最流行的商业嗅探器。现在有一个企业网络捕获工具套件,在 上有一整个嗅探器产品线。 Windows 2000 and 2003 Server Network Monitor Windows 2000 Server与 Windows 2003 Server都有一个内建程序来执行网络分析。该程序在“Administrative Tools”文件夹中,但不是缺省安装的,因此需要从安装盘中添加安装。 EtherPeek EtherPeek是一个WildPackets开发的商业化网络分析器。Windows与Mac下的版本,以及其它的网络分析器从 上可以获得。 Tcpdump Tcpdump是最古老的与最常用的网络嗅探器,由Information and Computing Sciences Division (ICSD) at Lawrence Berkeley National Laboratory (LBNL)的Network Research Group (NRG)开发。它基于命令行模式运行在UNIX与类UNIX系统上,包括Mac OS X。通过来进行开发与维护。 Snoop Snoop是一个基于命令行模式运行的网络嗅探器,被包含在Sun Solaris操作系统中。 Snort Snort是一个网络IDS(入侵检测系统),可用作网络嗅探 ,在网站上积极的开发与维护。参见Nessus, Snort, & Ethereal Power Tools: Customizing Open Source Security Applications (Syngress Publishing: 1597490202) 与 Snort Intrusion Detection and Prevention Toolkit (Syngress, ISBN: 1597490997)获得更多的信息。 Dsniff Dsniff 是一个非常流行的网络嗅探软件包。它是一个用来嗅探感兴趣的数据(如密码) 与使嗅探过程更便利(如规避交换机)的程序集。它在/dugsong/dsniff网站上被积极的维护。 Ettercap Ettercap 被特别地设计用来嗅探一个交换网络。它内建的特征,诸如密码收集,操作系统”指纹”识别(OS fingerprinting),和字符注入。可在Linux、Windows和 Solaris平台上运行。它在网站上被积极地被维护。 Analyzer Analyzer是Windows操作系统下使用的一个自由的嗅探器。它被WinPcap 和 WinDump 的制造者在Politecnico di Torino积极地开发,并能从analyzer.polito.it下载。 Packetyzer Packetyzer 是一个自由的嗅探器 (在Windows操作系统下使用),使用Wireshark的核心逻辑。它倾向于在Wireshark 释放版本后一两个版本发布。它被Network Chemistry在/products/packetyzer.php网站上积极地维护。 MacSniffer MacSniffer专门为 Mac OS X操作系统设计。它为tcpdump的一个前端软件被构建。该软件是共享软件而且能从personalpag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论