| 前言? 隨著網絡入侵的不斷發展,網絡安全變得越來越重要,于是網絡入侵取證系統的研究也變得日益重要。在網絡入侵取證系統中,對網絡上傳送的數據包進行有效的監聽即捕獲包是目前取證的關鍵技術,只有進行高效的數據包捕獲,網絡管理員才能對所捕獲的數據進行一系列的分析,從而進行可靠的網絡安全管理。 1winpcap簡介? WinPcap?是由伯克利分組捕獲庫派生而來的分組捕獲庫,它是在Windows?操作平臺上來實現對底層包的截取過濾。WinPcap?為用戶級的數據包提供了Windows?下的一個平臺。WinPcap?是?BPF?模型和?Libpcap?函數庫在?Windows?平臺下網絡數據包捕獲和網絡狀態分析的一種體系結構,這個體系結構是由一個核心的包過濾驅動程序,一個底層的動態連接庫?Packet.dll?和一個高層的獨立于系統的函數庫?Libpcap?組成。底層的包捕獲驅動程序實際為一個協議網絡驅動程序,通過對?NDIS?中函數的調用為?Win95、Win98、WinNT、和?Win2000?提供一類似于?UNIX?系統下?Berkeley?Packet?Filter?的捕獲和發送原始數據包的能力。Packet.dll?是對這個?BPF?驅動程序進行訪問的?API?接口,同時它有一套符合?Libpcap?接口(UNIX?下的捕獲函數庫)的函數庫。WinPcap的結構圖如圖1。? WinPcap?包括三個部分:第一個模塊NPF(Netgroup?Packet?Filter),是一個虛擬設備驅動程序文件。它的功能是過濾數據包,并把這些數據包原封不動地傳給用戶態模塊,這個過程中包括了一些操作系統特有的代碼。第二個模塊packet.dll為win32平臺提供了一個公共的接口。不同版本的Windows系統都有自己的內核模塊和用戶層模塊。Packet.dll用于解決這些不同。調用Packet.dll的程序可以運行在不同版本的Windows平臺上,而無需重新編譯。?第三個模塊?Wpcap.dll是不依賴于操作系統的。它提供了更加高層、抽象的函數。?? packet.dll和Wpcap.dll:packet.dll直接映射了內核的調用。?Wpcap.dll提供了更加友好、功能更加強大的函數調用。WinPcap的優勢提供了一套標準的抓包接口,與libpcap兼容,可使得原來許多UNIX平臺下的網絡分析工具快速移植過來便于開發各種網絡分析工具,充分考慮了各種性能和效率的優化,包括對于NPF內核層次上的過濾器支持,支持內核態的統計模式,提供了發送數據包的能力。 2、網絡數據包捕獲的原理 以太網(Ethernet)具有共享介質的特征,信息是以明文的形式在網絡上傳輸,當網絡適配器設置為監聽模式(混雜模式,Promiscuous)時,由于采用以太網廣播信道爭用的方式,使得監聽系統與正常通信的網絡能夠并聯連接,并可以捕獲任何一個在同一沖突域上傳輸的數據包。IEEE802.3 標準的以太網采用的是持續 CSMA 的方式,正是由于以太網采用這種廣播信道爭用的方式,使得各個站點可以獲得其他站點發送的數據。運用這一原理使信息捕獲系統能夠攔截的我們所要的信息,這是捕獲數據包的物理基礎。 以太網是一種總線型的網絡,從邏輯上來看是由一條總線和多個連接在總線上的站點所組成各個站點采用上面提到的 CSMA/CD 協議進行信道的爭用和共享。每個站點(這里特指計算機通過的接口卡)網卡來實現這種功能。網卡主要的工作是完成對于總線當前狀態的探測,確定是否進行數據的傳送,判斷每個物理數據幀目的地是否為本站地址,如果不匹配,則說明不是發送到本站的而將它丟棄。如果是的話,接收該數據幀,進行物理數據幀的 CRC 校驗,然后將數據幀提交給LLC 子層。 網卡具有如下的幾種工作模式: 1) 廣播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的幀為廣播幀,工作在廣播模式的網卡接收廣播幀。 2)多播傳送(MultiCast Model):多播傳送地址作為目的物理地址的幀可以被組內的其它主機同時接收,而組外主機卻接收不到。但是,如果將網卡設置為多播傳送模式,它可以接收所有的多播傳送幀,而不論它是不是組內成員。 3)直接模式(Direct Model):工作在直接模式下的網卡只接收目地址是自己 Mac地址的幀。 4)混雜模式(Promiscuous Model):工作在混雜模式下的網卡接收所有的流過網卡的幀,信包捕獲程序就是在這種模式下運行的。 網卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀和發給自己的幀。如果采用混雜模式,一個站點的網卡將接受同一網絡內所有站點所發送的數據包這樣就可以到達對于網絡信息監視捕獲的目的。 3、在windows情況下捕獲數據包的結構 圖2捕獲數據包的結構圖 Wndows下捕獲數據包的結構如圖2,其中NDIS及其特點是: NDIS(Network Driver Interface Specification) 是 Microsoft 和 3Com 公司聯合制定的網絡驅動規范,并提供了大量的操作函數。它為上層的協議驅動提供服務,屏蔽了下層各種網卡的差別。NDIS 向上支持多種網絡協議,比如 TCP/IP、NWLink IPX/SPX、NETBEUI 等,向下支持不同廠家生產的多種網卡。NDIS 還支持多種工作模式,支持多處理器,提供一個完備的 NDIS 庫(Library)。 但庫中所提供的各個函數都是工作在核心模式下的,用戶不宜直接操作,這就需要尋找另外的接口。NDIS驅動程序的結構如圖3。 4、利用winpcap進行網絡數據包的捕獲和過濾的設計步驟 1)打開網卡,并設為混雜模式。 2)回調函數 Network Tap 在得到監聽命令后,從網絡設備驅動程序處收集數據包把監聽到的數據包負責傳送給過濾程序。 3)當 Packet filter 監聽到有數據包到達時,NDIS 中間驅動程序首先調用分組驅動程序,該程序將數據傳遞給每一個參與進程的分組過濾程序。 4)然后由 Packet filter 過濾程序決定哪些數據包應該丟棄,哪些數據包應該接收,是否需要將接收到的數據拷貝到相應的應用程序。 5)通過分組過濾器后,將數據未過濾掉的數據包提交給核心緩沖區。然后等待系統緩沖區滿后,再將數據包拷貝到用戶緩沖區。監聽程序可以直接從用戶緩沖區中讀取捕獲的數據包。 6)關閉網卡。 5、主要源代碼 根據用 Windows 分組捕獲庫 WinPcap 提供功能首先要初始化兩個結構體,一個是適配器的結構體 LpAdapter, 一個是存放接收到的數據包的結構體 RecvPacket。 使用 Packet.dll 動態連接庫編寫源代碼: ? #define MAX__LINK__NAME__LENGTH 64 適配器結構: ?? typedef struct__ADAPTER { ?? HANDLE hFile; ?? TCHAR Symboliclink[MAX__LINK__NAME__LENGTH]; ?? Int NumWrites; ? } ADAPTER , *LPADAPTER; 說明:hFile 是一個指向該網絡適配器 Handle 的指針,通過它可以對網絡適配器進行操作。symboliclink 包含當前打開的網絡適配器的名字。 數據包結構: ? typedef struct _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__Adapter[512]] ? int?????? i=0 ? char????? AdapterNames[512], *tempa,*templa; ? ULONG AdapterLength=1024; } PACKET, *LPPACKET: 2)獲得系統中網絡適配器的名字。 PacketGetAdapterNames(AdapterNamea,&AdapterLength); ? tempa=AdapterNamea; ? templa=Adapternamea; ? while ((*tempa!=’’)∣∣(*tempa-1!=’)) ?{ ??? if (*tempa= =’’) ??? { ????? memcpy(AdapterList[i],temla,tempa-templa);??? //內存數據拷貝 ????? templa=tempa+1; ????? i++ ????? } ?????? tempa++ ??? } 3)從適配器列表中選擇一個默認的 0 號適配器。 LPADAPTER lpAdapter ? lpAdapter = PacketOpenAdapter (AdapterList[0]); ? if (!lpAdapter∣∣(lpAdapter->hFile==INVALID__HANDLE__VALUE)) { ??? dwErrorCode=GetLastError(); ??????? return FALSE; ?} 4)將所選擇的適配器 lpAdapter 設置為混雜模式。 PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS) 5)設置 BPF 內核中包過濾的過濾器的代參政。利用這個函數右以完成對于原始數據包的初始的過濾處理,如根據其中端口號、IP 地址等。 ?PacketSetBpf(LpAdapter AdapterObject,structbpf_program*fp) 6)設置緩沖池為512K字節。 ? PacketSetBuff(lpAdapter,512000); 7)分配一個數據包對象,并連接已分配的緩沖。 ? PacketInitPacket(lpPacket,(char*)bufferReceive,512000); 8)捕獲多個數據包。從網卡 lpAdapter 接收數據包,并將數據包放入 lpPacket所指向的數據包結構體中,若接收成功返回 TRUE,否則返回 FALSE。 ? PacketReceivePacket(lpAdapter,lpPacket,TRUE); 9)通過觸發回調函數,把捕獲符合過濾器規則的數據包轉發給網絡協議分析模塊進行分析處理。 10) 結束接收數據包,釋放數據包對象。 ?if(lpPacket!=NULL ? { ???? PacketFreePacket(lpPacket); ???? lpPacket=NULL; ? } 11)關閉網卡設備,將網卡恢復到正常接收狀態。 ? if(lpAdapter!=NULL ? { ???? PacketCloseAdapter(lpAdapter); ???? lpAdapter=NULL; } 6、結束語 數據包捕獲技術是網絡管理系統的關鍵技術,已經按照標題4中的流程進行了簡單的實現。如果在一個繁忙的網絡上進行截獲,而不設置任何過濾,那得到的數據包是非常多的,可能在一秒鐘內得到上千的數據包。如果應用程序不進行必要的性能優化,那么將會大量的丟失數據包。對捕包性能的優化必不可少,考慮采用多線程來處理數據包。若在程序中建立一個公共的數據包緩沖池,這個緩沖池是一個LILO的隊列。于是在程序中使用三個線程進行操作:一個線程只進行捕獲操作,它將從驅動程序獲得的數據包添加到數據包隊列的頭部;另一個線程只進行過濾操作,它檢查新到的隊尾的數據包,檢查其是否滿足過濾條件,如果不滿足則將其刪除出隊列;最后一個線程進行數據包處理操作,象根據接收的數據包發送新數據包這樣的工作都由它來進行。考慮盡可能少丟失數據包的條件,應該是進行捕獲操作的線程的優先級最高,這樣就可以得到更高的捕包性能。 ?WinPcap是用于網絡封包抓取的一套工具,可適用于32位的操作平臺上解析網絡封包,包含了核心的封包過濾,一個底層動態鏈接庫,和一個高層系統函數庫,及可用來直接存取封包的應用程序界面。? Winpcap是一個免費公開的軟件系統。它用于windows系統下的直接的網絡編程。? 大多數網絡應用程序訪問網絡是通過廣泛使用的套接字。這種方法很容易實現網絡數據傳輸,因為操作系統負責底層的細節(比如協議棧,數據流組裝等)以及提供了類似于文件讀寫的函數接口。? 但是有時,簡單的方法是不夠的。因為一些應用程序需要一個底層環境去直接操縱網絡通信。因此需要一個不需要協議棧支持的原始的訪問網絡的方法。? winpcap適用于下面的開發者:? 1、捕獲原始數據包。不管這個包是發往本地機,還是其他機器之間的交換包。? 2、在數據包被發送到應用程序之前,通過用戶定義的規則過濾。? 3、向網絡發送原始數據包。? 4、對網絡通信量做出統計。? 這些功能依賴于Win32系統內核中的設備驅動以及一些動態鏈接庫。? Winpcap提供了一個強大的編程接口,它很容易地在各個操作系統之間進行移植,也很方便程序員進行開發。? 什么樣的程序需要使用Winpcap? 很多不同的工具軟件使用Winpcap于網絡分析,故障排除,網絡安全監控等方面。Winpcap特別適用于下面這幾個經典領域:? 1、網絡及協議分析? 2、網絡監控? 3、通信日志記錄? 4、traffic generators? 5、用戶級別的橋路和路由? 6、網絡入侵檢測系統(NIDS)? 7、網絡掃描? 8、安全工具? Winpcap有些方面不能做。它不依靠主機的諸如TCP/IP協議去收發數據包。這意味著它不能阻塞,不能處理同一臺主機中各程序之間的通信數據。它只能“嗅探”到物理線路上的數據報。因此它不適用于traffic shapers,QoS調度,以及個人防火墻。? Winpcap內部結構? Winpcap是一個Win32平臺下用于抓包和分析的系統。包括一個內核級別的packet filter,一個底層的DLL(packet.dll)和一個高級的獨立于系統的DLL(Wpcap.dll) 1、捕獲系統要能得到網絡上原始傳輸數據必須繞過協議棧。這就需要一個模快運行于操作系統內核,與網絡設備驅動接口直接打交道。這一部分極端依賴系統,也被認為是一種設備驅動?,F有版本有Windows 85,98,ME,NT 4,2000,Xp。這些驅動提供一些如數據包的捕獲與發送這些基本功能,還提供一些高級的可編程的過濾系統和監控引擎。過濾系統可以約束只捕獲特定的數據包(比如,只捕獲特定主機發送的FTP報文)。監控引擎提供了一種強大但簡單的使用機制去獲得網絡通信的統計荷載數據。? 2、捕獲系統要讓用戶程序使用內核提供的功能必須要有一個編程接口。Winpcap提供了兩個不同的庫:packet.dll 和wpcap.dll。? packet.dll提供一個底層的API,通過這個API可直接訪問網絡設備驅動,而獨立于Microsoft OS.? wpcap.dll是一個高層的強大捕獲程序庫,與Unix下的libpcap兼容。它獨立于下層的網絡硬件和操作系統。 |