版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、!-簡(jiǎn)介包捕獲(或數(shù)據(jù)包嗅探)是收集數(shù)據(jù),通過(guò)特定的網(wǎng)絡(luò)接口將所有數(shù)據(jù)包的過(guò)程。在我們的應(yīng)用 程序捕獲網(wǎng)絡(luò)數(shù)據(jù)包是一個(gè)強(qiáng)大的能力,它可以讓我們寫(xiě)網(wǎng)絡(luò)監(jiān)控,數(shù)據(jù)包分析器和安全工具。本的lib pea p庫(kù)和基于UNIX系統(tǒng)WinP ca p的用于Win dows 是最廣泛使用的數(shù)據(jù)包捕獲驅(qū)動(dòng) 程序監(jiān)視API提供低級(jí)別的網(wǎng)絡(luò)。其中應(yīng)用程序使用的libpcap / WinPcap的包捕獲子系統(tǒng)為是著名的tcpdump的和 Wireshark 的。在這篇文章中, 我們將介紹 SharpPcap WinPcap的從您的。NET應(yīng)用程序。)NET程序集(庫(kù) 接口與libpcap的或并會(huì)給你一個(gè)詳細(xì)的方案編
2、制教程教你如何使用。背景應(yīng)用WinPcap 而在他的C #編碼具有省時(shí),如垃他發(fā)現(xiàn)在Code Project塔米爾加爾在 2004 年左右開(kāi)始的 SharpPcap 項(xiàng)目。他想用在。NET 大學(xué)最后項(xiàng)目的工作。該項(xiàng)目涉及VoIP流量分析和解碼,他想繼續(xù)用圾收集功能簡(jiǎn)單。WinPcap的API的訪問(wèn)似乎從凈是相當(dāng)流行的要求, 上的一些網(wǎng)站,讓您做到這一點(diǎn)有益的項(xiàng)目。:數(shù)據(jù)包捕獲和分析儀原始套接字捕獲使用 C#與WinPcap的包嗅探功能移植到。NET庫(kù)第一個(gè)項(xiàng)目是一個(gè)偉大的空靈。NET的克隆,讓您獲取和分析大量的數(shù)據(jù)包的協(xié)議類(lèi)型。然而,隨著這個(gè)項(xiàng)目的幾個(gè)問(wèn)題使它幾乎不可能得到在其他。NET應(yīng)用程
3、序共享。首先,作者沒(méi)有提NET應(yīng)用程序中使用任何通用的API包。他沒(méi)有單獨(dú)的供用于捕獲,可以通過(guò)其他。NET應(yīng)用程序中使用任何通用的API包。他沒(méi)有單獨(dú)的 UI代碼和他的分析和捕獲的代碼,使他的捕捉代碼類(lèi)依賴(lài)于圖形用戶(hù)界面,如ListView 操作。其次,由于某些原因,筆者選擇了重新實(shí)現(xiàn)在C #由他本人,而不是僅僅WinPcap 的包裝他們的部分職能。這意味著他的應(yīng)用程序無(wú)法利用新的WinPcap的版本的硬編碼的優(yōu)勢(shì),因?yàn)樗谒腤inP ca p的應(yīng)用程序的某些版本。第二個(gè)和第三個(gè)物品的包裝項(xiàng)目為WinP ca p 的好開(kāi)始,但他們沒(méi)有提供一些重要的WinP ca p的功能,如離線pcaP的
4、文件處理和應(yīng)用內(nèi)核級(jí)數(shù)據(jù)包過(guò)濾器,以及最重要的是他們提供了這樣的分析沒(méi)有協(xié)議分析器類(lèi)包。這兩個(gè)項(xiàng)目沒(méi)有張貼的文章,以自己的庫(kù)的源代碼,讓其他人一起延長(zhǎng)他們的工作和增加新功能和新的數(shù)據(jù)包分析器類(lèi)。因此,塔米爾決定開(kāi)始他對(duì)自己的圖書(shū)館工作。在 年年中時(shí),在1.x系列的最后一個(gè)版本發(fā)布時(shí),1.x系列的幾個(gè)版本發(fā)布。發(fā)展放緩對(duì)2007Shar pP ca p 1.6.2o克里斯摩根發(fā)生在 2008年11月超過(guò)Shar pP ca p發(fā)展。從那時(shí)起 Sharp Pea p 主要內(nèi)部已重寫(xiě)和API改進(jìn)。2010年2月下旬,Shar pP ca p 3.0被釋放。此版本是一個(gè)重寫(xiě)Sharp Pea p 的數(shù)
5、據(jù)包分析器。分組分析功能被打破,進(jìn)入一個(gè)新的圖書(shū)館,P acket.Net o Sharp Pea p 注意到與lib pcap 的/ WinPeap 的包和Packet.Net注意到接口解剖和創(chuàng)造護(hù)理照顧。對(duì)Packet.Net的建筑的細(xì)節(jié)將在本教程的后面討論。SharpPcap v3.5版本發(fā)布了 2月1日,2011年。3.5版本包含重大的空氣污染指數(shù)的變化以及WinPcap 的遠(yuǎn)程采集和支持 AirPcap o關(guān)于 SharpPcap的目的SharpPcap 是提供一個(gè)框架 NET應(yīng)用程序捕獲,注資。和分析網(wǎng)絡(luò)數(shù)據(jù)包。Shar pP ca p 是公開(kāi)和積極發(fā)展同它的源代碼和文件發(fā)布在以改
6、善或解決問(wèn)題歡迎通過(guò)sharp pcap開(kāi)發(fā)者郵件列表積極回答問(wèn)題的論壇和跟蹤支持,所以如果你有任何問(wèn)題請(qǐng)與庫(kù)隨時(shí)問(wèn)。SourceForge。錯(cuò)誤報(bào)告,托管。源代碼補(bǔ)丁, 功能要求和其他查詢(xún)正在Shar pP ca p 是一個(gè)完全跨平臺(tái)的庫(kù)管理。同一程序集運(yùn)行在微軟的。 64位平臺(tái)。NET以及單在32位和F面的列表說(shuō)明了目前Shar pP ca p 功能支持:oNET 和 Mo no 平臺(tái)上的 Win dows(32 位或64 位)和Linux單一組件的 Microsoft(32 或 64 位)和 Mac o高性能-SharpPcap可以捕捉足夠快跟上 > 的3MB / s 的傳輸速率高
7、達(dá) SCP的WinPcap的擴(kuò)展部分支持:設(shè)置內(nèi)核緩沖區(qū)大小注射用的數(shù)據(jù)包發(fā)送隊(duì)列。收集在一個(gè)特定的網(wǎng)絡(luò)接口的網(wǎng)絡(luò)統(tǒng)計(jì) 支持AirPca p枚舉和顯示有關(guān) Win dows 機(jī)器上的物理網(wǎng)絡(luò)接口的細(xì)節(jié)。 捕獲低級(jí)別的網(wǎng)絡(luò)數(shù)據(jù)包將通過(guò)給定的接口。分析和解析以下協(xié)議:以太網(wǎng)血清瘦素(Linux的熟食方式采集)ARP (地址解析協(xié)議)IP (因特網(wǎng)協(xié)議):? IPv4 的? IPv6 的TCP (傳輸控制協(xié)議)UDP (用戶(hù)數(shù)據(jù)報(bào)協(xié)議)ICMP協(xié)議(In ternet 控制消息協(xié)議)? ICMPv4? ICMPv6 報(bào)IGMPv2 的PPP oE協(xié)議和平之路LLDP功能喚醒局域網(wǎng)(網(wǎng)絡(luò)喚醒)在給定接
8、口注入的低級(jí)別的網(wǎng)絡(luò)數(shù)據(jù)包。 處理(閱讀和寫(xiě)作)離線數(shù)據(jù)包捕獲文件。 檢索的數(shù)據(jù)包接收適配器統(tǒng)計(jì)對(duì)比下降請(qǐng)檢查項(xiàng)目主頁(yè)主頁(yè)最新的更新和 bug修復(fù)。Sharp Pca p架構(gòu)Shar pPcap 具有層狀結(jié)構(gòu),在頂層的類(lèi),所有設(shè)備的工作:Cap tureDeviceListOfflin eCa ptureDeviceICap tureDevice-檢索系統(tǒng)名單上的所有設(shè)備-文件讀取裝置從一個(gè)pcap的捕捉-所有的捕捉設(shè)備有 ICaptureDevice接口該命名空間的布局層次:libp ca po的Lib Pcap LiveDeviceLib Pcap LiveDeviceList-一個(gè) IC
9、aptureDevice-檢索一個(gè)名單 LibPcapLiveDevice設(shè)備(其中包括pcap的/ WinPcap的和airpcap 設(shè)備)WinPcap 的oWinPcap DeviceList-檢索一個(gè)名單WinPcapDevices(其中包括WinPcap 的和 airpcap 設(shè)備)WinPcap Device口-阿 LibPcapLiveDevice額外WinPcap 的功能和接AirPca poAir Pcap DeviceListAir Pcap Device-檢索一個(gè)名單 AirPcapDevices-阿 WinPcapDevice額外 AirPcap 功能和接口Cap tu
10、reDeviceList返回一個(gè)設(shè)備清單完全分化。這意味著每個(gè)歸國(guó) CaptureDeviceListICap tureDevice要么是 LibPcapLiveDevice由,一 WinPcapDevice 或AirPca pDevice。這使您可以檢索整個(gè)列表的設(shè)備和差異化在每個(gè)設(shè)備類(lèi)型看。如果你想獲得一個(gè)特定的特定類(lèi)型的設(shè)備只,你可以使用一個(gè)*DeviceList 類(lèi)。曰 Colla pse |Copy Code/ /檢索所有捕獲設(shè)備=Cap tureDeviceListVaR的裝置;/ /類(lèi)型的區(qū)分依據(jù)的 foreach ( ICaptureDevice如果(dev 是 AirPcap
11、Devicedev 的設(shè)備中)過(guò)程作為 AirPcapDevice否則如果(dev 是 WinPcapDevice)過(guò)程作為 WinPcapDevice否則如果(dev 是 LibPcapLiveDevice過(guò)程作為 LibPcapLiveDeviceElColla pse |Copy Code/ /只檢索Win Pea p的(和AirPca p 設(shè)備)=AirPcapDeviceListVaR 的裝置;的 foreach ( AirPcapDevicedev 的設(shè)備中)/ /處理該AirPcap設(shè)備Packet.Net結(jié)構(gòu)和用法Packet.Net切換從2.x到SharpPcap 繼承模型的
12、嵌套包之一。所有的數(shù)據(jù)包包含一個(gè)Packet PayloadPacket屬性和一個(gè)Byte PayloadData財(cái)產(chǎn)。一個(gè)或多個(gè)這些都不能有效。以太網(wǎng)上的TCP數(shù)據(jù)包捕獲的可能 EthernetPacket “ - > IPv4 包->” TCP數(shù)據(jù)包。在Packet.Net時(shí),TCP數(shù)據(jù)包可能被訪問(wèn)一樣cap turedPacket.PayloadPacket.PayloadPacketGetE neap sulsted()方法被添加,因此用戶(hù)可以做的Tcp Packet.GetE neap sulated(ca pturedPacket);而是要幫助用戶(hù)從staticvar
13、tcp Packet =該GetEneapsulated()方法是很聰明,設(shè)計(jì)工作在許多不同的情況。Udp Packet.GetE neap sulated()將返回 Ether net Packet UDP包的數(shù)據(jù)包,包括“->IP數(shù)據(jù)包” -> UdpPacket或Linux 熟捕捉- > "知識(shí)產(chǎn)權(quán)” -> UdpPacket或Ethernet Packet -> “的PPPoE - > ”和平之路“- > 知識(shí)產(chǎn)權(quán) -> ” UdpP acket。我們建議使用GetEneapsulated()方法來(lái)檢索子數(shù)據(jù)包。隨著Packet
14、.Net ,建設(shè)包是這樣的:曰 Colla pse |Copy Code使用 P acketDotNet;ushort 的 tc pSource Port = ushort 的 tcp Destinatio nPort = 風(fēng)險(xiǎn)123;321;tcpP acket =新 TcpP acket(tcp Source Port, tcp Destinatio nPort風(fēng)險(xiǎn)ip SourceAddress =System.Net.I PAddress. Parse風(fēng)險(xiǎn)ip DestinationAddress =System.Net.I PAddress. Parse(“ ”
15、);(“ ”);風(fēng)險(xiǎn)ipP acket =新 IPv4Packet(ipSourceAddress, ipDestinationAddress風(fēng)險(xiǎn)sourceHwAddress90-90-90-90-90-90”;風(fēng)險(xiǎn)ethernetSourceHwAddress =System.Net.NetworkInformation. PhysicalAddress. Parse(sourceHwAddress ); 風(fēng)險(xiǎn) destinationHwAddress80-80-80-80-80- 80”;風(fēng)險(xiǎn) ethernetDestinationHwAddress =System
16、.Net.NetworkInformation. PhysicalAddress. Parse(destinationHwAddress/ / 注意:使用 EthernetPacketType.None/ /協(xié)議類(lèi)型的更新是基于數(shù)據(jù)包有效載荷說(shuō)明了以太網(wǎng)/ /分配給特定的以太網(wǎng)包風(fēng)險(xiǎn) ethernet Packet =新 Ethernet Packet(ethernetSourceHwAddressethernetDestinationHwAddressEthernet PacketT yp e.None/ /現(xiàn)在所有的數(shù)據(jù)包縫在一起ipP acket .P ayload Packet = t
17、cpP acket;ethernet Packet. Payload Packet = ipP acket;/ /并打印岀包地看到,它看上去就像我們希望它Console.WriteLine(ethernet Packet.ToString0);/ /要檢索的字節(jié)表示這個(gè)新創(chuàng)建使用屬性的字節(jié)字節(jié)P acketBytes = ethernet Packet.Bytes;/ / Ethernet PacketSharpPcap步步教您使用Shar pPcap例子可以發(fā)現(xiàn),在 示例/包目錄源。本教程的文本,這是直接取自 WinPcap的的官方教程,但修改以顯示 C #中使用SharpPcap 庫(kù)。所有
18、的例子可以下載連同SharpPca p 此網(wǎng)頁(yè)的源代碼從頂部。如果您是Win dows 上運(yùn)行,WinPcap的庫(kù)必須安裝運(yùn)行的例子,然后再?lài)L試任何這些,所以請(qǐng)下載并安裝最新版本的WinPcap 的的下載頁(yè)面。如果Mac運(yùn)行在Unix / Linux / 時(shí),libpcap庫(kù)必須安裝使用你的系統(tǒng)軟件管理系統(tǒng)。涵蓋以下主題在這方面與在括號(hào)中的實(shí)例名稱(chēng)教程:..9.獲取設(shè)備列表(例 1) 打開(kāi)適配器并捕獲數(shù)據(jù)包(示例 4)捕獲的數(shù)據(jù)包,但無(wú)事件(例 過(guò)濾流量(例5) 解讀包(例6) 脫機(jī)處理轉(zhuǎn)儲(chǔ)文件(例8)發(fā)送數(shù)據(jù)包(例 9)發(fā)送隊(duì)列(例10 ) - WinP ca p
19、 11)收集統(tǒng)計(jì)數(shù)據(jù)在網(wǎng)絡(luò)上的流量3)的唯一(例如 -WinPcap的唯一10.后臺(tái)處理數(shù)據(jù)包隊(duì)列-高封包捕獲率獲取設(shè)備列表(例如,在源碼包 1 )通常,第一個(gè)事,一個(gè)Sharp Pcap 提供了一個(gè)類(lèi),Ca ptureDeviceList 持有型緩存網(wǎng)絡(luò)適配器列表ICa ptureDevice含人類(lèi)可讀的名稱(chēng)和描述,分別對(duì)相應(yīng)的設(shè)備。印在屏幕上,印刷錯(cuò)誤,如果沒(méi)有適配器發(fā)現(xiàn):Shar pPcap 為基礎(chǔ)的應(yīng)用程序是得到一個(gè)連接的網(wǎng)絡(luò)適配器的列表。用于這一目的。這個(gè)類(lèi)是一個(gè)單實(shí)例,。特別是,Name和Description 屬性包下面的C #示例顯示了如何檢索適配器列表和打pColla pse
20、 |Copy Code/ / 打印SharpPcap 版本字符串 版本=SharpPcap.Version.VersionString;Console.WriteLine(“0 SharpPcap , Example1.lfList.cs,版本);/ /檢索設(shè)備列表Cap tureDeviceList設(shè)備=Cap tureDeviceList.lnstance;/ /如果沒(méi)有設(shè)備被發(fā)現(xiàn)打印錯(cuò)誤女口果(devices.CountConsole.WriteLine設(shè)備不被發(fā)現(xiàn)本機(jī)”;Console.WriteLineConsole.WriteLine? “);返回; n以下是機(jī)器設(shè)備可以用這樣的:
21、”;!-/ /打印岀可用的網(wǎng)絡(luò)設(shè)備的 foreach(ICaptureDevicedev 的設(shè)備中)();Console.WriteLine(“0 N'的,dev.ToString該函數(shù)打開(kāi)一個(gè)捕獲裝置是Open()重載是如下一些論據(jù):Console.Write點(diǎn)擊輸入退出.”);Console.ReadLine上述應(yīng)用程序的輸岀會(huì)是這樣的:ElColla pse |Copy Code實(shí)例目錄調(diào)試 “> Exampl e1.IfList.exeSharp Pcap ,Example1.lfList.cs以下是這臺(tái)機(jī)器上的設(shè)備可供選擇:接口:名稱(chēng): Device NP
22、F_ D8B7C9B2 - D53D - 45DA - ACF0 - 2E2116F97314 的 FriendlyName描述:英特爾(R)地址::局域網(wǎng)連接2Pro/1000 mt臺(tái)式機(jī)適配器地址:為fe80 :b444 : 92d8 : c882 : 8227網(wǎng)絡(luò)掩碼:Broadaddr地址:地址:5網(wǎng)絡(luò)掩碼:Broadaddr : 55地址:地址:硬件地址:0800276AC792標(biāo)志:0按'Enter' 鍵退出.打開(kāi)一個(gè)適配器和捕獲數(shù)據(jù)包(例如,在源碼包現(xiàn)在,我們已經(jīng)看到了如何獲得一個(gè)適配器一起玩,一
23、些交通。在本節(jié)中,我們將編寫(xiě)一個(gè)程序,打印一些通過(guò)適配器每個(gè)數(shù)據(jù)包信息流。讓我們開(kāi)始真正的工作,打開(kāi)適配器并捕獲!-Open()Open( DeviceMode mode)Open( DeviceMode mode, int read_timeout)以上兩個(gè)論點(diǎn)值得一些進(jìn)一步的解釋。DeviceMode :在正常模式(DeviceMode.Normal ),網(wǎng)絡(luò)適配器只捕獲的數(shù)據(jù)包直接解 決它;在網(wǎng)絡(luò)上的其他主機(jī)的數(shù)據(jù)包交換的被忽略。相反,當(dāng)適配器(處于混雜模式DeviceMode.Promiscuous ),它捕獲所有的數(shù)據(jù)包不管是不是注定它或。這意味著,在 共同的媒介(如非交換以太網(wǎng)),
24、lib pcap的/ WinPcap的將能夠捕捉到其他主機(jī)的數(shù)據(jù)包?;祀s模式是應(yīng)用程序的默認(rèn)大多數(shù)捕捉,所以我們能夠例如它在以下方面:。注意混雜模式,以通過(guò)網(wǎng)絡(luò)檢測(cè)手段,如果你是在混雜模式捕獲您可能能夠被檢測(cè)到其他實(shí)體在網(wǎng)絡(luò)上。搜索現(xiàn)混雜”通過(guò)獲取更多信息網(wǎng)上搜索引擎。read_timeout :指定讀取超時(shí)毫秒,在。一個(gè)讀了適配器(例如,使用GetNextPacket() 函數(shù))將總是返回后 read_timeout 毫秒,即使沒(méi)有數(shù)據(jù)包網(wǎng)絡(luò)可從。read_timeout定義統(tǒng)計(jì)報(bào)告之間的間隔如果適配器模式在統(tǒng)計(jì)(見(jiàn)在網(wǎng)絡(luò)流量收集統(tǒng)計(jì)數(shù)據(jù)的部分)。設(shè)置read_timeout 以0表示沒(méi)有超
25、時(shí),數(shù)據(jù)包到達(dá)一個(gè)適配器上的閱讀永遠(yuǎn)不會(huì)返回,如果沒(méi) 有。甲-1方超時(shí)而導(dǎo)致適配器讀取上總是立即返回。下面的例子顯示了使用On PacketArrival事件接收數(shù)據(jù)包。我們創(chuàng)建一個(gè)事件處理程序被稱(chēng)為每當(dāng)一個(gè)新的包是經(jīng)歷ICa ptureDevice:pColla pse |Copy Code/ /提取設(shè)備的清單ICaptureDevice設(shè)備=器件我;/ /注冊(cè)的處理函數(shù)的/ /'包到來(lái)的事件device.O nP acketArrival + =(device_ OnP acketArrival/ /打開(kāi)設(shè)備捕捉詮釋 readTimeoutMilliseconds =新 Sharp
26、Pcap.P acketArrivalEventHandler1000;device.Open( DeviceMode.Promiscuous, readTimeoutMillisecondsConsole.WriteLine(“-. 監(jiān)聽(tīng)0,按回車(chē)停止”,0 ;device.Descri ption / /開(kāi)始捕獲過(guò)程device.StartCa pture / /等待回車(chē)從用戶(hù)。Console.ReadLine ();!-/ /停止捕獲過(guò)程devices opCap ture/ /關(guān)閉PcaP的設(shè)備device.Close ();這里是我們的包處理程序的執(zhí)行情況:HColla pse |C
27、opy Code摘要打印的時(shí)間和長(zhǎng)度分別獲得分組/摘要/ / /私有靜態(tài)無(wú)效 device_OnPacketArrival(對(duì)象發(fā)件人,Cap tureEventArgs包)DateTime 的時(shí)間=p acket.Timeval.Date;詮釋 長(zhǎng)度=P acket.Data.Length;Console.WriteLine( “0 : 1 : 2 ,3 4長(zhǎng)度=”time.Hour ,time.Minute ,time.Second ,time.Millisecond,len 個(gè));或 Capture(intpacketCount)一旦適配器被打開(kāi),可以開(kāi)始捕捉與StartCa pture
28、()功能。這兩個(gè)函數(shù)非常相似,所不同的是程捕獲進(jìn)程 A,而Capture(intpacketCount)直至塊packetCount包已被抓獲。當(dāng)使用StartCapture()我們應(yīng)該以后調(diào)用StopCapture()終止捕獲過(guò)程。為了捕捉下去,方法。StartCa pture()是一個(gè)非阻斷功能,啟動(dòng)新的線調(diào)用 Capture()這些功能都需要一個(gè)用于處理數(shù)據(jù)包的事件處理程序調(diào)用它們前登記。此事件處理程序調(diào)用為每個(gè)新的網(wǎng)絡(luò)數(shù)據(jù)包,并接收來(lái)自發(fā)送者對(duì)象,調(diào)用該處理程序(即對(duì)象)和實(shí)際收到的 Packet ,包括所有的協(xié)議頭。請(qǐng)注意該幀的CRC因?yàn)樗怯煽蚣茯?yàn)證后的網(wǎng)絡(luò)適配器中刪除。還要注意的
29、是大多數(shù)適配器丟ICa ptureDeviceICa ptureDevice通常不會(huì)在報(bào)文中, 棄錯(cuò)誤的CRC,所以 WinPcap 的包(因此 Sharp Pea p )通常無(wú)法捕捉他們。該P(yáng)acket 類(lèi)表示一個(gè)通用分組網(wǎng)絡(luò)捕捉到的。每一個(gè)這樣的數(shù)據(jù)包有一個(gè)PcapHeader 的,因此,用戶(hù)應(yīng)用程序沒(méi)有在它的直接 函數(shù),它在未來(lái)的一段介紹。TIMESTA MP 屬性包含了捕獲的數(shù)據(jù)包的長(zhǎng)度和捕獲)的有關(guān)數(shù)據(jù)包信息(例如。上面的例子 中提取和長(zhǎng)度從每一個(gè)時(shí)間戳Packet對(duì)象,并打印在屏幕上。請(qǐng)注意,處理程序代碼是由所謂的ICa ptureDevice控制。另一種方法是使用GetNextP
30、acket()如果沒(méi)有事件處理程序(例如,在源碼包4)捕獲數(shù)據(jù)包在本節(jié)中的示例程序中的行為完全像前面的示例,ICa ptureDevice.GetNextPacketOOn PacketArrival但它使用事件處理方法,而不是注冊(cè)一個(gè)。該事件是一個(gè)很好的做法,可在一次捕捉設(shè)備從幾個(gè)不錯(cuò)的選擇在這樣一些情況,因?yàn)楫?dāng)。但是,處理回調(diào)有時(shí)并不實(shí)用-它往往使得程序更加復(fù)雜,特別是在多線程應(yīng)用程序的情況。在這種情況下, GetNextPacketO檢索直接調(diào)用一個(gè)包,一-使用GetNextPacketO 數(shù)據(jù)包只收到當(dāng)程序員想用它們。在下面的程序,例中的事件處理程序代碼和移動(dòng)循環(huán)它成一個(gè)函數(shù)調(diào)用后立即
31、在主要以我們重新使用以前的示GetNextPacketO注意:下面的例子將退岀如果MS超時(shí)到期的1000網(wǎng)絡(luò)上沒(méi)有數(shù)據(jù)包:目 Colla pse |Copy Code/ /提取設(shè)備的清單ICaptureDevice設(shè)備=器件我;/ /打開(kāi)設(shè)備捕捉詮釋 readTimeoutMilliseconds =1000;device.Open( DeviceMode.Promiscuous,readTimeoutMillisecondsConsole.WriteLineConsole.WriteLine();(“ -"監(jiān)聽(tīng)0,device.Descri ption分組包=0;()()!=空)/
32、 /保存捕獲數(shù)據(jù)包使用GetNextPacket 而(包=device.GetNextPacket/ /打印的時(shí)間和收到的每個(gè)數(shù)據(jù)包的長(zhǎng)度DateTime 的時(shí)間=p acket. Pcap Header.Date; 詮釋 長(zhǎng)度=p acket .Pcap Header. PacketLength;Console.WriteLine(“0 : 1 : 2,3 4長(zhǎng)度=”time.Hour , time.Minute ,time.Second , time.Millisecond, len 個(gè));/ /關(guān)閉PcaP的設(shè)備device.Close ();Console.WriteLine( “ -
33、捕捉停止,裝置關(guān)閉。”);過(guò)濾交通(例如在源碼包 5 )由libpcap和WinPcap的提供了最強(qiáng)大的功能之一就是過(guò)濾引擎。它提供了非常有效的方式來(lái)接收網(wǎng)絡(luò)流量的子集。WinPcap的和lib pea p擁有一個(gè)完整的編譯器,它接受一個(gè)stri ng包含一個(gè)高層次的布爾(過(guò)濾器)的表達(dá),并產(chǎn)生一個(gè)低級(jí)別的字節(jié)代碼,可以通過(guò)數(shù)據(jù)包捕獲驅(qū)動(dòng)程序解釋的過(guò)濾器的發(fā)動(dòng)機(jī)。作為tepdump 的布爾語(yǔ)法)表達(dá)式的語(yǔ)法(也稱(chēng)為被廣泛用于許多應(yīng)用的libpcap和WinPcap的除外。你可以找到它的規(guī)格在WinPcap的文檔頁(yè)面,或者如果您運(yùn)行的是通過(guò)Linux的人pcap的過(guò)濾器。捕捉器。一旦Filter
34、該Filter屬性相關(guān)聯(lián)過(guò)濾器,捕捉器。一旦Filter 設(shè)置,相關(guān)的過(guò)濾器將被應(yīng)用到所有的數(shù)據(jù)包來(lái)自于網(wǎng)絡(luò),所有的符合性的數(shù)據(jù)包(即包為其布爾表達(dá)式的值為true )將實(shí)際復(fù)制到應(yīng)用程序。下面的代碼演示如何編譯和設(shè)置過(guò)濾器。請(qǐng)注意的 libpcap / WinPcap濾器,因?yàn)榫幾g器創(chuàng)建的一些過(guò)濾器需要它。 它照顧我們。的的表達(dá)式編譯器要求掩碼由ICa ptureDevice傳遞連同過(guò)然而SharpPcap 需要通過(guò)自動(dòng)提取從適配器掩碼該過(guò)濾器的表達(dá)我們?cè)谙旅娴拇a片段使用TCP和提供這些應(yīng)用程序”:“IP和TCP,這意味著 只保留數(shù)據(jù)包是IPv4和pColla pse |Copy Code
35、/ /打開(kāi)設(shè)備捕捉詮釋 readTimeoutMilliseconds =1000;device.Open( DeviceMode.Promiscuous,readTimeoutMilliseconds/ / tepdump的過(guò)濾器,只捕獲的TCP / IP字符串過(guò)濾=“IP和TCP ;過(guò)濾器;device.Filter =Console.WriteLineConsole.WriteLine過(guò)濾器);Console.WriteLine數(shù)據(jù)包();(“-下tcpdump的過(guò)濾器將被應(yīng)用于:” 0(“-. 監(jiān)聽(tīng)0,按回車(chē)停止”,device.Descri ption / /開(kāi)始捕獲數(shù)據(jù)包無(wú)限期de
36、vice.Capture();/ /關(guān)閉PcaP的設(shè)備/ /(注:這條線將永遠(yuǎn)不會(huì)被調(diào)用,因?yàn)? /我們捕捉無(wú)限期device.Close ();口譯(在源代碼包示例 6)包現(xiàn)在,我們能夠捕捉和過(guò)濾網(wǎng)絡(luò)流量,我們希望把我們的知識(shí),可以用一個(gè)簡(jiǎn)單的真實(shí)世界”的申請(qǐng)。在這一課,我們將采取從前面的代碼,并使用這些作品建立一個(gè)更加有用的程序。當(dāng)前 計(jì)劃的主要目的是展示如何捕獲的數(shù)據(jù)包的協(xié)議頭可以解析和解釋。由此產(chǎn)生的程序,名字叫DumpTCP,打印網(wǎng)絡(luò)摘要對(duì)我們的 TCP流量。我選擇了解析和顯示 TCP協(xié)議(UDP的例子, 而不是在原來(lái)的教程貼),因?yàn)樗且粋€(gè)更加有趣比UDP和Sharp Pea p
37、它不需要太多的編碼解析。冃 Colla pse |Copy Code摘要打印的時(shí)間,長(zhǎng)度,源IP,源端口,DST的IP和端口的DST 為每個(gè)TCP / IP數(shù)據(jù)包在網(wǎng)絡(luò)上收到/摘要私有靜態(tài)無(wú)效 device_OnPacketArrival 對(duì)象發(fā)件人,Cap tureEventArgs 五) (e.Packet );風(fēng)險(xiǎn)值 的 TCP = TepPacket.GetEncapsulated如果(技術(shù)合作計(jì)劃!=空)DateTime 的時(shí)間=e.P acket.Timeval.Date;詮釋長(zhǎng)度=e.P acket.Data.Length;串 src Ip = tcp .SourceAddres
38、s; 串 dstI p = tcp .DestinationAddress;Console.WriteLine(“0 : 1 : 2,3 4 長(zhǎng)度=”time.Hour ,time.Minute ,time.Second,len 個(gè));(e.P acket.ToStringtime.MillisecondConsole.WriteLine0);如果你在看一個(gè) UDP的例子原WinPcap 是一個(gè)簡(jiǎn)單的TCP解析位比在我們的例子)教程,你將看到它是多么復(fù)雜的報(bào)文解析(雖然 UDP 提供直接從數(shù)據(jù)字節(jié)的原始WinP ca p的庫(kù)。幸運(yùn)(例如 TCP , UDP 和 ICMP的是,SharpPcap
39、 提供了一些有用的數(shù)據(jù)包進(jìn)行分析一些常見(jiàn)的協(xié)議和其他)類(lèi)。這些分析類(lèi)是直接的 C #最初是從翻譯 JPeap,個(gè)lib pea p的Java包裝/ WinPcap 的類(lèi)似SharpPcap ,但已作岀重大改變,使他們更好地適應(yīng)。和生成可以發(fā)現(xiàn),在PacketDotNet 命名空間中NET中。所有代碼的數(shù)據(jù)包解析PacketDotNet 大會(huì)。正如你可以看到,在我們的包處理,我們首先嘗試提取的 果一個(gè)人發(fā)現(xiàn)了,它應(yīng)該是唯一的選擇,因?yàn)槲覀兊?性。如果我們也希望看到的IP數(shù)據(jù)包通過(guò)這些屬性是可以訪問(wèn)Ip Packet.GetE neap sulated(e.Packet);TCP報(bào)文的那包就行了捕
40、獲封裝。如TCP數(shù)據(jù)包過(guò)濾器,我們就可以訪問(wèn)其屬var ip =pColla pse |Copy Code可用設(shè)備:1 )英特爾(R) P RO/1000 噸移動(dòng)連接(微軟的數(shù)據(jù)包調(diào)度程序)請(qǐng)選擇一個(gè)設(shè)備捕捉:1英特爾聽(tīng)力(R)的PRO/1000 噸移動(dòng)連接(微軟的數(shù)據(jù)包調(diào)度程序).長(zhǎng)度=123 47:80 -長(zhǎng)度=80 1:43501 -1:18:17,6751:18:17,675> “1:43501> “47:801:18:17,919長(zhǎng)度=54 47:80 -> “10.
41、21.98.21:43501最后三個(gè)行,每行代表一個(gè)不同的數(shù)據(jù)包。脫機(jī)處理轉(zhuǎn)儲(chǔ)文件(例如,在源碼包8)在本節(jié)中,我們將學(xué)習(xí)如何處理數(shù)據(jù)包捕獲到一個(gè)文件(轉(zhuǎn)儲(chǔ)到文件)。Lib pea p的/ WinP cap的提供內(nèi)置的保存到一個(gè)文件中的網(wǎng)絡(luò)通信功能和讀取的轉(zhuǎn)儲(chǔ)內(nèi)容-這部分將教你如何完成與Sharp Pca p這一點(diǎn)。為轉(zhuǎn)儲(chǔ)文件的格式是lib pea p的一個(gè)。這種格式包含了二進(jìn)制數(shù)據(jù)捕獲的數(shù)據(jù)包的形式,廣泛應(yīng)用于許多網(wǎng)絡(luò)工具,包括的wireshark , windump , tcpdump 和snort的使用標(biāo)準(zhǔn)。因此,任何轉(zhuǎn)儲(chǔ)文件中,我們創(chuàng)建使用Shar pP ca p可與上述工具和其他人可
42、以通過(guò)這些工具創(chuàng)建的文件Shar pPcap打開(kāi)任何打開(kāi)。保存數(shù)據(jù)包轉(zhuǎn)儲(chǔ)文件首先,讓我們來(lái)看看如何寫(xiě)lib pca p文件格式的數(shù)據(jù)包。下面的示例捕獲從選定的接口的數(shù)據(jù)包并將其保存在一個(gè)文件的名稱(chēng)是由用戶(hù)提供他們:pColla pse |Copy CodeConsole.Write(“-請(qǐng)輸入輸出文件名:”;串 cap File = Console.ReadLineICap tureDevice設(shè)備=Cap tureDeviceList.lnstance 我;/ /注冊(cè)的處理函數(shù)的包到來(lái)的事件device.O nP acketArrival + =新 Sharp Pcap.P acketArr
43、ivalEventHandler(device_OnPacketArrival/ /打開(kāi)設(shè)備捕捉詮釋 readTimeoutMilliseconds =1000;device.Open( DeviceMode.Promiscuous,readTimeoutMilliseconds/ /打開(kāi)或創(chuàng)建一個(gè)捕獲輸岀文件device.Du mpOpen(capFile);Console.WriteLineConsole.WriteLine();(“-. 監(jiān)聽(tīng)0,按按 Ctrl - c'來(lái)退出”device.Descri ption!-Console.Write ( “ -請(qǐng)輸入一個(gè)輸入捕捉文件名
44、:”;/ /開(kāi)始捕獲無(wú)限期device.Capture();/ /關(guān)閉PcaP的設(shè)備/ /(注:這條線將永遠(yuǎn)不會(huì)被調(diào)用,因?yàn)? /我們永遠(yuǎn)捕捉device.Close ();這里是包處理程序,將每一個(gè)收到的數(shù)據(jù)包轉(zhuǎn)儲(chǔ)到文件中:ElColla pse |Copy Code摘要每次接收的數(shù)據(jù)包轉(zhuǎn)儲(chǔ)到一個(gè)pcap/摘要的文件/ / /私有靜態(tài)無(wú)效 device_OnPacketArrival對(duì)象發(fā)件人,CaptureEventArgs 包)ICap tureDevice 設(shè)備=(ICa ptureDevice/ /如果設(shè)備有一個(gè)轉(zhuǎn)儲(chǔ)文件打開(kāi)女果(device.Du mpOp ened )/ /數(shù)據(jù)包
45、轉(zhuǎn)儲(chǔ)到文件device.Dump (包);Console.WriteLine(數(shù)據(jù)包轉(zhuǎn)儲(chǔ)到文件中?!?寄件人;正如你可以看到,該方案的結(jié)構(gòu)非常相似,我們?cè)谇懊娴恼鹿?jié)中看到的。區(qū)別是:調(diào)用device.Du mpOpen(cap File)發(fā)岀一旦接口被打開(kāi)。此調(diào)用打開(kāi)與接口轉(zhuǎn)儲(chǔ)文件和關(guān)聯(lián)。數(shù)據(jù)包寫(xiě)入該文件以device.Du mp( packet )個(gè)使用發(fā)送者的對(duì)象參數(shù)傳遞給包處理程序回調(diào)是投處理程序調(diào)用的數(shù)據(jù)包。請(qǐng)注意一ICa ptureDevice 。從轉(zhuǎn)儲(chǔ)文件中讀數(shù)據(jù)包WinPcap 的現(xiàn)在,我們有一個(gè)轉(zhuǎn)儲(chǔ)文件可用,我們可以嘗試讀取其內(nèi)容。下面的代碼打開(kāi)一個(gè)/ lib pea p的轉(zhuǎn)儲(chǔ)
46、文件并顯示文件中的每個(gè)數(shù)據(jù)包。該SharpPcap.OfflineCaptureDevice(capFile)類(lèi)是一個(gè) ICaptureDevice對(duì)象,表示脫機(jī)捕獲文件,我們讀到,那么通常On PacketArrival事件中使用的數(shù)據(jù)包按順序。正如你可以看到,從脫機(jī)閱讀捕獲數(shù)據(jù)包幾乎是相同的,以期得到一個(gè)物理接口它們:pColla pse |Copy Code!-串 cap File = Console.ReadLineICap tureDevice裝置;嘗試/ /得到一個(gè)脫機(jī)文件pcap的設(shè)備設(shè)備=新 OfflineCa ptureDevice/ /打開(kāi)設(shè)備捕捉(capFile);dev
47、ice.Open();趕上(例外五)Console.WriteLine(e.Message返回;/ /注冊(cè)的處理函數(shù)的包到來(lái)的事件device.O nP acketArrival + =(device_OnPacketArrival新 Sharp Pcap.P acketArrivalEventHandlerConsole.WriteLineConsole.WriteLine(“-捕獲'0',按'按 Ctrl - C'退出.”cap File);/ /開(kāi)始捕獲的數(shù)據(jù)包數(shù)量不定device.Ca pture/ / 關(guān)閉Pcap的設(shè)備device.CloseCons
48、ole.WriteLine0 ;(“-文件結(jié)束為止?!保婚_(kāi)業(yè)后適配器,Sen dPacket發(fā)送數(shù)據(jù)包(例如,在源碼包 9)調(diào)用來(lái)最簡(jiǎn)單的方法來(lái)發(fā)送一個(gè)數(shù)據(jù)包顯示在下面的代碼片段。發(fā)送一個(gè)手工制作的數(shù)據(jù)包。Se ndPacket 作為參數(shù)的字節(jié)數(shù)組或Packet 對(duì)象,它包含的數(shù)據(jù)被發(fā)送。請(qǐng)注意,緩沖區(qū)發(fā)送到網(wǎng)絡(luò)中,它已收到。這意味著應(yīng)用程序必須創(chuàng)建正確的協(xié)議頭,以送一些有意義的事:目 Colla pse |Copy Code/ /打開(kāi)設(shè)備device.Open();/ /生成一個(gè)隨機(jī)分組字節(jié) 字節(jié)=GetRandomPacket();嘗試(字節(jié));“-包發(fā)送成功?!保? /發(fā)送數(shù)據(jù)包的網(wǎng)
49、絡(luò)設(shè)備岀Console.WriteLinedevice.Send Packet趕上(例外五)Console.WriteLine”+ e.Message );/ /關(guān)閉PcaP的設(shè)備 device.Close ();Console.WriteLine“-設(shè)備關(guān)閉?!保?;發(fā)送隊(duì)列-Win Pcap的專(zhuān)用的擴(kuò)展(例如,在源碼包 10)雖然SendPacket 提供了一個(gè)簡(jiǎn)單而直接的方法來(lái)發(fā)送一個(gè)數(shù)據(jù)包, 發(fā)送隊(duì)列提供了一個(gè)先 進(jìn),強(qiáng)大和優(yōu)化機(jī)制,寄包集合。發(fā)送隊(duì)列是一個(gè)一將數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)變量的容器。 它有大小, 它代表的字節(jié)可以存儲(chǔ)的最大數(shù)量。由于SendQueue WinPcap 的具體功能是,
50、作者建議的SharpPcap 基準(zhǔn)特定使用您的發(fā)送隊(duì) 列發(fā)送數(shù)據(jù)包,以確定如果損失跨平臺(tái)支持的使用效率是值得的補(bǔ)充。一句老話,避免過(guò)早優(yōu)化”應(yīng)該慎重考慮。SharpPcap 代表發(fā)送隊(duì)列使用 SendQueue類(lèi),這是通過(guò)指定構(gòu)造隊(duì)列的大小,新的發(fā)送。一旦發(fā)送隊(duì)列的創(chuàng)建,Sen dQueue.AddO可以被調(diào)用時(shí),添加一個(gè)數(shù)據(jù)包的發(fā)送隊(duì)列。這個(gè)函數(shù)接受一個(gè)PcapHeader 與數(shù)據(jù)包的時(shí)間戳和長(zhǎng)度和一個(gè)緩沖或Packet分組數(shù)據(jù)對(duì)象持有的。這些參數(shù)是由收到相同的On PacketArrival事件,因此排隊(duì)一個(gè)數(shù)據(jù)包從剛剛抓獲了一名或讀文件是傳遞參數(shù)的問(wèn)題這些Sen dQueue.Add()
51、要發(fā)送發(fā)送隊(duì)列,SharpPcap 提供 WinPcapDevice.SendQueue(SendQueue q,Sen dQueueTra nsmitModes tran smitMode)功能。請(qǐng)注意第二個(gè)參數(shù):如果SendQueueTransmitModes.Synchronized,發(fā)送將被 同步,即數(shù)據(jù)包的相對(duì)時(shí)間戳將得到尊重。此操作需要非凡的CPU數(shù)量,因?yàn)橥叫枰趦?nèi)核中使用忙等待”循環(huán)趕車(chē)。盡管這個(gè)操作是相當(dāng)?shù)?CPU密集型的,它往往在非常高的精度的數(shù)據(jù)包傳輸?shù)慕Y(jié)果(經(jīng)常在以下 幾微秒)。請(qǐng)注意,轉(zhuǎn)遞發(fā)送隊(duì)列WinPcap Device.Se ndQueue()能更有效的不是執(zhí)
52、行一系列ICa ptureDevice.Se ndPacket()由于發(fā)送量在內(nèi)核隊(duì)列緩沖交換機(jī)數(shù)量急劇減少的情況。是釋放所有的隊(duì)列發(fā)送緩沖區(qū)當(dāng)不再需要排隊(duì),它可以被刪除的Sen dQueue.Dis pose()與。下一個(gè)程序顯示了如何使用發(fā)送隊(duì)列。它打開(kāi)通過(guò)創(chuàng)建一個(gè)捕獲文件在這一點(diǎn)上,Offli neCa ptureDevice()那么它存儲(chǔ)文件的數(shù)據(jù)包從發(fā)送到正確分配隊(duì)列。它傳輸隊(duì)列同步。請(qǐng)注意,鏈路層的轉(zhuǎn)儲(chǔ)文件是比一的接口,將數(shù)據(jù)包發(fā)送使用Pca pDevice.DataLi nk產(chǎn),并打印一個(gè)警告,如果它們是不同的-這是很重要的捕獲文件的鏈接層是作為適配器的,否則傳輸鏈路層一樣是毫無(wú)意義的:pColla pse |Copy CodeICaptureDevice裝置;嘗試 / /得到一個(gè)脫機(jī)文件pcap的設(shè)備設(shè)備=新 OfflineCa ptureDevice( cap File );/ /打開(kāi)設(shè)備捕捉device.Open();趕上(例外五)Consol
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度特殊教育教師崗位服務(wù)合同3篇
- 2025年度跨境醫(yī)療旅游服務(wù)合同范本2篇
- 二零二五版帶司機(jī)租賃車(chē)輛專(zhuān)業(yè)接送保障合同2篇
- 二零二五年房屋租賃押金退還及延期還款合同3篇
- 二零二五年度美的中央空調(diào)銷(xiāo)售與節(jié)能減排服務(wù)合同4篇
- 2025年環(huán)保工程項(xiàng)目承包合同多4篇
- 2025年度體育賽事贊助與廣告投放合同范本4篇
- 2025年度綜合性碼頭租賃及物流配送合同范本4篇
- 二零二五年度寵物醫(yī)院設(shè)備采購(gòu)合同正本4篇
- 2025年度城市景觀策劃服務(wù)合同4篇
- 2025寒假散學(xué)典禮(休業(yè)式)上校長(zhǎng)精彩講話:以董宇輝的創(chuàng)新、羅振宇的堅(jiān)持、馬龍的熱愛(ài)啟迪未來(lái)
- 安徽省示范高中2024-2025學(xué)年高一(上)期末綜合測(cè)試物理試卷(含答案)
- 安徽省合肥市包河區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期末化學(xué)試題
- 《酸堿罐區(qū)設(shè)計(jì)規(guī)范》編制說(shuō)明
- PMC主管年終總結(jié)報(bào)告
- 售樓部保安管理培訓(xùn)
- 倉(cāng)儲(chǔ)培訓(xùn)課件模板
- 2025屆高考地理一輪復(fù)習(xí)第七講水循環(huán)與洋流自主練含解析
- GB/T 44914-2024和田玉分級(jí)
- 2024年度企業(yè)入駐跨境電商孵化基地合作協(xié)議3篇
- 《形勢(shì)與政策》課程標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論