第9章Winpcap分析與開發_第1頁
第9章Winpcap分析與開發_第2頁
第9章Winpcap分析與開發_第3頁
第9章Winpcap分析與開發_第4頁
第9章Winpcap分析與開發_第5頁
已閱讀5頁,還剩43頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Charpt Charpt 9 9: Winpcap分析與應用分析與應用n雖然Unix 平臺上的BSD 包截獲系統提供了一組供應用程序直接調用的網絡數據包截獲函數,允許應用程序與網卡間直接進行交互, 但在Win32 平臺上, 目前主要使用WinPcap 體系結構。nWinPcap 是基于Win32 平臺的網絡包截獲和分析的系統,它具有豐富的網絡數據包處理函數,其功能比BSD 包截獲系統更強,如“包監視”和“包發送”等功能函數在早先的Unix 平臺上是不具備的。nWinPcap是一個重要的抓包工具,它是libpcap的Windows版本。是一個免費公開的軟件系統。它用于windows系統下的直接

2、的網絡編程。Windows平臺下的包捕獲技術n網絡與協議分析器 (network and protocol analyzers) n網絡監視器 (network monitors) n網絡流量記錄器 (traffic loggers) n網絡流量發生器 (traffic generators) n用戶級網橋及路由 (user-level bridges and routers) n網絡入侵檢測系統 (network intrusion detection systems (NIDS) n網絡掃描器 (network scanners) n安全工具 (security tools) Winpca

3、p特別適用于下面這幾個經典領域:特別適用于下面這幾個經典領域:nWinpcap有些方面不能做: 它不依靠主機的諸如TCP/IP協議去收發數據包。這意味著它不能阻塞,不能處理同一臺主機中各程序之間的通信數據。它只能“嗅探”到物理線路上的數據報。因此它不適用于traffic shapers,QoS調度,以及個人防火墻。 nWinPcap包括三個部分n第一個模塊:內核級的包過濾驅動程序內核級的包過濾驅動程序 NPF(Netgroup Packet Filter),是一個虛擬設備驅動程序文件, 是架構的核心(在Win95/98 中是一個VXD文件,在NT/2000 中是一個SYS 文件) ,它的主要功

4、能是過濾數據包,在包上附加時間戳、數據包長度等信息。n第二個模塊:低級動態鏈接庫低級動態鏈接庫packet.dll,在Win32 平臺上提供了與NPF 的一個通用接口。 packet.dll數據包驅動程序庫是與libpcap 相兼容的一組用戶級的函數庫。n第三個模塊:用戶級的用戶級的Wpcap.dll。通過調用packet.dll 提供的函數生成,它包括了過濾器生成等一系列可以被用戶級調用的高級函數,另外還有諸如數據包統計及發送功能。 WinPcapWinPcap體系結構NPFPacket.dllPacket.dll相關的數據結構相關的數據結構 typedef struct typedef s

5、truct _ADAPTER _ADAPTER * *LPADAPTERLPADAPTER 描述一個網絡適配器。它包含了兩個域: HANDLE hFile TCHAR SymbolicLinkhFile是一個指向驅動器句柄的指針。通過該句柄,我們可以直接與驅動器進行通信,如接收或發送數據包。SymbolicLink是一個字符串,它包含了當前打開的網絡適配器的名稱。 Packet.dllPacket.dll相關的數據結構相關的數據結構typedef structtypedef struct _PACKET _PACKET * *LPPACKETLPPACKET 描述一組網絡數據包的結構。它包含了

6、以下幾個域: OVERLAPPED OverLapped PVOID Buffer UINT Length PVOID ulBytesReceived BOOLEAN bIoComplete OverLapped是用來處理對驅動器的異步調用。Buffer是用來指向緩存的指針,該緩存包含了數據包的數據。Length是該緩存區的大小。而ulBytesReceived表明了該緩存中包含的有效數據的大小。BIoComplete是在異步調用中用來表示該Packet是否包含有效的數據。 Packet.dllPacket.dll相關的數據結構相關的數據結構struct bpf_hdrstruct bpf_h

7、dr 數據報頭部。它包含以下幾個域:nstruct timeval bh_tstampnUNIT bh_caplennUNIT bh_datalennUSHORT bh_hdrlen bh_tstamp是一個時間戳,它包含兩個域:tv_sec和tv_usec,用來表示報文的捕獲時間。bh_caplen是封裝報文后的報文長度。bh_datalen是原始報文長度。bh_hdrlen是封裝報文的報頭長度。 Packet.dllPacket.dll相關的數據結構相關的數據結構 typedef struct NetType NetTypetypedef struct NetType NetType 描述

8、網絡類型的數據結構。 typedef struct npf_if_addr npf_if_addrtypedef struct npf_if_addr npf_if_addr 描述一個網絡適配器的ip地址。 Struct bpf_statStruct bpf_stat 當前捕獲數據報的統計信息Packet.dll相關函數 1 LPPACKET PacketAllocatePacket(void) 如果運行成功,返回一個_PACKET結構的指針,否則返回NULL。成功返回的結果將會傳送到PacketReceivePacket()函數,接收來自驅動的網絡數據報。2 VOID PacketFreeP

9、acket(LPPACKET lpPacket) 釋放參數提供的_PACKET結構。 3 VOID PacketCloseAdapter(LPADAPTER lpAdapter) 關閉參數中提供的網絡適配器,釋放相關的ADAPTER結構。Packet.dll相關函數4 BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize) 返回可以得到的網絡適配器列表及描述。5 BOOLEAN PacketGetNetInfoEx(LPTSTR AdapterNames,npf_ip_addr *buff, PLONG NEntries) 返回某

