WinPcap學習筆記

2008年05月09日 星期五 下午 05:33
這是上學期上的《網絡編程實踐》課上,老師提供的學習文檔。基本上算比較基礎的內容了。第三部分有一些源代碼,發過來的時候我刪掉了,都是WinPcap官方提供的文檔裏面的例子,官方文檔的內容其實已經非常完整了,如果英文看不懂的話,網上搜索一下也有中文的版本。把官方文檔的教程看完了也就能掌握基本的了。

——————————————————————————————————————————————————————

一、什麼是WINPCAP
winpcap(windows packet capture)是windows平臺下一個免費、開源、公共的網絡訪問系統。開發winpcap這個項目的目的在於爲win32應用程序提供訪問網絡底層的能力。它的主要功能是進行數據包捕獲和網絡分析。它允許應用程序通過協議棧捕獲和傳輸網絡數據包,也包括內核級別的數據包過濾、網絡靜態引擎和支持遠程數據包捕獲等有用的功能。它提供了以下的各項功能:
1> 捕獲原始數據報,包括在共享網絡上各主機發送/接收的以及相互之間交換的數據報;
2> 在數據報發往應用程序之前,按照自定義的規則將某些特殊的數據報過濾掉;
3> 在網絡上發送原始的數據報;
4> 收集網絡通信過程中的統計信息。
winpcap的主要功能在於獨立於主機協議(如TCP-IP)而發送和接收原始數據報。也就是說,winpcap不能阻塞,過濾或控制其他應用程序數據報的發收,它僅僅只是監聽共享網絡上傳送的數據報。因此,它不能用於QoS調度程序或個人防火牆。
目前,winpcap開發的主要對象是windows NT/2000/XP,這主要是因爲在使用winpcap的用戶中只有一小部分是僅使用windows 95/98/Me,並且M$也已經放棄了對win9x的開發。因此本文相關的程序T-ARP也是面向NT/2000/XP用戶的。其實winpcap中的面向9x系統的概念和NT系統的非常相似,只是在某些實現上有點差異,比如說9x只支持ANSI編碼,而NT系統則提倡使用Unicode編碼。
WinPcap由兩部分組成:
驅動程序: 擴展操作系統功能提供低層次的網絡訪問
動態鏈接庫:運行在Win32平臺上的應用程序可以非常方便地訪問網絡低層次的數據。
Ethereal是大名鼎鼎的捕獲數據包專業軟件,它的運行是在WinPcap的支持之下的,如果沒有安裝WinPcap,Ethereal也無法正常捕獲數據包。

二、WINPCAP編程環境設置

在正式WinPcap編程之前,要配置運行環境。
1、運行環境設置
Win32 平臺下WinPcap應用程序需要以下四個動態鏈接庫才能正常運行:wpcap.dll Packet.dll WanPacket.dll pthreadVC.dll
這四個動態鏈接庫在WinPcap驅動程序裏。
如果沒有這個驅動程序,需要到WinPcap官方網站上下載,下載地址爲:www.WinPcap.org
如果應用程序出現一下提示,那就是沒有安裝驅動程序的原因了。
也可以不安裝WinPcap驅動程序。但是需要把上面提到的四個動態鏈接庫文件拷貝到系統分區/WINDOWS/system32目錄下。(似乎有些問題)

2、配置編程環境。
1> 從WWW.WINPCAP.ORG上下載WINPCAP SDK -WpdPack,WinPcap SDk裏面包含庫文件,頭文件,文檔文件和一些例子。解壓到一個指定的目錄。解壓縮後把Include目錄添加到IDE的包含文件中(VC6.0 Tools->Option->Directory; VS 2003/2005 工具->選項->項目和解決方案/項目->VC++目錄); lib目錄添加爲新的庫文件目錄(VC6.0 Tools->Option->Directory; VS 2003/2005 工具->選項->項目和解決方案/項目->VC++目錄)如下圖所示。

2> 如果一個源文件使用了WinPcap提供的庫函數,那麼就需要在該文件開始的位置添加pcap.h包含文件(或者在引用的文件中),即#include “pcap.h”
也許會出現下面的錯誤:
fatal error C1083: 無法打開包括文件:“pcap.h”: No such file or directory
這個錯誤表明找不到pcap.h文件,這個頭文件在驅動程序安裝完成後也是沒有的,它是開發包裏面的一個頭文件,所以,如果要運行程序還需要到官方網站上去下載WinPcap SDK,並按步驟1添加到項目中。

