使用WinPcap編寫(xiě)Sniffer程序_第1頁(yè)
使用WinPcap編寫(xiě)Sniffer程序_第2頁(yè)
使用WinPcap編寫(xiě)Sniffer程序_第3頁(yè)
使用WinPcap編寫(xiě)Sniffer程序_第4頁(yè)
使用WinPcap編寫(xiě)Sniffer程序_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、使用WinPcap編寫(xiě)Sniffer程序內(nèi)容介紹嗅探器原理嗅探器原理Winpcap介紹介紹Winpcap安裝安裝Winpcap應(yīng)用程序結(jié)構(gòu)應(yīng)用程序結(jié)構(gòu)Sniffer(嗅探器)設(shè)計(jì)原理(嗅探器)設(shè)計(jì)原理 通常的套接字程序只能響應(yīng)與自己硬件地址相匹配的或是以廣播形式發(fā)出的數(shù)據(jù)幀,對(duì)于其他形式的數(shù)據(jù)幀,比如已到達(dá)網(wǎng)絡(luò)接口但卻不是發(fā)給此地址的數(shù)據(jù)幀,網(wǎng)絡(luò)接口在驗(yàn)證投遞地址并非自身地址之后將不引起響應(yīng),也就是說(shuō)應(yīng)用程序無(wú)法收取到達(dá)的數(shù)據(jù)包。網(wǎng)絡(luò)嗅探器的目的恰恰在于從網(wǎng)卡接收所有經(jīng)過(guò)它的數(shù)據(jù)包,這些數(shù)據(jù)包既可以是發(fā)給本機(jī)的也可以是發(fā)往別處的。通過(guò)將網(wǎng)絡(luò)接口設(shè)置為混雜模式可以使它接收所有經(jīng)過(guò)它的數(shù)據(jù)包(例如

2、以太網(wǎng)幀將會(huì)到達(dá)同一局域網(wǎng)的所有網(wǎng)絡(luò)接口)。 但是,此時(shí)操作系統(tǒng)不再行底層的細(xì)節(jié)操作(協(xié)議處理,流量均衡等) ,而是將拆封解釋處理接收到的數(shù)據(jù)幀(frame)的任務(wù)交給應(yīng)用程序完成,這樣應(yīng)用程序就可以靈活的獲取各類(lèi)信息。什么是什么是 Winpcap 網(wǎng)絡(luò)數(shù)據(jù)包捕獲庫(kù)函數(shù)網(wǎng)絡(luò)數(shù)據(jù)包捕獲庫(kù)函數(shù)直接訪問(wèn)網(wǎng)絡(luò),免費(fèi)、公用直接訪問(wèn)網(wǎng)絡(luò),免費(fèi)、公用工作于驅(qū)動(dòng)層,網(wǎng)絡(luò)操作高效工作于驅(qū)動(dòng)層,網(wǎng)絡(luò)操作高效為應(yīng)用程序提供了一組為應(yīng)用程序提供了一組APIAPI接口接口編程容易,編程容易,源碼級(jí)移植方便源碼級(jí)移植方便Libpcap(UNIX)庫(kù)Winpcap(Windows)庫(kù)Winpcap介紹WinPcap主要功能

3、主要功能捕獲原始數(shù)據(jù)包捕獲原始數(shù)據(jù)包將數(shù)據(jù)包發(fā)送給應(yīng)用程序之前,按將數(shù)據(jù)包發(fā)送給應(yīng)用程序之前,按照用戶(hù)規(guī)定的規(guī)范過(guò)濾數(shù)據(jù)包照用戶(hù)規(guī)定的規(guī)范過(guò)濾數(shù)據(jù)包將捕獲到的數(shù)據(jù)包輸出到文件中,將捕獲到的數(shù)據(jù)包輸出到文件中,并可以對(duì)這些文件進(jìn)行再分析并可以對(duì)這些文件進(jìn)行再分析向網(wǎng)絡(luò)發(fā)送原始數(shù)據(jù)包向網(wǎng)絡(luò)發(fā)送原始數(shù)據(jù)包搜集網(wǎng)絡(luò)傳輸統(tǒng)計(jì)數(shù)據(jù)搜集網(wǎng)絡(luò)傳輸統(tǒng)計(jì)數(shù)據(jù)Winpcap介紹哪些應(yīng)用適合使用哪些應(yīng)用適合使用 WinPcap 網(wǎng)絡(luò)和協(xié)議分析network and protocol analyzers 網(wǎng)絡(luò)監(jiān)控network monitors 流量記錄traffic loggers 流量產(chǎn)生traffic gener