10、個網絡適配器的全面地址信息。 其中npf_ip_addr結構包含: IPAddress: ip地址 SubnetMask: 子網掩碼 Broadcast: 廣播地址 Packet.dll相關函數 6 BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type) 返回某個網絡適配器的MAC類型。 NetType結構里包含了LinkSpeed(速度)和LinkType(類型)。其中LinkType包含以下幾種情況: NdisMedium802_3: Ethernet(802.3) NdisMediumWan: WAN NdisMe

11、dium802_5: Token Ring(802.5) NdisMediumFddi: FDDI NdisMediumAtm: ATM NdisMediumArcnet878_2: ARCNET(878.2) Packet.dll相關函數7 BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s) 返回幾個關于當前捕獲報告的統計信息。 其中bpf_stat結構包含: bs_recv, bs_drop,ps_ifdrop,bs_capt bs_recv: 從網絡適配器開始捕獲數據報開始所接收到的所有數據報的數目,包括丟

12、失的數據報; bs_drop: 丟失的數據報數目。8 PCHAR PacketGetVersion() 返回關于dll的版本信息。 Packet.dll相關函數9 VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer, UINT Length) 初始化一個_PACKET結構。10 LPADAPTER PacketOpenAdapter(LPTSTR AdapterName) 打開一個網絡適配器。11 BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,B

13、OOLEAN Sync) 從NPF驅動程序讀取網絡數據報及統計信息。 數據報編碼結構: |bpf_hdr|data|Padding|bpf_hdr|data|Padding|Packet.dll相關函數12 BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET lpPacket, BOOLEAN Sync) 發送一個或多個數據報的副本。13 BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim) 設置捕獲數據報的內核級緩沖區大小。Packet.dll相關函數14 BOOLEAN

14、PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter)為接收到的數據報設置硬件過濾規則。 以下為一些典型的過濾規則: NDIS_PACKET_TYPE_PROMISCUOUS: 設置為混雜模式,接收所有流過的數據報; NDIS_PACKET_TYPE_DIRECTED: 只有目的地為本地主機網絡適配器的數據報才會被接收; NDIS_PACKET_TYPE_BROADCAST: 只有廣播數據報才會被接收; NDIS_PACKET_TYPE_MULTICAST: 只有與本地主機網絡適配器相對應的多播數據報才會被接收; NDIS_PACKET_

15、TYPE_ALL_MULTICAST: 所有多播數據報均被接收; NDIS_PACKET_TYPE_ALL_LOCAL: 所有本地數據報均被接收。Packet.dll相關函數15 BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites) 設置調用PacketSendPacket()函數發送一個數據報副本的最大重發次數。16 BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout) 設置讀操作等待時間 。以上介紹的包含了packet.dll里的大部分函數