3> 在程序中添加wpcap.lib。如果出現下面錯誤
error LNK2019: 無法解析的外部符號_pcap_findalldevs_ex,該符號在函數XXX 中被引用,如果發生上面的錯誤就表明缺少庫文件,需要添加wpcap.lib到工程中(VC6.0 Project->Settings->Link->Object/library modules; VS 2003/2005 項目->添加現有項->所有文件)如下圖所示:

4> 新的版本里WinPcap支持遠程數據包獲取,所以還應當添加一個頭文件remote-ext.h ,即#include "remote-ext.h"(記住這條語句要放在#include “pcap.h”之後,否則會出錯!)
否則會發生下面的錯誤
error C2065: “PCAP_SRC_IF_STRING”: 未聲明的標識符
error C3861: “pcap_findalldevs_ex”: 找不到標識符
error C2065: “PCAP_OPENFLAG_PROMISCUOUS”: 未聲明的標識符
error C3861: “pcap_open”: 找不到標識符

5> 或者不用添加#include "remote-ext.h".在VC.NET提供的IDE環境中,可以通過執行“項目”菜單中的的“屬性”進入該項目的屬性配置頁,通過選擇“配置屬性”樹中的“C/C++預處理哭”選項就增加’WPCAP’和’HAVE_REMOTE’兩個標號。如下圖所示:
6> 如果還有問題,可以到WinPcaP官方網站上找FAQ。

三、WINPCAP編程入門
利用WINPCAP捕獲數據包一般要經過以下幾個步驟
1、獲取網絡接口列表
通常, 一個基於WinPcap的應用程序所要做的第一件事, 就是獲得適合的網絡接口的列表.pcap_findalldevs()(或者pcap_findalldevs_ex())函數就是幹這活的: 這個函數返回一個pcap_if結構的列表, 每個元素都記錄了一個接口的信息. 其中, name和description以人類可以閱讀的形式, 記錄了設備的信息.
2、獲取設備的高級信息
WinPcap 也可以爲我們提供關於接口的更多信息. 由 pcap_findalldevs() 函數返回的 pcap_if 結構也包含了一個 pcap_addr 結構的列表, 它記錄了以下信息:
1. 接口的地址列表
2. 接口的掩碼列表 (與地址列表一一對應)
3. 接口的廣播地址列表 (與地址列表一一對應)
4. 目標地址列表 (與地址列表一一對應)
3、打開一個接口並捕捉流量
現在我們已經知道如何獲取一個接口的有關信息了, 我們可以來點真傢伙了 -- 打開一個接口並捕捉流量. 接下來我們會編譯一個程序, 它將捕捉網絡中所有的數據包並輸出他們的一些相關信息。我們使用函數 pcap_open_live() 來打開一個捕捉設備. 這裏, 我們需要解釋一下 snaplen, promisc 和 to_ms 參數.
函數原型: pcap_t * pcap_open_live (char *device, int snaplen, int promisc, int to_ms, char *ebuf)
"snaplen" 參數指定了要捕捉的數據包的部分. 在某些操作系統中 (如 xBSD 和 Win32), 驅動程序提供了只捕捉每個數據包其中一部分的可能性: 這樣就降低了要處理的數據的量, 從而提高了捕捉程序的效率. 在例子中, 我們使用一個高出 MTU 最大值的值 (65536) 以確保可以捕捉到成個數據包.
"promisc" =1表明接口將會被設置爲混雜模式. 一般情況下, 接口只處理目標地址爲自己的數據; 到其他主機的數據包將會被忽略. 然而當一個接口處於混雜模式時, 它將會處理全部的流量: 也就是說, 在共享媒介, 例如非交換型以太網 (比如基於集線器的網絡 )中, WinPcap 可以捕捉到所有主機的數據包. 混在模式是多數捕捉程序的默認模式, 所以我們在例子中也採用這種模式.
"to_ms" 用以設置超時, 單位是毫秒. 一個從接口讀取 ( Y- 捕捉) 的操作, (例如 pcap_dispatch() 或者 pcap_next_ex()), 如果沒有捕捉到數據包, 那麼在超過指定的時間以後就會返回. 進一步說, 如果接口處在靜態模式中, to_ms 也定義了靜態報告的間隔時間 (參閱 "Gathering Statistics on the network traffic " 以獲取更多信息). 設置 to_ms 爲 0, 則說明永遠不會超時, 如果沒有數據包到達, 那麼捕捉操作將會永遠不會返回, 而將其值設置爲 -1 則會立刻返回.
發佈了15 篇原創文章 · 獲贊 20 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章