4、ators 用戶(hù)級(jí)網(wǎng)橋和路由器user-level bridges and routers 網(wǎng)絡(luò)入侵檢測(cè)network intrusion detection systems (NIDS) 網(wǎng)絡(luò)掃描network scanners 安全工具security toolsWinpcap介紹WinPcap不能勝任的事情不能勝任的事情 WinPcap從主機(jī)的協(xié)議(如從主機(jī)的協(xié)議(如TCP/IP)獨(dú))獨(dú)立收發(fā)數(shù)據(jù)包。這意味著它不能阻塞、過(guò)立收發(fā)數(shù)據(jù)包。這意味著它不能阻塞、過(guò)濾或者處理同一主機(jī)上其他程序產(chǎn)生的數(shù)濾或者處理同一主機(jī)上其他程序產(chǎn)生的數(shù)據(jù)包:它僅僅嗅探網(wǎng)線上傳輸?shù)臄?shù)據(jù)包。據(jù)包:它僅僅嗅探網(wǎng)線上傳

5、輸?shù)臄?shù)據(jù)包。所以它不適合應(yīng)用于流量均衡、所以它不適合應(yīng)用于流量均衡、QoS調(diào)度調(diào)度和個(gè)人防火墻。和個(gè)人防火墻。 Winpcap介紹Winpcap的安裝的安裝 下載安裝包和開(kāi)發(fā)包下載安裝包和開(kāi)發(fā)包 http:/winpcap.polito.it Winpcap的安裝包(Winpcap_3_1.exe) 程序員開(kāi)發(fā)包(WpdPack_3_1.zip) 運(yùn)行運(yùn)行Winpcap_3_1.exe 測(cè)試安裝結(jié)果測(cè)試安裝結(jié)果 Winpcap安裝編程環(huán)境設(shè)定1. 以以Administrator身份登錄身份登錄Windows(2000/XP),運(yùn)行運(yùn)行 一次一次Winpcap自帶例程,此后可以一般用戶(hù)身份使用自

