SharpPcap-中文开发全攻略_第1页
SharpPcap-中文开发全攻略_第2页
SharpPcap-中文开发全攻略_第3页
SharpPcap-中文开发全攻略_第4页
SharpPcap-中文开发全攻略_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

简介包捕获(或数据包嗅探)是收集数据,通过特定的网络接口将所有数据包的过程。在我们的应用程序捕获网络数据包是一个强大的能力,它可以让我们写网络监控,数据包分析器和安全工具。本的libpcap库和基于UNIX系统WinPcap的用于Windows是最广泛使用的数据包捕获驱动程序监视API提供低级别的网络。其中应用程序使用的libpcap/WinPcap的包捕获子系统为是著名的tcpdump的和Wireshark的。在这篇文章中,我们将介绍SharpPcapWinPcap的从您的。NET应用程序。)NET程序集(库接口与libpcap的或并会给你一个详细的方案编制教程教你如何使用。背景塔米尔加尔在2004年左右开始的SharpPcap项目。他想用在。NET应用WinPcap而在他的大学最后项目的工作。该项目涉及VoIP流量分析和解码,他想继续用C#编码具有省时,如垃圾收集功能简单。WinPcap的API的访问似乎从净是相当流行的要求,他发现在CodeProject上的一些网站,让您做到这一点有益的项目。:数据包捕获和分析仪原始套接字捕获使用C#与WinPcap的包嗅探功能移植到。NET库第一个项目是一个伟大的空灵。NET的克隆,让您获取和分析大量的数据包的协议类型。然而,随着这个项目的几个问题使它几乎不可能得到在其他。NET应用程序共享。首先,作者没有提供用于捕获,可以通过其他。NET应用程序中使用任何通用的API包。他没有单独的UI代码和他的分析和捕获的代码,使他的捕捉代码类依赖于图形用户界面,如ListView操作。其次,由于某些原因,笔者选择了重新实现在C#由他本人,而不是仅仅WinPcap的包装他们的部分职能。这意味着他的应用程序无法利用新的WinPcap的版本的硬编码的优势,因为他在他的WinPcap的应用程序的某些版本。第二个和第三个物品的包装项目为WinPcap的好开始,但他们没有提供一些重要的WinPcap的功能,如离线pcap的文件处理和应用内核级数据包过滤器,以及最重要的是他们提供了这样的分析没有协议分析器类包。这两个项目没有张贴的文章,以自己的库的源代码,让其他人一起延长他们的工作和增加新功能和新的数据包分析器类。因此,塔米尔决定开始他对自己的图书馆工作。在1.x系列的几个版本发布。发展放缓对2007年年中时,在1.x系列的最后一个版本发布时,SharpPcap1.6.2。克里斯摩根发生在2008年11月超过SharpPcap发展。从那时起SharpPcap主要内部已重写和API改进。2010年2月下旬,SharpPcap3.0被释放。此版本是一个重写SharpPcap的数据包分析器。分组分析功能被打破,进入一个新的图书馆,Packet.Net。SharpPcap注意到与libpcap的/WinPcap的包和Packet.Net注意到接口解剖和创造护理照顾。对Packet.Net的建筑的细节将在本教程的后面讨论。SharpPcapv3.5版本发布了2月1日,2011年。3.5版本包含重大的空气污染指数的变化以及WinPcap的远程采集和支持AirPcap。关于SharpPcap的目的SharpPcap是提供一个框架NET应用程序捕获,注资。和分析网络数据包。SharpPcap是公开和积极发展同它的源代码和文件发布在SourceForge托管。源代码补丁,以改善或解决问题欢迎通过sharppcap开发者邮件列表。错误报告,功能要求和其他查询正在积极回答问题的论坛和跟踪支持,所以如果你有任何问题请与库随时问。SharpPcap是一个完全跨平台的库管理。同一程序集运行在微软的。NET以及单在32位和64位平台。下面的列表说明了目前SharpPcap功能支持:单一组件的Microsoft。NET和Mono平台上的Windows(32位或64位)和Linux(32或64位)和Mac。高性能-SharpPcap可以捕捉足够快跟上>的3MB/s的传输速率高达SCP的WinPcap的扩展部分支持:设置内核缓冲区大小注射用的数据包发送队列。收集在一个特定的网络接口的网络统计AirPcap支持枚举和显示有关Windows机器上的物理网络接口的细节。捕获低级别的网络数据包将通过给定的接口。分析和解析以下协议:\l"QueuingPacketsForBackgroundProcessing"后台处理数据包队列-高封包捕获率获取设备列表(例如,在源码包1)通常,第一个事,一个SharpPcap为基础的应用程序是得到一个连接的网络适配器的列表。SharpPcap提供了一个类,CaptureDeviceList用于这一目的。这个类是一个单实例,持有型缓存网络适配器列表ICaptureDevice。特别是,Name和Description属性包含人类可读的名称和描述,分别对相应的设备。下面的C#示例显示了如何检索适配器列表和打印在屏幕上,印刷错误,如果没有适配器发现:Collapse|CopyCode//打印SharpPcap版本字符串版本=SharpPcap.Version.VersionString;Console.WriteLine(“{0}SharpPcap,Example1.IfList.cs”,版本);//检索设备列表CaptureDeviceList设备=CaptureDeviceList.Instance;//如果没有设备被发现打印错误如果(devices.Count“1){Console.WriteLine(“设备不被发现本机”);返回;}Console.WriteLine(“\n以下是机器设备可以用这样的:”);Console.WriteLine(“----------------------------------------------------\ñ“);//打印出可用的网络设备的foreach(ICaptureDevicedev的设备中)Console.WriteLine(“{0}\N”的,dev.ToString());Console.Write(“点击'输入'退出...”);Console.ReadLine();上述应用程序的输出会是这样的:Collapse|CopyCodeç:\sharppcap\实例\Example1.IfList\bin\目录调试“>Example1.IfList.exeSharpPcap,Example1.IfList.cs以下是这台机器上的设备可供选择:---------------------------------------------------接口:名称:\Device\NPF_{D8B7C9B2-D53D-45DA-ACF0-2E2116F97314}的FriendlyName:局域网连接2描述:英特尔(R)PRO/1000MT台式机适配器地址:地址:为fe80::b444:92d8:c882:8227网络掩码:Broadaddr:地址:地址:5网络掩码:Broadaddr:55地址:地址:硬件地址:0800276AC792标志:0按'Enter'键退出...打开一个适配器和捕获数据包(例如,在源码包3)现在,我们已经看到了如何获得一个适配器一起玩,让我们开始真正的工作,打开适配器并捕获一些交通。在本节中,我们将编写一个程序,打印一些通过适配器每个数据包信息流。该函数打开一个捕获装置是Open()重载是如下一些论据:Open()Open(DeviceModemode)Open(DeviceModemode,intread_timeout)以上两个论点值得一些进一步的解释。DeviceMode:在正常模式(DeviceMode.Normal),网络适配器只捕获的数据包直接解决它;在网络上的其他主机的数据包交换的被忽略。相反,当适配器(处于混杂模式DeviceMode.Promiscuous),它捕获所有的数据包不管是不是注定它或。这意味着,在共同的媒介(如非交换以太网),libpcap的/WinPcap的将能够捕捉到其他主机的数据包。混杂模式是应用程序的默认大多数捕捉,所以我们能够例如它在以下方面:。注意混杂模式,可以通过网络检测手段,如果你是在混杂模式捕获您可能能够被检测到其他实体在网络上。搜索“发现混杂”通过获取更多信息网上搜索引擎。read_timeout:指定读取超时毫秒,在。\l"statistics"一个读了适配器(例如,使用GetNextPacket()函数)将总是返回后read_timeout毫秒,即使没有数据包网络可从。read_timeout还定义统计报告之间的间隔如果适配器模式在统计(见在\l"statistics"网络流量收集统计数据的部分)。设置read_timeout以0表示没有超时,数据包到达一个适配器上的阅读永远不会返回,如果没有。甲-1方超时而导致适配器读取上总是立即返回。下面的例子显示了使用OnPacketArrival事件接收数据包。我们创建一个事件处理程序被称为每当一个新的包是经历ICaptureDevice:Collapse|CopyCode//提取设备的清单ICaptureDevice设备=器件[我];//注册的处理函数的//'包到来的事件device.OnPacketArrival+=新SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);//打开设备捕捉诠释readTimeoutMilliseconds=1000;device.Open(DeviceMode.Promiscuous,readTimeoutMilliseconds);Console.WriteLine(“-...监听{0},按'回车'停止”,device.Description);//开始捕获过程device.StartCapture();//等待'回车'从用户。Console.ReadLine();//停止捕获过程device.StopCapture();//关闭pcap的设备device.Close();这里是我们的包处理程序的执行情况:Collapse|CopyCode///<摘要>///打印的时间和长度分别获得分组///</摘要>私有静态无效device_OnPacketArrival(对象发件人,CaptureEventArgs包){DateTime的时间=packet.Timeval.Date;诠释长度=packet.Data.Length;Console.WriteLine(“{0}:{1}:{2},{3}{4}长度=”time.Hour,time.Minute,time.Second,time.Millisecond,len个);}一旦适配器被打开,可以开始捕捉与StartCapture()或Capture(intpacketCount)功能。这两个函数非常相似,所不同的是StartCapture()是一个非阻断功能,启动新的线程捕获进程A,而Capture(intpacketCount)直至块packetCount包已被抓获。当使用StartCapture()我们应该以后调用StopCapture()终止捕获过程。为了捕捉下去,调用Capture()方法。这些功能都需要一个用于处理数据包的事件处理程序调用它们前登记。此事件处理程序调用ICaptureDevice为每个新的网络数据包,并接收来自发送者对象,调用该处理程序(即ICaptureDevice对象)和实际收到的Packet,包括所有的协议头。请注意该帧的CRC通常不会在报文中,因为它是由框架验证后的网络适配器中删除。还要注意的是大多数适配器丢弃错误的CRC,所以WinPcap的包(因此SharpPcap)通常无法捕捉他们。该Packet类表示一个通用分组网络捕捉到的。每一个这样的数据包有一个PcapHeader的TIMESTAMP属性包含了捕获的数据包的长度和捕获)的有关数据包信息(例如。上面的例子中提取和长度从每一个时间戳Packet对象,并打印在屏幕上。请注意,处理程序代码是由所谓的ICaptureDevice,因此,用户应用程序没有在它的直接控制。另一种方法是使用GetNextPacket()函数,它在未来的一段介绍。如果没有事件处理程序(例如,在源码包4)捕获数据包在本节中的示例程序中的行为完全像前面的示例,但它使用ICaptureDevice.GetNextPacket()事件处理方法,而不是注册一个。该OnPacketArrival事件是一个很好的做法,可在一次捕捉设备从几个不错的选择在这样一些情况,因为当。但是,处理回调有时并不实用-它往往使得程序更加复杂,特别是在多线程应用程序的情况。在这种情况下,GetNextPacket()检索直接调用一个包,一-使用GetNextPacket()数据包只收到当程序员想用它们。在下面的程序,我们重新使用以前的示例中的事件处理程序代码和移动循环它成一个函数调用后立即在主要以GetNextPacket()注意:下面的例子将退出如果MS超时到期的1000网络上没有数据包:Collapse|CopyCode//提取设备的清单ICaptureDevice设备=器件[我];//打开设备捕捉诠释readTimeoutMilliseconds=1000;device.Open(DeviceMode.Promiscuous,readTimeoutMilliseconds);Console.WriteLine();Console.WriteLine(“-}..."监听{0,device.Description);分组包=0;//保存捕获数据包使用GetNextPacket()而((包=device.GetNextPacket())!=空){//打印的时间和收到的每个数据包的长度DateTime的时间=packet.PcapHeader.Date;诠释长度=packet.PcapHeader.PacketLength;Console.WriteLine(“{0}:{1}:{2},{3}{4}长度=”time.Hour,time.Minute,time.Second,time.Millisecond,len个);}//关闭pcap的设备device.Close();Console.WriteLine(“-捕捉停止,装置关闭。”);过滤交通(例如在源码包5)由libpcap和WinPcap的提供了最强大的功能之一就是过滤引擎。它提供了非常有效的方式来接收网络流量的子集。WinPcap的和libpcap拥有一个完整的编译器,它接受一个string包含一个高层次的布尔(过滤器)的表达,并产生一个低级别的字节代码,可以通过数据包捕获驱动程序解释的过滤器的发动机。作为tcpdump的布尔语法)表达式的语法(也称为被广泛用于许多应用的libpcap和WinPcap的除外。你可以找到它的规格在WinPcap的文档页面,或者如果您运行的是通过Linux的人pcap的过滤器'。该Filter属性相关联过滤器,捕捉器。一旦Filter设置,相关的过滤器将被应用到所有的数据包来自于网络,所有的符合性的数据包(即包为其布尔表达式的值为true)将实际复制到应用程序。下面的代码演示如何编译和设置过滤器。请注意的libpcap/WinPcap的的表达式编译器要求掩码由ICaptureDevice传递连同过滤器,因为编译器创建的一些过滤器需要它。然而SharpPcap需要通过自动提取从适配器掩码它照顾我们。该过滤器的表达我们在下面的代码片段使用“IP和TCP”,这意味着“只保留数据包是IPv4和TCP和提供这些应用程序”:Collapse|CopyCode//打开设备捕捉诠释readTimeoutMilliseconds=1000;device.Open(DeviceMode.Promiscuous,readTimeoutMilliseconds);//tcpdump的过滤器,只捕获的TCP/IP数据包字符串过滤=“IP和TCP”;device.Filter=过滤器;Console.WriteLine();Console.WriteLine(“-下tcpdump的过滤器将被应用于:\”{0}\“”,过滤器);Console.WriteLine(“-...监听{0},按'回车'停止”,device.Description);//开始捕获数据包无限期device.Capture();//关闭pcap的设备//(注:这条线将永远不会被调用,因为//我们捕捉无限期device.Close();口译(在源代码包示例6)包现在,我们能够捕捉和过滤网络流量,我们希望把我们的知识,可以用一个简单的“真实世界”的申请。在这一课,我们将采取从前面的代码,并使用这些作品建立一个更加有用的程序。当前计划的主要目的是展示如何捕获的数据包的协议头可以解析和解释。由此产生的程序,名字叫DumpTCP,打印网络摘要对我们的TCP流量。我选择了解析和显示TCP协议(UDP的例子,而不是在原来的教程贴),因为它是一个更加有趣比UDP和SharpPcap它不需要太多的编码解析。Collapse|CopyCode///<摘要>///打印的时间,长度,源IP,///源端口,DST的IP和端口的DST///为每个TCP/IP数据包在网络上收到///</摘要>私有静态无效device_OnPacketArrival(对象发件人,CaptureEventArgs五){风险值的TCP=TcpPacket.GetEncapsulated(e.Packet);如果(技术合作计划!=空){DateTime的时间=e.Packet.Timeval.Date;诠释长度=e.Packet.Data.Length;串srcIp=tcp.SourceAddress;串dstIp=tcp.DestinationAddress;Console.WriteLine(“{0}:{1}:{2},{3}{4}长度=”time.Hour,time.Minute,time.Second,time.Millisecond,len个);Console.WriteLine(e.Packet.ToString());}}如果你在看一个UDP的例子原WinPcap教程,你将看到它是多么复杂的报文解析(虽然UDP是一个简单的TCP解析位比在我们的例子)提供直接从数据字节的原始WinPcap的库。幸运的是,SharpPcap提供了一些有用的数据包进行分析一些常见的协议(例如TCP,UDP和ICMP和其他)类。这些分析类是直接的C#最初是从翻译JPcap,一个libpcap的Java包装/WinPcap的类似SharpPcap,但已作出重大改变,使他们更好地适应。NET中。所有代码的数据包解析和生成可以发现,在PacketDotNet命名空间中PacketDotNet大会。正如你可以看到,在我们的包处理,我们首先尝试提取的TCP报文的那包就行了捕获封装。如果一个人发现了,它应该是唯一的选择,因为我们的TCP数据包过滤器,我们就可以访问其属性。如果我们也希望看到的IP数据包通过这些属性是可以访问varip=IpPacket.GetEncapsulated(e.Packet);Collapse|CopyCode可用设备:------------------1)英特尔(R)PRO/1000吨移动连接(微软的数据包调度程序)-请选择一个设备捕捉:1-英特尔听力(R)的PRO/1000吨移动连接-(微软的数据包调度程序)...1:18:17,675长度=12347:80->“1:435011:18:17,675长度=801:43501->“47:801:18:17,919长度=5447:80->“1:43501最后三个行,每行代表一个不同的数据包。脱机处理转储文件(例如,在源码包8)在本节中,我们将学习如何处理数据包捕获到一个文件(转储到文件)。Libpcap的/WinPcap的提供内置的保存到一个文件中的网络通信功能和读取的转储内容-这部分将教你如何完成与SharpPcap这一点。为转储文件的格式是libpcap的一个。这种格式包含了二进制数据捕获的数据包的形式,广泛应用于许多网络工具,包括的wireshark,windump,tcpdump和snort的使用标准。因此,任何转储文件中,我们创建使用SharpPcap可与上述工具和其他人可以通过这些工具创建的文件SharpPcap打开任何打开。保存数据包转储文件首先,让我们来看看如何写libpcap文件格式的数据包。下面的示例捕获从选定的接口的数据包并将其保存在一个文件的名称是由用户提供他们:Collapse|CopyCodeConsole.Write(“-请输入输出文件名:”);串capFile=Console.ReadLine();ICaptureDevice设备=CaptureDeviceList.Instance[我];//注册的处理函数的'包到来的事件device.OnPacketArrival+=新SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);//打开设备捕捉诠释readTimeoutMilliseconds=1000;device.Open(DeviceMode.Promiscuous,readTimeoutMilliseconds);//打开或创建一个捕获输出文件device.DumpOpen(capFile);Console.WriteLine();Console.WriteLine(“-...监听{0},按'按Ctrl-c'来退出”device.Description);//开始捕获无限期device.Capture();//关闭pcap的设备//(注:这条线将永远不会被调用,因为//我们永远捕捉device.Close();这里是包处理程序,将每一个收到的数据包转储到文件中:Collapse|CopyCode///<摘要>///每次接收的数据包转储到一个pcap的文件///</摘要私有静态无效device_OnPacketArrival(对象发件人,CaptureEventArgs包){ICaptureDevice设备=(ICaptureDevice)寄件人;//如果设备有一个转储文件打开如果(device.DumpOpened){//数据包转储到文件device.Dump(包);Console.WriteLine(“数据包转储到文件中。”);}}正如你可以看到,该方案的结构非常相似,我们在前面的章节中看到的。区别是:调用device.DumpOpen(capFile)发出一旦接口被打开。此调用打开与接口转储文件和关联。数据包写入该文件以device.Dump(packet)处理程序调用的数据包。请注意一个使用发送者的对象参数传递给包处理程序回调是投ICaptureDevice。从转储文件中读数据包现在,我们有一个转储文件可用,我们可以尝试读取其内容。下面的代码打开一个WinPcap的/libpcap的转储文件并显示文件中的每个数据包。该SharpPcap.OfflineCaptureDevice(capFile)类是一个ICaptureDevice对象,表示脱机捕获文件,我们读到,那么通常OnPacketArrival事件中使用的数据包按顺序。正如你可以看到,从脱机阅读捕获数据包几乎是相同的,以期得到一个物理接口它们:Collapse|CopyCodeConsole.Write(“-请输入一个输入捕捉文件名:”);串capFile=Console.ReadLine();ICaptureDevice装置;尝试{//得到一个脱机文件pcap的设备设备=新OfflineCaptureDevice(capFile);//打开设备捕捉device.Open();}赶上(例外五){Console.WriteLine(e.Message);返回;}//注册的处理函数的'包到来的事件device.OnPacketArrival+=新SharpP

温馨提示

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

评论

0/150

提交评论