16、。如果想更深層的了解winpcap,請訪問相關網站,主頁地址: http:/winpcap.polito.itPacket.dll監聽流程圖PacketGetAdapterName() 選擇網卡選擇網卡PacketOpenAdapter() 打開網絡適配器打開網絡適配器PacketSetHwFilter() 設置接收模式(一般設置為混雜模式)設置接收模式(一般設置為混雜模式)PacketSetBpf() 編輯設置過濾規則編輯設置過濾規則PacketSetBuff() 設置核心緩沖區大小設置核心緩沖區大小PacketSetReadTimeout() 設置讀操作等待時間設置讀操作等待時間Packe

17、tAllocatePacket() 設置(分配)用戶緩沖區設置(分配)用戶緩沖區PacketInitPacket() 初始化用戶緩沖區初始化用戶緩沖區PacketReceivePacket() 捕獲網絡數據包捕獲網絡數據包Packet.dll應用步驟基本程序代碼如下:if ( ! ( dwVersion = 0X80000000 & dwWindowsMajorVersion = 4) ) / / Windows NTAdapterLength = sizeof (AdapterName) ;(1)得到網卡名稱if ( PacketGetAdapterNames ( ( PTSTR )

18、 AdapterName ,&AdapterLength) = = FALSE)return FALSE; Packet.dll應用步驟2) 打開指定的網卡lpAdapter = PacketOpenAdapter(AdapterList 0 ) ;if ( ! lpAdapter | | (lpAdapter - hFile = = INVALID_HANDLE_VALUE) )dwErrorCode = GetLastError() ;sprintf ( szErr ,Unable to open the adapter ,error code : %lx,dwErrorCode)

19、 ;AfxMessageBox(szErr) ;return FALSE;Packet.dll應用步驟3) 設置過濾器,將網卡設置為混雜模式,這樣可以監聽流過本機的數據包if ( PacketSetHwFilter ( lpAdapter ,NDIS_PACKET_TYPE_PROMISCUOUS) = = FALSE)return FALSE;4) 設置緩沖區大小if (PacketSetBuff (lpAdapter ,512000) = = FALSE)return FALSE;5) 設置接收一個數據包的超時時間PacketSetReadTimeout ( lpAdapter , 100

20、0) / / set a 1 second read timeout Packet.dll應用步驟6) 為Packet 結構分配內存if ( (lpPacket = PacketAllocatePacket() ) = = NULL)return false ;7) 初始化一個Packet 結構,即將Packet 結構中的buffer 設置為傳遞的buffer 指針.PacketInitPacket (lpPacket , (char 3 ) buffer ,256000)Packet.dll應用步驟8) 從NPF driver 上讀取網絡數據包.while ( ! bStop)if ( Pa

21、cketReceivePacket ( lpAdapter , lpPacket , TRUE) = =FALSE)return FALSE; / / 顯示捕獲數據9) 釋放參數提供的Packet 結構.PacketFreePacket (lpPacket)10) 關閉網卡.PacketCloseAdapter(lpAdapter) wpcap.dll庫函數介紹 nwpcap.dll為包捕獲應用提供了一個高級的編程接口,它是從Libpcap發展而來并且相互兼容,所以wpcap.dll包含了Libpcap具有的函數。另外,由于它還增加了數據包發送和統計等功能,為此增加了以下的函數:pcap_se

22、tbuff:該函數用于設置包驅動器緩沖區的大小,一個適合大小的緩沖區不僅可以減少丟包率,還可以提供包捕獲能力。pcap_setmode:該函數把網絡適配器設置為統計方式。pcap_stats:這個函數用于獲取包捕獲過程的統計數據。 Wpcap為了要與硬件接口,還直接調用了packet.dll提供的函數。 wpcap.dll的相關數據結構 接口地址:struct pcap_addr struct pcap_addr *next; /*指到鏈表的下一個結點*/ struct sockaddr *addr; /*指到sockaddr類型的結構*/ struct sockaddr *netmask;

