




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗6利用WinPcap技術捕獲數據包實驗目的:通過掌握WinPcap函數庫的結構和功能,實現在windows環境下對網卡進行編程,進行網絡數據包的捕獲。實驗準備:(1)winpcap簡介WinPcap 是由伯克利分組捕獲庫派生而來的分組捕獲庫,它是在Windows 操作平臺上來實現對底層包的截取過濾。WinPcap 為用戶級的數據包提供了Windows 下的一個平臺。WinPcap 是 BPF 模型和 Libpcap 函數庫在 Windows 平臺下網絡數據包捕獲和網絡狀態分析的一種體系結構,這個體系結構是由一個核心的包過濾驅動程序,一個底層的動態連接庫 Packet.dll 和一個高層的獨
2、立于系統的函數庫 Libpcap 組成。底層的包捕獲驅動程序實際為一個協議網絡驅動程序,通過對 NDIS 中函數的調用為 Win95、Win98、WinNT、和 Win2000 提供一類似于 UNIX 系統下 Berkeley Packet Filter 的捕獲和發送原始數據包的能力。Packet.dll 是對這個 BPF 驅動程序進行訪問的 API 接口,同時它有一套符合 Libpcap 接口(UNIX 下的捕獲函數庫)的函數庫。WinPcap的結構圖如圖1。WinPcap 包括三個部分:第一個模塊NPF(Netgroup Packet Filter),是一個虛擬設備驅動程序文件。它的功能是
3、過濾數據包,并把這些數據包原封不動地傳給用戶態模塊,這個過程中包括了一些操作系統特有的代碼。第二個模塊packet.dll為win32平臺提供了一個公共的接口。不同版本的Windows系統都有自己的內核模塊和用戶層模塊。Packet.dll用于解決這些不同。調用Packet.dll的程序可以運行在不同版本的Windows平臺上,而無需重新編譯。 第三個模塊 Wpcap.dll是不依賴于操作系統的。它提供了更加高層、抽象的函數。 packet.dll和Wpcap.dll:packet.dll直接映射了內核的調用。 Wpcap.dll提供了更加友好、功能更加強大的函數調用。WinPcap的優勢提供
4、了一套標準的抓包接口,與libpcap兼容,可使得原來許多UNIX平臺下的網絡分析工具快速移植過來便于開發各種網絡分析工具,充分考慮了各種性能和效率的優化,包括對于NPF內核層次上的過濾器支持,支持內核態的統計模式,提供了發送數據包的能力。圖1WinPcap結構圖(2)網絡數據包捕獲的原理以太網(Ethernet)具有共享介質的特征,信息是以明文的形式在網絡上傳輸,當網絡適配器設置為監聽模式(混雜模式,Promiscuous)時,由于采用以太網廣播信道爭用的方式,使得監聽系統與正常通信的網絡能夠并聯連接,并可以捕獲任何一個在同一沖突域上傳輸的數據包。IEEE802.3 標準的以太網采用的是持續
5、 CSMA 的方式,正是由于以太網采用這種廣播信道爭用的方式,使得各個站點可以獲得其他站點發送的數據。運用這一原理使信息捕獲系統能夠攔截的我們所要的信息,這是捕獲數據包的物理基礎。以太網是一種總線型的網絡,從邏輯上來看是由一條總線和多個連接在總線上的站點所組成各個站點采用上面提到的 CSMA/CD 協議進行信道的爭用和共享。每個站點(這里特指計算機通過的接口卡)網卡來實現這種功能。網卡主要的工作是完成對于總線當前狀態的探測,確定是否進行數據的傳送,判斷每個物理數據幀目的地是否為本站地址,如果不匹配,則說明不是發送到本站的而將它丟棄。如果是的話,接收該數據幀,進行物理數據幀的 CRC 校驗,然后
6、將數據幀提交給LLC 子層。網卡具有如下的幾種工作模式:1) 廣播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的幀為廣播幀,工作在廣播模式的網卡接收廣播幀。2)多播傳送(MultiCast Model):多播傳送地址作為目的物理地址的幀可以被組內的其它主機同時接收,而組外主機卻接收不到。但是,如果將網卡設置為多播傳送模式,它可以接收所有的多播傳送幀,而不論它是不是組內成員。3)直接模式(Direct Model):工作在直接模式下的網卡只接收目地址是自己 Mac地址的幀。4)混雜模式(Promiscuous Model):工作在混雜模式下的網卡接收
7、所有的流過網卡的幀,信包捕獲程序就是在這種模式下運行的。網卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發給自己的幀。如果采用混雜模式,一個站點的網卡將接受同一網絡內所有站點所發送的數據包這樣就可以到達對于網絡信息監視捕獲的目的。(3)在windows情況下捕獲數據包的結構圖2捕獲數據包的結構圖Wndows下捕獲數據包的結構如圖2,其中NDIS及其特點是:NDIS(Network Driver Interface Specification) 是 Microsoft 和 3Com 公司聯合制定的網絡驅動規范,并提供了大量的操作函數。它為上層的協議驅動提供服務,屏蔽了下層各種網卡的差
8、別。NDIS 向上支持多種網絡協議,比如 TCP/IP、NWLink IPX/SPX、NETBEUI 等,向下支持不同廠家生產的多種網卡。NDIS 還支持多種工作模式,支持多處理器,提供一個完備的 NDIS 庫(Library)。 但庫中所提供的各個函數都是工作在核心模式下的,用戶不宜直接操作,這就需要尋找另外的接口。NDIS驅動程序的結構如圖3。(4)利用winpcap進行網絡數據包的捕獲和過濾的設計步驟1)打開網卡,并設為混雜模式。2)回調函數 Network Tap 在得到監聽命令后,從網絡設備驅動程序處收集數據包把監聽到的數據包負責傳送給過濾程序。圖3NDIS驅動程序結構3)當 Pac
9、ket filter 監聽到有數據包到達時,NDIS 中間驅動程序首先調用分組驅動程序,該程序將數據傳遞給每一個參與進程的分組過濾程序。4)然后由 Packet filter 過濾程序決定哪些數據包應該丟棄,哪些數據包應該接收,是否需要將接收到的數據拷貝到相應的應用程序。5)通過分組過濾器后,將數據未過濾掉的數據包提交給核心緩沖區。然后等待系統緩沖區滿后,再將數據包拷貝到用戶緩沖區。監聽程序可以直接從用戶緩沖區中讀取捕獲的數據包。6)關閉網卡。(5)主要源代碼根據用 Windows 分組捕獲庫 WinPcap 提供功能首先要初始化兩個結構體,一個是適配器的結構體 LpAdapter, 一個是存
10、放接收到的數據包的結構體 RecvPacket。使用 Packet.dll 動態連接庫編寫源代碼: #define MAX_LINK_NAME_LENGTH 64適配器結構: typedef struct_ADAPTER HANDLE hFile; TCHAR SymboliclinkMAX_LINK_NAME_LENGTH; Int NumWrites; ADAPTER , *LPADAPTER;說明:hFile 是一個指向該網絡適配器 Handle 的指針,通過它可以對網絡適配器進行操作。symboliclink 包含當前打開的網絡適配器的名字。數據包結構: typedef struct
11、_PACKET HANDLE hEvent; OVERLAPPED OverLapped; PVOID Buffer; UINT Length; PVOID Next; UINT ulBytesReceived; BOOLEAN bloComplete; /控制接受包的開始和結束數據包捕獲實現的步驟的主要源代碼:1)要獲得適配器列表。#define Max_Num_Adapter 10 /獲得適配器列表 char Adapterlist Max_Num_Adapter512 int i=0 char AdapterNames512, *tempa,*templa; ULONG AdapterL
12、ength=1024; PACKET, *LPPACKET:2)獲得系統中網絡適配器的名字。PacketGetAdapterNames(AdapterNamea,&AdapterLength); tempa=AdapterNamea; templa=Adapternamea; while (*tempa!=0)(*tempa-1!=0) if (*tempa= =0) memcpy(AdapterListi,temla,tempa-templa); /內存數據拷貝 templa=tempa+1; i+ tempa+ 3)從適配器列表中選擇一個默認的 0 號適配器。LPADAPTER l
13、pAdapter lpAdapter = PacketOpenAdapter (AdapterList0); if (!lpAdapter(lpAdapter->hFile=INVALID_HANDLE_VALUE) dwErrorCode=GetLastError(); return FALSE; 4)將所選擇的適配器 lpAdapter 設置為混雜模式。PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)5)設置 BPF 內核中包過濾的過濾器的代參政。利用這個函數右以完成對于原始數據包的初始的過濾處理,如根據其中端口號、I
14、P 地址等。 PacketSetBpf(LpAdapter AdapterObject,structbpf_program*fp)6)設置緩沖池為字節。 PacketSetBuff(lpAdapter,512000);7)分配一個數據包對象,并連接已分配的緩沖。 PacketInitPacket(lpPacket,(char*)bufferReceive,512000);8)捕獲多個數據包。從網卡 lpAdapter 接收數據包,并將數據包放入 lpPacket所指向的數據包結構體中,若接收成功返回 TRUE,否則返回 FALSE。 PacketReceivePacket(lpAdapter,
15、lpPacket,TRUE);9)通過觸發回調函數,把捕獲符合過濾器規則的數據包轉發給網絡協議分析模塊進行分析處理。10) 結束接收數據包,釋放數據包對象。 if(lpPacket!=NULL PacketFreePacket(lpPacket); lpPacket=NULL; 11)關閉網卡設備,將網卡恢復到正常接收狀態。 if(lpAdapter!=NULL PacketCloseAdapter(lpAdapter); lpAdapter=NULL;數據包捕獲技術是網絡管理系統的關鍵技術,已經按照標題4中的流程進行了簡單的實現。如果在一個繁忙的網絡上進行截獲,而不設置任何過濾,那得到的數據
16、包是非常多的,可能在一秒鐘內得到上千的數據包。如果應用程序不進行必要的性能優化,那么將會大量的丟失數據包。對捕包性能的優化必不可少,考慮采用多線程來處理數據包。若在程序中建立一個公共的數據包緩沖池,這個緩沖池是一個LILO的隊列。于是在程序中使用三個線程進行操作:一個線程只進行捕獲操作,它將從驅動程序獲得的數據包添加到數據包隊列的頭部;另一個線程只進行過濾操作,它檢查新到的隊尾的數據包,檢查其是否滿足過濾條件,如果不滿足則將其刪除出隊列;最后一個線程進行數據包處理操作,象根據接收的數據包發送新數據包這樣的工作都由它來進行。考慮盡可能少丟失數據包的條件,應該是進行捕獲操作的線程的優先級最高,這樣
17、就可以得到更高的捕包性能。實驗步驟通過java程序也可以獲取網卡的數據包,具體使用開源的WinPcap,jNetPcap;jNetPcap是對接了WinPcap來截獲網卡數據包。一、截獲網卡步驟:1、電腦上安裝WinPcap; 2、下載jNetPcap,解壓后得到所要用的jnetpcap.jar,jnetpcap.dll文件;3、在eclipse中新建工程,把jnetpcap.jar加入library,編寫Java代碼實現網卡截包。二、Java代碼import java.util.ArrayList;import java.util.List;import org.jnetpcap.Pcap;
18、import org.jnetpcap.PcapIf;import org.jnetpcap.packet.JPacket;import org.jnetpcap.packet.JPacketHandler;import tocol.tcpip.Http;import tocol.tcpip.Tcp;public class Application public static void main(String args) throws InterruptedException List<PcapIf> alldevs
19、= new ArrayList<PcapIf>(); / Will be filled with/ NICsStringBuilder errbuf = new StringBuilder();int r = Pcap.findAllDevs(alldevs, errbuf);if (r = Pcap.NOT_OK | alldevs.isEmpty() System.err.printf("Can't read list of devices, error is %s",errbuf.toString();return;for (PcapIf pif
20、: alldevs) System.out.println(pif.getName();PcapIf pif = alldevs.get(0);/ select the device which you want to/ monitorint snaplen = 64 * 1024; / Capture all packets, no trucationint flags = Pcap.MODE_PROMISCUOUS; / capture all packetsint timeout = 10 * 1000; / 10 seconds in millisPcap pcap = Pcap.openLive(pif.getName(), snaplen, flags, timeout,errbuf);if (pcap = null) System.err.printf("Error while opening device for capture: "+ errbuf.toString();return;pcap.loop(Pcap.LOOP_INFINITE, new JPacketHandler<StringBuilder>() fin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銅冶煉過程中的環保設備研發進展預測分析研究考核試卷
- 金屬加工中的金屬加工設備維護管理信息系統考核試卷
- 礦石催化反應與催化機理考核試卷
- 銀冶煉中的冶煉廠智能化改造與生產調度考核試卷
- 針織品生產計劃與優化考核試卷
- 外科縫合穿針教學
- 口腔護士職業實踐心得
- 麻醉科每月醫療質量控制
- 冷菜制作的衛生與安全
- 妊娠高血壓疾病查房要點
- 大學語文試題及答案安徽
- 近七年寧夏中考化學真題及答案2024
- 2025至2030中國芳綸纖維行業需求預測及發展前景趨勢研究報告
- 十一學校小升初入學測試數學真題及詳細解答
- Braden 壓力性損傷評分表詳解
- 婚內賭博欠債協議書范本
- 造價咨詢項目管理制度
- 徐圩港區疏港航道整治工程報告書
- XX公司事故隱患內部報告獎勵制度1
- 兒童重癥肺炎護理常規
- 裝飾裝修施工方案
評論
0/150
提交評論