《第四章-winpcap編程》由會(huì)員分享,可在線閱讀,更多相關(guān)《第四章-winpcap編程(17頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、,#,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Winpcap,編程,網(wǎng)絡(luò)軟件設(shè)計(jì),趙,洪,zh,緒論內(nèi)容,Winpcap,概述,1,Winpcap,資源,2,Winpcap,編程詳解,3,Winpcap,概述,提供抓包和網(wǎng)絡(luò)監(jiān)控功能的庫(kù)。,開(kāi)放源碼,免費(fèi)。,官方站點(diǎn):,www.winpcap.org/,Winpcap,資源,安裝包,SDK,庫(kù)(,lib,,,dll,),頭文件,文檔,例子代碼,Winpca
2、p,編程詳解,Winpcap,編程環(huán)境設(shè)定,Winpcap,例子(,IP,包解析),Winpcap,編程環(huán)境設(shè)定,包含,pcap.h,文件,預(yù)處理定義中需要加入,WPCAP,的定義,鏈接,wpcap.lib,庫(kù),連接,ws2_32.lib,庫(kù),設(shè)定方法,要添加一個(gè)預(yù)處理定義,你需要打開(kāi),Project,菜單,選擇,Settings,,,然后選擇,C/C+,選項(xiàng)卡,在,General,類(lèi)下,你必須在,Preprocessor Definitions,下的文本框中添加定義。,要在一個(gè),VC+6.0,工程中,添加一個(gè)新的庫(kù),你必須打開(kāi),Project,菜單,選擇,Settings,,,然后選擇,Li
3、nk,選項(xiàng)卡,然后把新庫(kù)的名字添加到,Object/Library modules,下的文本框中,要向,VC+6.0,中添加一個(gè)新的庫(kù)所在的路徑,你必須打開(kāi),Tool,菜單,選擇,Options,,,然后選擇,Directories,選項(xiàng)卡,在,Show directories,下拉框中選擇,Library files,,,并且將新的路徑添加到,Directories,中去,要向,VC+6.0,中添加一個(gè)新的包含文件所在的路徑,你必須打開(kāi),Tool,菜單,選擇,Options,,,然后選擇,Directories,選項(xiàng)卡,在,Show directories,下拉框中選擇,Include fi
4、les,,,并且將新的路徑添加到,Directories,中去,Winpcap,基本步驟,固定步驟:,獲得已連接的網(wǎng)絡(luò)適配器列表,打開(kāi)適配器捕獲數(shù)據(jù)包,回調(diào)函數(shù)方式,非回調(diào)函數(shù)方式,可選步驟:,過(guò)濾數(shù)據(jù)包,輸出到,dump,文件,發(fā)送數(shù)據(jù)包,pcap_findalldevs,函數(shù),int pcap_findalldevs(,pcap_if_t*alldevsp,char*errbuf,),功能:,得到網(wǎng)絡(luò)設(shè)備(網(wǎng)卡)列表。,參數(shù):,alldevsp,(OUT),:鏈表,指向,pcap_if_t,結(jié)構(gòu),鏈表中包含了網(wǎng)絡(luò)設(shè)備的信息。,errbuf,(OUT),:錯(cuò)誤信息返回。,返回值:,成功返回,
5、0,,失敗返回,-1,,在,errbuf,中有錯(cuò)誤信息提示。,pcap_if_t,結(jié)構(gòu),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,c
6、har*,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,PCA
7、P_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),功能:,打開(kāi)網(wǎng)絡(luò)設(shè)備。,參數(shù):,device(IN),:設(shè)備名。,snaplen(IN),:指定保留數(shù)據(jù)包的最大長(zhǎng)度。,promisc(IN
8、),:制定網(wǎng)卡工作模式,非,0,。,to_ms(IN),:讀超時(shí)時(shí)間。,errbuf,(OUT),:錯(cuò)誤信息返回。,返回值:,成功返回,0,,失敗返回,-1,,在,errbuf,中有錯(cuò)誤信息提示。,pcap_loop,函數(shù),int pcap_loop(,pcap_t*p,int cnt,pcap_handler callback,u_char*user),功能:,抓取數(shù)據(jù)包,并調(diào)用回調(diào)函數(shù)做處理。,參數(shù):,pcap_t,(IN),:設(shè)備指針。,cnt(IN),:定義抓包的數(shù)量,,0,表示無(wú)限。,callback,(IN),:數(shù)據(jù)包處理函數(shù)的指針。,user,(IN),:用戶參數(shù),可以傳給包處理
9、回調(diào)函數(shù)。,返回值:,成功返回,0,,小于,0,表示出錯(cuò)。,回調(diào)函數(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ù)據(jù)包頭,非協(xié)議包頭。,const u_char*pkt_data,:數(shù)據(jù)包。,流程總結(jié),枚舉網(wǎng)絡(luò)設(shè)備,pcap_findalldevs,打開(kāi)網(wǎng)絡(luò)設(shè)備,pcap_open,循環(huán)抓包,pc
10、ap_loop,包處理回調(diào)函數(shù),pcap_next_ex,函數(shù),int pcap_next_ex(,pcap_t*p,struct pcap_pkthdr*pkt_header,const u_char*pkt_data,),功能:,抓取數(shù)據(jù)包,并調(diào)用回調(diào)函數(shù)做處理。,參數(shù):,p(IN),:設(shè)備指針。,pkt_header(OUT),:,winpcap,包頭。,pkt_data,(OUT),:包數(shù)據(jù)。,返回值:,1,表示成功抓包,,0,表示超時(shí),小于,0,表示出錯(cuò)。,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!,結(jié)束頁(yè),