第四章-winpcap編程
,#,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Winpcap,編程,網絡軟件設計,趙,洪,zh,緒論內容,Winpcap,概述,1,Winpcap,資源,2,Winpcap,編程詳解,3,Winpcap,概述,提供抓包和網絡監(jiān)控功能的庫。,開放源碼,免費。,官方站點:,www.winpcap.org/,Winpcap,資源,安裝包,SDK,庫(,lib,,,dll,),頭文件,文檔,例子代碼,Winpcap,編程詳解,Winpcap,編程環(huán)境設定,Winpcap,例子(,IP,包解析),Winpcap,編程環(huán)境設定,包含,pcap.h,文件,預處理定義中需要加入,WPCAP,的定義,鏈接,wpcap.lib,庫,連接,ws2_32.lib,庫,設定方法,要添加一個預處理定義,你需要打開,Project,菜單,選擇,Settings,,,然后選擇,C/C+,選項卡,在,General,類下,你必須在,Preprocessor Definitions,下的文本框中添加定義。,要在一個,VC+6.0,工程中,添加一個新的庫,你必須打開,Project,菜單,選擇,Settings,,,然后選擇,Link,選項卡,然后把新庫的名字添加到,Object/Library modules,下的文本框中,要向,VC+6.0,中添加一個新的庫所在的路徑,你必須打開,Tool,菜單,選擇,Options,,,然后選擇,Directories,選項卡,在,Show directories,下拉框中選擇,Library files,,,并且將新的路徑添加到,Directories,中去,要向,VC+6.0,中添加一個新的包含文件所在的路徑,你必須打開,Tool,菜單,選擇,Options,,,然后選擇,Directories,選項卡,在,Show directories,下拉框中選擇,Include files,,,并且將新的路徑添加到,Directories,中去,Winpcap,基本步驟,固定步驟:,獲得已連接的網絡適配器列表,打開適配器捕獲數(shù)據包,回調函數(shù)方式,非回調函數(shù)方式,可選步驟:,過濾數(shù)據包,輸出到,dump,文件,發(fā)送數(shù)據包,pcap_findalldevs,函數(shù),int pcap_findalldevs(,pcap_if_t*alldevsp,char*errbuf,),功能:,得到網絡設備(網卡)列表。,參數(shù):,alldevsp,(OUT),:鏈表,指向,pcap_if_t,結構,鏈表中包含了網絡設備的信息。,errbuf,(OUT),:錯誤信息返回。,返回值:,成功返回,0,,失敗返回,-1,,在,errbuf,中有錯誤信息提示。,pcap_if_t,結構,struct pcap_if,struct pcap_if*next;,char*name;,char*description;,struct pcap_addr*addresses;,bpf_u_int32 flags;,;,typedef struct pcap_if pcap_if_t;,pcap_if,*,next,if not NULL,a pointer to the next element in the list;NULL for the last element of the list,char*,name,a pointer to a string giving a name for the device to pass to,pcap_open_live(),char*,description,if not NULL,a pointer to a string giving a human-readable description of the device,pcap_addr,*,addresses,a pointer to the first element of a list of addresses for the interface,u_int,flags,PCAP_IF_ interface flags.Currently the only possible flag is,PCAP_IF_LOOPBACK,that is set if the interface is a loopback interface.,pcap_open,函數(shù),pcap_t*pcap_open_live(,const char*device,int snaplen,int promisc,int to_ms,char*errbuf),功能:,打開網絡設備。,參數(shù):,device(IN),:設備名。,snaplen(IN),:指定保留數(shù)據包的最大長度。,promisc(IN),:制定網卡工作模式,非,0,。,to_ms(IN),:讀超時時間。,errbuf,(OUT),:錯誤信息返回。,返回值:,成功返回,0,,失敗返回,-1,,在,errbuf,中有錯誤信息提示。,pcap_loop,函數(shù),int pcap_loop(,pcap_t*p,int cnt,pcap_handler callback,u_char*user),功能:,抓取數(shù)據包,并調用回調函數(shù)做處理。,參數(shù):,pcap_t,(IN),:設備指針。,cnt(IN),:定義抓包的數(shù)量,,0,表示無限。,callback,(IN),:數(shù)據包處理函數(shù)的指針。,user,(IN),:用戶參數(shù),可以傳給包處理回調函數(shù)。,返回值:,成功返回,0,,小于,0,表示出錯。,回調函數(shù)定義,typedef void(*),pcap_handler,(,u_char*user,const struct,pcap_pkthdr,*pkt_header,const u_char*pkt_data,),u_char*user,:用戶參數(shù)。,const struct,pcap_pkthdr,*pkt_header,:,winpcap,數(shù)據包頭,非協(xié)議包頭。,const u_char*pkt_data,:數(shù)據包。,流程總結,枚舉網絡設備,pcap_findalldevs,打開網絡設備,pcap_open,循環(huán)抓包,pcap_loop,包處理回調函數(shù),pcap_next_ex,函數(shù),int pcap_next_ex(,pcap_t*p,struct pcap_pkthdr*pkt_header,const u_char*pkt_data,),功能:,抓取數(shù)據包,并調用回調函數(shù)做處理。,參數(shù):,p(IN),:設備指針。,pkt_header(OUT),:,winpcap,包頭。,pkt_data,(OUT),:包數(shù)據。,返回值:,1,表示成功抓包,,0,表示超時,小于,0,表示出錯。,IP,包解析,typedef struct IPHeader,BYTE Ver_Hlen;,BYTE TOS;,WORD TatalLen;,WORD ID;,WORD Flag_Segment;,BYTE TTL;,BYTE Protocol;,WORD Checksum;,ULONG SrcIP;,ULONG DstIP;,IPHeader;,Thank You!,結束頁,