6、帶例程,此后可以一般用戶(hù)身份使用2. 運(yùn)行運(yùn)行Visual C+ 6.0, 打開(kāi)打開(kāi)WpdPack_3_1WpdPackExamples-pcap下的下的 任一項(xiàng)目(本例用任一項(xiàng)目(本例用basic_dump目錄下目錄下 basic_dump.dsw)3. 在在“工程工程-設(shè)置設(shè)置 Link對(duì)象對(duì)象/庫(kù)模塊庫(kù)模塊” 中加入中加入 wsock32.lib ws2_32.lib wpcap.lib 在在“工具工具-選擇選擇-目錄目錄”的的include files和和library files設(shè)置中設(shè)置中引入引入winpcap開(kāi)發(fā)包中的開(kāi)發(fā)包中的Include和和Lib目錄目錄4. 編譯,運(yùn)行編譯

7、,運(yùn)行Winpcap安裝Winpcap安裝例程運(yùn)行結(jié)果:例程運(yùn)行結(jié)果:WinPcap的典型應(yīng)用的典型應(yīng)用獲得已安裝設(shè)獲得已安裝設(shè)備的高級(jí)信息備的高級(jí)信息過(guò)濾數(shù)據(jù)包過(guò)濾數(shù)據(jù)包獲得設(shè)備列表獲得設(shè)備列表打開(kāi)一個(gè)適配器打開(kāi)一個(gè)適配器 回調(diào)機(jī)制回調(diào)機(jī)制 直接方式直接方式解析數(shù)據(jù)包解析數(shù)據(jù)包獲得網(wǎng)絡(luò)流量統(tǒng)計(jì)數(shù)字獲得網(wǎng)絡(luò)流量統(tǒng)計(jì)數(shù)字打開(kāi)離線數(shù)據(jù)包文件打開(kāi)離線數(shù)據(jù)包文件獲得設(shè)備列表 (一) 一個(gè)基本的WinPcap應(yīng)用程序所需的第一步就是獲得合適的網(wǎng)絡(luò)適配器。 Libpcap提供 pcap_findalldevs() 函數(shù)完成這個(gè)功能。這個(gè)函數(shù)返回一個(gè)相連的pcap_if結(jié)構(gòu)的列表,列表的每一項(xiàng)包含關(guān)于適配器

8、的復(fù)雜的信息。特別的,name和description域數(shù)據(jù)包含設(shè)備的名稱(chēng)和可讀的描述。 pcap_if_t *alldevs,*d; int i=0; char errbufPCAP_ERRBUF_SIZE; if (pcap_findalldevs(&alldevs, errbuf) = -1) fprintf(stderr,Error in pcap_findalldevs: %sn, errbuf); exit(1); for(d=alldevs;d;d=d-next) /* Print the list */ printf(%d. %s, +i, d-name); if (d

9、-description) printf( (%s)n, d-description); else printf( (No description available)n); if(i=0) printf(nNo interfaces found! Make sure WinPcap is installed.n); return; pcap_freealldevs(alldevs); 獲得設(shè)備列表 (二)每個(gè)pcap_findalldevs() 返回的 pcap_if 結(jié)構(gòu)也包含了一個(gè)pcap_addr 結(jié)構(gòu)的列表:v該接口的地址列表該接口的地址列表v網(wǎng)絡(luò)掩碼的列表網(wǎng)絡(luò)掩碼的列表(每個(gè)網(wǎng)絡(luò)掩

10、碼對(duì)應(yīng)地址列表中的一項(xiàng)) v廣播地址的列表廣播地址的列表(每個(gè)廣播地址對(duì)應(yīng)地址列表中的一項(xiàng)) v目標(biāo)地址的列表目標(biāo)地址的列表(每個(gè)目標(biāo)地址對(duì)應(yīng)地址列表中的一項(xiàng)) 通過(guò)返回的結(jié)構(gòu),我們可以得到探測(cè)到的網(wǎng)卡設(shè)備的更詳盡信息。 typedef struct pcap_if pcap_if_t struct pcap_if struct pcap_if *next; char *name; char *description; struct pcap_addr *addresses; bpf_u_int32 flags; /* PCAP_IF_ interface flags */;struct pc

11、ap_addr struct pcap_addr *next; struct sockaddr *addr; struct sockaddr *netmask; struct sockaddr *broadaddr; struct sockaddr *dstaddr; ;打開(kāi)一個(gè)適配器開(kāi)始捕獲數(shù)據(jù)包pcap_t * pcap_open_live ( const char * device, int snaplen, int promisc, int to_ms, char * ebuf ) pcap_t *adhandle= pcap_open_live(d-name, 65536,1, 10

12、00, errbuf ); 設(shè)備標(biāo)識(shí)(字符串)抓包長(zhǎng)度混雜模式超時(shí)時(shí)間捕獲數(shù)據(jù)包(回調(diào)機(jī)制)int pcap_loop ( pcap_t * p, int cnt, pcap_handler callback, u_char * user ) 例如:pcap_loop(adhandle, 0, packet_handler, NULL); typedef void(* pcap_handler) ( u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)捕獲數(shù)據(jù)包(直接方式)int pcap_nex

13、t_ex ( pcap_t * p, struct pcap_pkthdr * pkt_header, const u_char * pkt_data )該函數(shù)從接口或者脫機(jī)讀取一個(gè)數(shù)據(jù)包。用于接收下一個(gè)可用的數(shù)據(jù)包,而不使用libpcap提供的傳統(tǒng)的回調(diào)機(jī)制。 pcap_next_ex用下一個(gè)數(shù)據(jù)包的指向數(shù)據(jù)包頭和數(shù)據(jù)的指針填充pkt_header和pkt_data參數(shù)。 pcap_next_ex() 目前只在Win32下可用,因?yàn)樗皇菍賚ibpcap原始的API。這意味著含有這個(gè)函數(shù)的代碼將不能被移植到Unix上。 過(guò)濾數(shù)據(jù)包int pcap_compile ( pcap_t * p,

14、struct bpf_program * fp, char * str, /過(guò)濾表達(dá)式 int optimize, bpf_u_int32 netmask ) /掩碼int pcap_setfilter ( pcap_t * p, struct bpf_program * fp ) pcap_compile() 編譯一個(gè)包過(guò)濾器。將一個(gè)高級(jí)的、布爾形式表示的字符串轉(zhuǎn)換成低級(jí)的、二進(jìn)制過(guò)濾語(yǔ)句,以便被包驅(qū)動(dòng)使用。pcap_setfilter() 在核心驅(qū)動(dòng)中將過(guò)濾器和捕獲過(guò)程結(jié)合在一起。從這一時(shí)刻起,所有網(wǎng)絡(luò)的數(shù)據(jù)包都要經(jīng)過(guò)過(guò)濾,通過(guò)過(guò)濾的數(shù)據(jù)包將被傳入應(yīng)用程序。 過(guò)濾設(shè)置舉例 char pac