23、/*指到addr相應的掩碼*/ struct sockaddr *broadaddr; /*addr相應的廣播地址*/ struct sockaddr *dstaddr; /*與addr對應的目標地址, 如非點到點,則為NULL*/ ; wpcap.dll的相關數據結構libpcap dump文件的頭結構:struct pcap_file_header bpf_u_int32 magic;/*/ u_short version_major;/*主版本號*/ u_short version_minor;/*次版本號*/ bpf_int32 thiszone;/*本地時間*/ bpf_u_int3

24、2 sigfigs;/*時間戳*/ bpf_u_int32 snaplen;/*保存一個包中多大的數據*/ bpf_u_int32 linktype;/*數據鏈路類型*/;wpcap.dll的相關數據結構接口數據結構:struct pcap_if struct pcap_if *next; /*本鏈下一個結點*/ char *name; /*設備名稱*/ char *description;/*描述*/ struct pcap_addr *addresses; u_int flags;/*如是一個回路接口, 則設成PCAP_IF_LOOPBACK */; wpcap.dll的相關數據結構dum

25、p file中包的頭結構:struct pcap_pkthdr struct timeval ts;/*時間戳*/ bpf_u_int32 caplen;/*長度*/bpf_u_int32 len;/*捕獲包的長度*/; wpcap.dll的相關數據結構統計數據結構:struct pcap_stat u_int ps_recv;/*網上已傳送的包數*/u_int ps_drop; /*丟棄的包數*/u_int ps_ifdrop;/*接口拒絕的包數,暫不支持*/#ifdef WIN32 u_int bs_capt;/*Win32專用,捕獲的包數*/#endif /* WIN32 */; wpc

26、ap.dll主要函數(1)Int pcap_findalldevs(pcap_if_t * alldevsp, char * errbuf)功能:返回本機所有的網絡接口設備。輸入參數:兩個參數全為空值返回: 失?。悍祷?1,errbuf中包含錯誤信息。 成功:alldevsp中包含全部網絡接口設備。當用戶無法了解自己機器的接口設備時在程序的首部調用該函數。(2)Char *pcat_lookupdev(char *errbuf) 該函數用于返回可被pcap_open_live()或pcap_lookupnet()函數調用的網絡設備名(一個字符串指針)。如果函數出錯,則返回NULL,同時errb

27、uf中存放相關的錯誤消息。 wpcap.dll主要函數(3)int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf) 獲得指定網絡設備的IP地址和掩碼。netp參數和maskp參數都是bpf_u_int32指針。如果函數出錯,則返回-1,同時errbuf中存放相關的錯誤消息。 (4)Pcap_dumper_t *pcap_dump_open(pcap_t *p,char *filename) 打開一個保存數據包的文件,其文件格式是固定的,和tcpdump等文件格式相兼容。wpcap.

28、dll主要函數(5)Pcap_t * pcap_open_live(char * DeviceName,int snaplen,int promisc,int to_ms,char *errbuf)功能:打開一個捕獲接口設備。輸入參數: DeviceName:設備名; snaplen:一個包中截取的字節數; promisc:1雜湊模式,0正常模式; to_ms:時延(毫稱);errbuf:錯誤信息返回:失?。悍祷胤钦龜?,errbuf中包含錯誤信息。成功:捕獲句柄。wpcap.dll主要函數(6)int pcap_compile (pcap_t *p, struct bpf_program *f

29、p, char *str, int optimize, bpf_u_int32 netmask)功能:編譯過濾規則輸入參數: Str規則串; optimize是否優化;返回: 失敗:返回-1。 成功:捕獲句柄wpcap.dll主要函數(7)int pcap_setfilter (pcap_t *p, struct bpf_program *fp)功能:設置過濾器規則輸入參數: fp為指到結構體 bpf_program 的指針, pcap_compile()函數的返回值。返回: 失?。悍祷?1。wpcap.dll主要函數(8)int pcap_dispatch(pcap_t *p, int cn

30、t,pcap_handler callback, u_char *user) 捕獲并處理數據包。cnt參數指定函數返回前所處理數據包的最大值。cnt=-1表示在一個緩沖區中處理所有的數據包。cnt=0表示處理所有數據包,直到產生以下錯誤之一:讀取到EOF;超時讀取。 callback參數指定一個帶有三個參數的回調函數,這三個參數為:typedef void ( *pcap_handler ) ( u_char *agrs, const struct pcap_pkthdr *header, const u_char *packet ); 其中agrs是從pcap_dispatch()函數傳遞過

