(转)wincap抓包原理
生活随笔
收集整理的這篇文章主要介紹了
(转)wincap抓包原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
?
?
?
前言?? 源地址:http://bbs.eeworld.com.cn/thread-374621-1-1.html
隨著網絡入侵的不斷發展,網絡安全變得越來越重要,于是網絡入侵取證系統的研究也變得日益重要。在網絡入侵取證系統中,對網絡上傳送的數據包進行有效的監聽即捕獲包是目前取證的關鍵技術,只有進行高效的數據包捕獲,網絡管理員才能對所捕獲的數據進行一系列的分析,從而進行可靠的網絡安全管理。 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!=’/0’)∣∣(*tempa-1!=’/0))
{
??? if (*tempa= =’/0’)
??? {
????? memcpy(AdapterList,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的隊 列。于是在程序中使用三個線程進行操作:一個線程只進行捕獲操作,它將從驅動程序獲得的數據包添加到數據包隊列的頭部;另一個線程只進行過濾操作,它檢查 新到的隊尾的數據包,檢查其是否滿足過濾條件,如果不滿足則將其刪除出隊列;最后一個線程進行數據包處理操作,象根據接收的數據包發送新數據包這樣的工作 都由它來進行。考慮盡可能少丟失數據包的條件,應該是進行捕獲操作的線程的優先級最高,這樣就可以得到更高的捕包性能。
隨著網絡入侵的不斷發展,網絡安全變得越來越重要,于是網絡入侵取證系統的研究也變得日益重要。在網絡入侵取證系統中,對網絡上傳送的數據包進行有效的監聽即捕獲包是目前取證的關鍵技術,只有進行高效的數據包捕獲,網絡管理員才能對所捕獲的數據進行一系列的分析,從而進行可靠的網絡安全管理。 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!=’/0’)∣∣(*tempa-1!=’/0))
{
??? if (*tempa= =’/0’)
??? {
????? memcpy(AdapterList,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的隊 列。于是在程序中使用三個線程進行操作:一個線程只進行捕獲操作,它將從驅動程序獲得的數據包添加到數據包隊列的頭部;另一個線程只進行過濾操作,它檢查 新到的隊尾的數據包,檢查其是否滿足過濾條件,如果不滿足則將其刪除出隊列;最后一個線程進行數據包處理操作,象根據接收的數據包發送新數據包這樣的工作 都由它來進行。考慮盡可能少丟失數據包的條件,應該是進行捕獲操作的線程的優先級最高,這樣就可以得到更高的捕包性能。
總結
以上是生活随笔為你收集整理的(转)wincap抓包原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 名表依波路borel_依波路手表排名 依
- 下一篇: arm linux vi键盘错乱,Ubu