15、ket_filter = ip and udp; struct bpf_program fcode; /* 獲取接口地址的掩碼,如果沒(méi)有掩碼,認(rèn)為該接口屬于一個(gè)獲取接口地址的掩碼,如果沒(méi)有掩碼,認(rèn)為該接口屬于一個(gè)C類(lèi)網(wǎng)絡(luò)類(lèi)網(wǎng)絡(luò) */if(d-addresses != NULL) netmask=(struct sockaddr_in *) (d-addresses-netmask)-sin_addr.S_un.S_addr; else netmask=0 xffffff; if(pcap_compile(adhandle, &fcode, packet_filter, 1, netma

16、sk) 0 ) fprintf(stderr,nUnable to compile the filter. Check the syntax.n);pcap_freealldevs(alldevs); return -1; if(pcap_setfilter(adhandle, &fcode)= 0) /處理代碼處理代碼 /主程序中主程序中pcap_loop(fp, 0, dispatcher_handler, NULL);/主程序中主程序中void dispatcher_handler(u_char *temp1, const struct pcap_pkthdr *header,

17、const u_char *pkt_data) /處理代碼處理代碼第一步:打開(kāi)離線數(shù)據(jù)文件第一步:打開(kāi)離線數(shù)據(jù)文件第二步:讀取離線數(shù)據(jù)第二步:讀取離線數(shù)據(jù) (一)使用回調(diào)函數(shù) (二)不使用回調(diào)函數(shù)if ( (fp = pcap_open_offline(argv1, errbuf) ) = NULL) fprintf(stderr,nError opening dump filen);return -1;發(fā)送數(shù)據(jù)包pcap_sendpacket發(fā)送單個(gè)數(shù)據(jù)包發(fā)送單個(gè)數(shù)據(jù)包 發(fā)送隊(duì)列(查看winpcap手冊(cè))pcap_sendpacket發(fā)送單個(gè)數(shù)據(jù)包發(fā)送單個(gè)數(shù)據(jù)包 打開(kāi)適配器后,調(diào)用pcap_

18、sendpacket()函數(shù)來(lái)發(fā)送一個(gè)手寫(xiě)的數(shù)據(jù)包。 pcap_sendpacket()用一個(gè)包含要發(fā)送的數(shù)據(jù)的緩沖區(qū)、該緩沖區(qū)的長(zhǎng)度和發(fā)送它的適配器作為參數(shù)。注意該緩沖區(qū)是不經(jīng)任何處理向外發(fā)出的,這意味著,如果想發(fā)些有用的東西的話,應(yīng)用程序必須產(chǎn)生正確的協(xié)議頭。 u_char packet100;if(fp = pcap_open_live(argv1, 100, 1, 1000, error) ) = NULL) fprintf(stderr,nError opening adapter: %sn, error); return;/* Supposing to be on ethernet, set mac destination to 1:1:1:1:1:1 */ packet05=1;/* set mac source to 2:2:2:2:2:2 */ packet611=2; /* Fill the rest of the

溫馨提示

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

評(píng)論

0/150

提交評(píng)論