31、來的第四個形參 ,一般我們自己的包捕捉程序不需要提供它,總是為NULL ;header指向pcap_pkthdr結構,該結構位于真正的物理幀前面,用于消除不同鏈路層支持的差異 ;packet指向所捕獲報文的物理幀。 參數user 為用戶傳遞給回調函數的指針。如果成功則返回讀取到的字節數。讀取到EOF時則返回零值。出錯時則返回-1,此時可調用pcap_perror()或pcap_geterr()函數獲取錯誤消息。 wpcap.dll主要函數(9)Int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user) 功能:循

32、環抓取網絡數據報文。每捕獲到cnt個報文就調用callback用戶函數。 輸入參數:P句柄,cnt每一次抓包數,callback用戶自定義的處理函數,user一般為null。 注:該函數功能基本與pcap_dispatch()函數相同,只不過此函數在cnt個數據包被處理或出現錯誤時才返回,但讀取超時不會返回。而如果為pcap_open_live()函數指定了一個非零值的超時設置,然后調用pcap_dispatch()函數,則當超時發生時pcap_dispatch()函數會返回。cnt參數為負值時pcap_loop()函數將始終循環運行,除非出現錯誤wpcap.dll主要函數(10) pcap_

33、read() 這個函數從包捕獲驅動器中讀取一組數據包并針對每一個包運行包過濾程序,然后把過濾后的數據送應用程序緩沖器u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) 返回指向下一個數據包的u_char指針。 (11)void pcap_close (pcap_t *p)功能:關閉庫。輸入參數:P句柄。(12)Int pcap_setbuff(pcap_t *p,int dim) 用來設置核心層的緩沖區。(13)Int pcap_setmode(pcap_t *p,int mode) 用來設置網卡的工作模式:混雜/非混雜。(14)pcap_s

34、tats():這個函數用于獲取包捕獲過程的統計數據。(15)Int pcap_sendpacket(pcap_t *p,char *buf,int size) 用來發送數據包。(16)FILE *pcap_file(pcap_t *p) 返回被打開文件的文件名。 (17)int pcap_fileno(pcap_t *p) 返回被打開文件的文件描述字號碼wpcap.dll捕獲數據包的調用流程 Pcap_close:關閉庫Pcap_lookupdev:返回設備類型Pcap_open_live/pcap_open_offline:打開設備或文件準備記取數據Pcap_compile:編譯過濾規則Pc

35、ap_setfilter:設備過濾規則Pcap_loop:循環抓取網絡數據報文wpcap.dll捕獲數據包的調用流程n首先調用pcap_lookupdev(char * errbuf) 函數獲得主機上的網絡設備,該函數返回一個指向主機上的網絡設備(如網卡) 的指針;然后調用pcap_open_live (char * device , int snaplen , int promisc , int to_ms , char * ebuf) 函數打開一個網絡設備, 該函數返回一個包捕獲描述符pcap_t。其中, device 是要打開的網絡設備字符串, snaplen 設定捕獲的包的最大長度,

36、promisc 確定接口是否被設為promiscuous(混雜)模式。在網絡監視儀系統中,此參數設為promiscuous模式,以捕捉本地網絡上的所有包。To_ms 設定讀超時的毫秒數, ebuf 用來返回錯誤文本。wpcap.dll捕獲數據包的調用流程n然后調用int pcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)來編譯過濾規則,用int pcap_setfilter (pcap_t *p, struct bpf_program *fp)來設置過濾器規則。n接下來用pcap_loop (pcap_t* p , int cnt , pcap_handler callback , u_char * user) 或pcap_next (pcap_t * p , struct pcap_pkthdr *h)函數捕獲網絡上所有的數據包給應用程序作分析用。n最后用void pcap_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論