




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 網(wǎng)絡(luò)編程論文學(xué) 號(hào):4090220姓 名:雷諾提交日期:2011.12.10成 績(jī):東北大學(xué)秦皇島分校目錄1、 winpcap概述12、 winpcap驅(qū)動(dòng)各項(xiàng)功能13、 winpcap的主要功能14、 winpcap網(wǎng)絡(luò)編程21) winpcap獲取與網(wǎng)絡(luò)配置器綁定的設(shè)備列表2 2) 獲取網(wǎng)絡(luò)適配器的高級(jí)屬性信息33) 打開(kāi)網(wǎng)絡(luò)適配器并實(shí)現(xiàn)抓包功能64) 不使用事件處理器進(jìn)行抓包95) 過(guò)濾數(shù)據(jù)包12五、nic驅(qū)動(dòng)器和ndis17 注:與4090225韓雪同學(xué)合作完成 基于winpcap技術(shù)的網(wǎng)絡(luò) 數(shù)據(jù)包捕獲,過(guò)濾和分析技術(shù)摘要:在當(dāng)今的互聯(lián)網(wǎng)時(shí)代里,網(wǎng)絡(luò)中豐富多彩的各種應(yīng)用已經(jīng)徹底改變了
2、人們的工作和生活方式,internet在給人們帶來(lái)方便的同時(shí),也給網(wǎng)絡(luò)管理員帶了一些困擾。比如,一些單位的員工在工作期間炒股,玩網(wǎng)絡(luò)游戲等,面對(duì)這些問(wèn)題,基于winpcap技術(shù)的網(wǎng)絡(luò)數(shù)據(jù)包捕獲,過(guò)濾和分析技術(shù)。如果在網(wǎng)絡(luò)的出口位置對(duì)網(wǎng)絡(luò)中的數(shù)據(jù)包進(jìn)行捕獲和分析,就可以統(tǒng)計(jì)出流量是基于哪些應(yīng)用的,有了流量便可以成功的進(jìn)行管理。1、 winpcap概述:winpcap(windows packet capture)是windows平臺(tái)下一個(gè)免費(fèi),公共的網(wǎng)絡(luò)訪問(wèn)系統(tǒng)。開(kāi)發(fā)winpcap這個(gè)項(xiàng)目的目的在于為win32應(yīng)用程序提供訪問(wèn)網(wǎng)絡(luò)底層的能力。它提供了以下的各項(xiàng)功能:1 捕獲原始數(shù)據(jù)報(bào),包括在共享
3、網(wǎng)絡(luò)上各主機(jī)發(fā)送/接收的以及相互之間交換的數(shù)據(jù)報(bào);2 在數(shù)據(jù)報(bào)發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)報(bào)過(guò)濾掉;3 在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)報(bào);4 收集網(wǎng)絡(luò)通信過(guò)程中的統(tǒng)計(jì)信息。 2、 winpcap驅(qū)動(dòng)各項(xiàng)功能1 捕獲原始數(shù)據(jù)包:包括在共享網(wǎng)絡(luò)上各主機(jī)發(fā)送/接收的以及相互之間交換的數(shù)據(jù)包; 2 在數(shù)據(jù)包發(fā)往應(yīng)用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)包過(guò)濾掉; 3 在網(wǎng)絡(luò)上發(fā)送原始的數(shù)據(jù)包; 4 收集網(wǎng)絡(luò)通信過(guò)程中的統(tǒng)計(jì)信息。 3、 winpcap的主要功能 在于獨(dú)立于主機(jī)協(xié)議(如tcp-ip)而發(fā)送和接收原始數(shù)據(jù)包。也就是說(shuō),winpcap不能阻塞,過(guò)濾或控制其他應(yīng)用程序數(shù)據(jù)包的
4、發(fā)收,它僅僅只是監(jiān)聽(tīng)共享網(wǎng)絡(luò)上傳送的數(shù)據(jù)包。因此,它不能用于qos調(diào)度程序或個(gè)人防火墻。目前,winpcap開(kāi)發(fā)的主要對(duì)象是windows nt/2000/xp,這主要是因?yàn)樵谑褂脀inpcap的用戶(hù)中只有一小部分是僅使用windows 95/98/me,并且ms也已經(jīng)放棄了對(duì)win9x的開(kāi)發(fā)。因此本文相關(guān)的程序t-arp也是面向nt/2000/xp用戶(hù)的。其實(shí)winpcap中的面向9x系統(tǒng)的概念和nt系統(tǒng)的非常相似,只是在某些實(shí)現(xiàn)上有點(diǎn)差異,比如說(shuō)9x只支持ansi編碼,而nt系統(tǒng)則提倡使用unicode編碼。有個(gè)軟件叫sniffer pro.可以作網(wǎng)管軟件用,有很多功能,可監(jiān)視網(wǎng)絡(luò)運(yùn)行情況
5、,每臺(tái)網(wǎng)內(nèi)機(jī)器的數(shù)據(jù)流量,實(shí)時(shí)反映每臺(tái)機(jī)器所訪問(wèn)ip以及它們之間的數(shù)據(jù)流通情況,可以抓包,可對(duì)過(guò)濾器進(jìn)行設(shè)置,以便只抓取想要的包,比如pop3包,smtp包,ftp包等,并可從中找到郵箱用戶(hù)名和密碼,還有ftp用戶(hù)名和密碼。它還可以在使用交換機(jī)的網(wǎng)絡(luò)上監(jiān)聽(tīng),不過(guò)要在交換機(jī)上裝它的一個(gè)軟件。還有一個(gè)簡(jiǎn)單的監(jiān)聽(tīng)軟件叫passwordsniffer,可截獲郵箱用戶(hù)名和密碼,還有ftp用戶(hù)名和密碼,它只能用在hub網(wǎng)絡(luò)上。著名軟件tcpdump及ids snort都是基于libpcap編寫(xiě)的,此外nmap掃描器也是基于libpcap來(lái)捕獲目標(biāo)主機(jī)返回的數(shù)據(jù)包的。 winpcap提供給用戶(hù)兩個(gè)不同級(jí)別的
6、編程接口:一個(gè)基于libpcap的wpcap.dll,另一個(gè)是較底層的packet.dll。對(duì)于一般的要與unix平臺(tái)上libpcap兼容的開(kāi)發(fā)來(lái)說(shuō),使用wpcap.dll是當(dāng)然的選擇。4、 winpcap網(wǎng)絡(luò)編程1. winpcap獲取與網(wǎng)絡(luò)配置器綁定的設(shè)備列表在開(kāi)始捕獲數(shù)據(jù)包之前,通常需要獲取與網(wǎng)絡(luò)適配器綁定的設(shè)備列表。通俗的說(shuō),就是獲取當(dāng)前計(jì)算機(jī)中安裝的網(wǎng)卡列表,這樣用戶(hù)就可以選擇在哪塊網(wǎng)塊上捕獲數(shù)據(jù)包了。代碼:/ findalldevs.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include stdafx.h#include pcap.h#include remote-ext.h#
7、include stdlib.hint _tmain(int argc, _tchar* argv) pcap_if_t *alldevs; pcap_if_t *d; int i=0; char errbufpcap_errbuf_size; /* 獲取本地機(jī)器設(shè)備列表*/ if (pcap_findalldevs_ex(pcap_src_if_string, null /* auth is not needed */, &alldevs, errbuf) = -1) fprintf(stderr,error in pcap_findalldevs_ex: %sn, errbuf); exi
8、t(1); /* 打印列表*/ for(d= alldevs; d != null; d= d-next) printf(n%d. %sn, +i, d-name); if (d-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 1; /* 不再需要設(shè)備列表了,釋放它*/ pcap_freealldevs(al
9、ldevs);system(pause);return 0;2. 獲取網(wǎng)絡(luò)適配器的高級(jí)屬性信息除了網(wǎng)絡(luò)適配的名稱(chēng)和描述信息外,pcap_if_t結(jié)構(gòu)體中還應(yīng)包含網(wǎng)絡(luò)適配器上定義的地址列表,子網(wǎng)掩碼列表,廣播地址列表和目的地址列表。代碼:/ findalldevs.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include stdafx.h#include pcap.h#include remote-ext.h#include stdlib.h/ 將數(shù)字ip地址轉(zhuǎn)換為字符串#define iptosbuffers12char *iptos(u_long in)static char output
10、iptosbuffers3*4+3+1;static short which;u_char *p;p = (u_char *)∈which = (which + 1 = iptosbuffers ? 0 : which + 1);sprintf(outputwhich, %d.%d.%d.%d, p0, p1, p2, p3);return outputwhich;#ifndef _mingw32_ /* cygnus doesnt have ipv6 */char* ip6tos(struct sockaddr *sockaddr, char *address, int addrlen
11、)socklen_t sockaddrlen;#ifdef win32sockaddrlen = sizeof(struct sockaddr_in6);#elsesockaddrlen = sizeof(struct sockaddr_storage);#endifif(getnameinfo(sockaddr, sockaddrlen, address, addrlen, null, 0, ni_numerichost) != 0) address = null;return address;#endif /* _mingw32_ */ 打印指定接口的信息,參數(shù)d指定要打印的接口void
12、ifprint(pcap_if_t *d) pcap_addr_t *a; char ip6str128; / 打印名稱(chēng) printf(%sn,d-name); / 打印描述信息 if (d-description) printf(tdescription: %sn,d-description); / 打印環(huán)回信息 printf(tloopback: %sn,(d-flags & pcap_if_loopback)?yes:no); / 打印地址信息 for(a=d-addresses;a;a=a-next) printf(taddress family: #%dn,a-addr-sa_fam
13、ily); switch(a-addr-sa_family) case af_inet: printf(taddress family name: af_inetn); if (a-addr) printf(taddress: %sn,iptos(struct sockaddr_in *)a-addr)-sin_addr.s_addr); if (a-netmask) printf(tnetmask: %sn,iptos(struct sockaddr_in *)a-netmask)-sin_addr.s_addr); if (a-broadaddr) printf(tbroadcast ad
14、dress: %sn,iptos(struct sockaddr_in *)a-broadaddr)-sin_addr.s_addr); if (a-dstaddr) printf(tdestination address: %sn,iptos(struct sockaddr_in *)a-dstaddr)-sin_addr.s_addr); break; case af_inet6:/ ipv6 printf(taddress family name: af_inet6n);#ifndef _mingw32_ /* cygnus doesnt have ipv6 */ if (a-addr)
15、 printf(taddress: %sn, ip6tos(a-addr, ip6str, sizeof(ip6str);#endifbreak; default: printf(taddress family name: unknownn); break; printf(n);int _tmain(int argc, _tchar* argv)pcap_if_t *alldevs;/ 獲取的所有網(wǎng)絡(luò)設(shè)備鏈表pcap_if_t *d;/ 指向一個(gè)網(wǎng)絡(luò)設(shè)備char errbufpcap_errbuf_size+1;/ 錯(cuò)誤緩沖區(qū)/ 獲取網(wǎng)絡(luò)設(shè)備列表if(pcap_findalldevs_ex(p
16、cap_src_if_string, null, &alldevs, errbuf) = -1)fprintf(stderr,error in pcap_findalldevs: %sn, errbuf);exit(1);/ 打印每個(gè)網(wǎng)絡(luò)設(shè)備的信息for(d=alldevs;d;d=d-next)ifprint(d);/ 釋放網(wǎng)絡(luò)設(shè)備鏈表pcap_freealldevs(alldevs);system(pause);return 0;3. 打開(kāi)網(wǎng)絡(luò)適配器并實(shí)現(xiàn)抓包功能 要獲得網(wǎng)絡(luò)適配器綁定的設(shè)備列表后,可以要求用戶(hù)選擇一個(gè)設(shè)備用于捕獲數(shù)據(jù)包。在捕獲數(shù)據(jù)包之前,還需要打開(kāi)設(shè)備。代碼:/ pcap
17、_loop.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include stdafx.h#include pcap.h#include remote-ext.h#include stdlib.h/* packet handler 函數(shù)原型*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int _tmain(int argc, _tchar* argv)pcap_if_t *alldevs;/ 獲取到的設(shè)備列表int inum;int i=0;pcap_t
18、 *adhandle;char errbufpcap_errbuf_size; /* 獲取本機(jī)設(shè)備列表*/ if (pcap_findalldevs_ex(pcap_src_if_string, null, &alldevs, errbuf) = -1) fprintf(stderr,error in pcap_findalldevs: %sn, errbuf); exit(1); /* 打印設(shè)備列表*/pcap_if_t *d; for(d=alldevs; d; d=d-next) printf(%d. %s, +i, d-name); if (d-description) printf(
19、 (%s)n, d-description); else printf( (沒(méi)有有效的描述信息)n); / 如果沒(méi)有找到網(wǎng)絡(luò)適配器 if(i=0) printf(n未發(fā)現(xiàn)網(wǎng)絡(luò)接口!請(qǐng)確定winpcap被正確安裝。n); return -1; printf(請(qǐng)輸入要捕獲數(shù)據(jù)包的網(wǎng)絡(luò)接口編號(hào)(1-%d):,i); scanf(%d, &inum); if(inum i) printf(n接口編號(hào)越界.n); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; /* 跳轉(zhuǎn)到選中的適配器*/ for(d=alldevs, i=0; inext, i+);
20、 /* 打開(kāi)設(shè)備*/ if ( (adhandle= pcap_open(d-name,/ 設(shè)備名 65536,/ 65535保證能捕獲到不同數(shù)據(jù)鏈路層上的每個(gè)數(shù)據(jù)包的全部?jī)?nèi)容 pcap_openflag_promiscuous, / 混雜模式 1000,/ 讀取超時(shí)時(shí)間 null,/ 遠(yuǎn)程機(jī)器驗(yàn)證 errbuf/ 錯(cuò)誤緩沖池 ) ) = null) fprintf(stderr,n無(wú)法打開(kāi)網(wǎng)絡(luò)適配器。winpcap不支持%s n, d-name); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; printf(n在%s上啟動(dòng)監(jiān)聽(tīng).n, d-
21、description); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); /* 開(kāi)始捕獲*/ pcap_loop(adhandle, 0, packet_handler, null); return 0;/* 每次捕獲到數(shù)據(jù)包時(shí),winpcap都會(huì)自動(dòng)調(diào)用這個(gè)回調(diào)函數(shù)*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) struct tm *ltime; char timestr16; time_t local_tv_sec;
22、/* 將時(shí)間戳轉(zhuǎn)換成可識(shí)別的格式*/ local_tv_sec = header-ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, %h:%m:%s, ltime); / 打印接收到的數(shù)據(jù) printf(%s,%.6d len:%dn, timestr, header-ts.tv_usec, header-len); 4. 不使用事件處理器進(jìn)行抓包pacp_next_ex()函數(shù)是基于回調(diào)技術(shù)來(lái)捕獲數(shù)據(jù)的,當(dāng)數(shù)據(jù)到達(dá)時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用指定的回調(diào)函數(shù),處理捕獲的數(shù)據(jù)。但使用回調(diào)方式編寫(xiě)的程序
23、可讀性不夠好,不理解這種編程思想的人很難解程序的運(yùn)行軌跡。代碼:/ pcap_next_ex.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include stdafx.h#include pcap.h#include remote-ext.h#include stdlib.hint _tmain(int argc, _tchar* argv)pcap_if_t *alldevs;/ 獲取的設(shè)備列表pcap_if_t *d;/ 用于遍歷設(shè)備列表int inum;/ 用戶(hù)選擇的用于監(jiān)聽(tīng)的int i=0;pcap_t *adhandle;/ 打開(kāi)設(shè)備后返回的winpcap會(huì)話句柄char errbu
24、fpcap_errbuf_size;struct tm *ltime;/ 讀取數(shù)據(jù)包的時(shí)間char timestr16;struct pcap_pkthdr *header;/ 數(shù)據(jù)包頭const u_char *pkt_data;/ 數(shù)據(jù)包內(nèi)容 /* 獲取本機(jī)設(shè)備列表*/ if (pcap_findalldevs_ex(pcap_src_if_string, null, &alldevs, errbuf) = -1) fprintf(stderr,error in pcap_findalldevs: %sn, errbuf); exit(1); /* 打印列表*/ for(d=alldevs
25、; d; d=d-next) printf(%d. %s, +i, d-name); if (d-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 -1; printf(enter the interface number (1-%d):,i); scanf(%d, &inum); if(inum i) printf
26、(ninterface number out of range.n); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; /* 跳轉(zhuǎn)到已選中的適配器*/ for(d=alldevs, i=0; inext, i+); /* 打開(kāi)設(shè)備*/ if ( (adhandle= pcap_open(d-name, / 設(shè)備名 65536, / 要捕捉的數(shù)據(jù)包的部分 / 65535保證能捕獲到不同數(shù)據(jù)鏈路層上的每個(gè)數(shù)據(jù)包的全部?jī)?nèi)容 pcap_openflag_promiscuous, / 混雜模式 1000, / 讀取超時(shí)時(shí)間 null, / 遠(yuǎn)程機(jī)器驗(yàn)證
27、 errbuf / 錯(cuò)誤緩沖池 ) ) = null) fprintf(stderr,nunable to open the adapter. %s is not supported by winpcapn, d-name); /* 釋放設(shè)列表*/ pcap_freealldevs(alldevs); return -1; printf(nlistening on %s.n, d-description); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); /* 獲取數(shù)據(jù)包*/int res; while(res = pcap_next_ex( adhandle,
28、&header, &pkt_data) = 0) if(res = 0) /* 超時(shí)時(shí)間到*/ continue; /* 將時(shí)間戳轉(zhuǎn)換成可識(shí)別的格式*/ time_t local_tv_sec = header-ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, %h:%m:%s, ltime); printf(%s,%.6d len:%dn, timestr, header-ts.tv_usec, header-len); if(res = -1) printf(error reading
29、 the packets: %sn, pcap_geterr(adhandle); return -1; return 0;5. 過(guò)濾數(shù)據(jù)包nfs模塊中德數(shù)據(jù)包過(guò)濾引擎是winpcap最強(qiáng)大的功能之一,它可以提供有效的方法獲取網(wǎng)絡(luò)中具有特性的數(shù)據(jù)包,這也是winpcap數(shù)據(jù)包捕獲機(jī)制的一個(gè)組成部分??梢酝ㄟ^(guò)調(diào)用pcap_compile()和pcap_setfilter函數(shù)來(lái)實(shí)現(xiàn)過(guò)濾數(shù)據(jù)包的功能。代碼:/ udpdump.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include stdafx.h#include pcap.h#include remote-ext.h/* 4字節(jié)的ip地址*/t
30、ypedef struct ip_address u_char byte1; u_char byte2; u_char byte3; u_char byte4;ip_address;/* ipv4 首部*/typedef struct ip_header u_char ver_ihl; / 版本(4 bits) + 首部長(zhǎng)度(4 bits) u_char tos; / 服務(wù)類(lèi)型(type of service) u_short tlen; / 總長(zhǎng)(total length) u_short identification; / 標(biāo)識(shí)(identification) u_short flags_
31、fo; / 標(biāo)志位(flags) (3 bits) + 段偏移量(fragment offset) (13 bits) u_char ttl; / 存活時(shí)間(time to live) u_char proto; / 協(xié)議(protocol) u_short crc; / 首部校驗(yàn)和(header checksum) ip_address saddr; / 源地址(source address) ip_address daddr; / 目的地址(destination address) u_int op_pad; / 選項(xiàng)與填充(option + padding)ip_header;/* ud
32、p 首部*/typedef struct udp_header u_short sport; / 源端口(source port) u_short dport; / 目的端口(destination port) u_short len; / udp數(shù)據(jù)包長(zhǎng)度(datagram length) u_short crc; / 校驗(yàn)和(checksum)udp_header;/* 回調(diào)函數(shù)原型*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);int _tmain
33、(int argc, _tchar* argv)pcap_if_t *alldevs;pcap_if_t *d;int inum;int i=0;pcap_t *adhandle;char errbufpcap_errbuf_size;u_int netmask;char packet_filter = ip and udp;struct bpf_program fcode; /* 獲得設(shè)備列表*/ if (pcap_findalldevs_ex(pcap_src_if_string, null, &alldevs, errbuf) = -1) fprintf(stderr,error in
34、pcap_findalldevs: %sn, errbuf); exit(1); /* 打印列表*/ for(d=alldevs; d; d=d-next) printf(%d. %s, +i, d-name); if (d-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 -1; printf(enter the
35、interface number (1-%d):,i); scanf(%d, &inum); if(inum i) printf(ninterface number out of range.n); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; /* 跳轉(zhuǎn)到已選設(shè)備*/ for(d=alldevs, i=0; inext, i+); /* 打開(kāi)適配器*/ if ( (adhandle= pcap_open(d-name, / 設(shè)備名 65536, / 要捕捉的數(shù)據(jù)包的部分 / 65535保證能捕獲到不同數(shù)據(jù)鏈路層上的每個(gè)數(shù)據(jù)包的全部?jī)?nèi)容 p
36、cap_openflag_promiscuous, / 混雜模式 1000, / 讀取超時(shí)時(shí)間 null, / 遠(yuǎn)程機(jī)器驗(yàn)證 errbuf / 錯(cuò)誤緩沖池 ) ) = null) fprintf(stderr,nunable to open the adapter. %s is not supported by winpcapn); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; /* 檢查數(shù)據(jù)鏈路層,為了簡(jiǎn)單,我們只考慮以太網(wǎng)*/ if(pcap_datalink(adhandle) != dlt_en10mb) fprintf(stder
37、r,nthis program works only on ethernet networks.n); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; if(d-addresses != null) /* 獲得接口第一個(gè)地址的掩碼*/ netmask=(struct sockaddr_in *)(d-addresses-netmask)-sin_addr.s_un.s_addr; else /* 如果接口沒(méi)有地址,那么我們假設(shè)一個(gè)c類(lèi)的掩碼*/ netmask=0xffffff; /編譯過(guò)濾器 if (pcap_compile(adhandl
38、e, &fcode, packet_filter, 1, netmask) 0 ) fprintf(stderr,nunable to compile the packet filter. check the syntax.n); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); return -1; /設(shè)置過(guò)濾器 if (pcap_setfilter(adhandle, &fcode)description); /* 釋放設(shè)備列表*/ pcap_freealldevs(alldevs); /* 開(kāi)始捕捉*/ pcap_loop(adhandle, 0, packe
39、t_handler, null); return 0;/* 回調(diào)函數(shù),當(dāng)收到每一個(gè)數(shù)據(jù)包時(shí)會(huì)被libpcap所調(diào)用*/void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) struct tm *ltime; char timestr16; ip_header *ih; udp_header *uh; u_int ip_len; u_short sport,dport; time_t local_tv_sec; /* 將時(shí)間戳轉(zhuǎn)換成可識(shí)別的格式*/ local_tv
40、_sec = header-ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, %h:%m:%s, ltime); /* 打印數(shù)據(jù)包的時(shí)間戳和長(zhǎng)度*/ printf(%s.%.6d len:%d , timestr, header-ts.tv_usec, header-len); /* 獲得ip數(shù)據(jù)包頭部的位置*/ ih = (ip_header *) (pkt_data + 14); /以太網(wǎng)頭部長(zhǎng)度 /* 獲得udp首部的位置*/ ip_len = (ih-ver_ihl & 0xf)
41、* 4; uh = (udp_header *) (u_char*)ih + ip_len); /* 將網(wǎng)絡(luò)字節(jié)序列轉(zhuǎn)換成主機(jī)字節(jié)序列*/ sport = ntohs( uh-sport ); dport = ntohs( uh-dport ); /* 打印ip地址和udp端口*/ printf(%d.%d.%d.%d.%d - %d.%d.%d.%d.%dn, ih-saddr.byte1, ih-saddr.byte2, ih-saddr.byte3, ih-saddr.byte4, sport, ih-daddr.byte1, ih-daddr.byte2, ih-daddr.byte3
42、, ih-daddr.byte4, dport);五、nic驅(qū)動(dòng)器和ndis1) npf和ndisndis(network driver interface specification)是一個(gè)定義網(wǎng)絡(luò)適配器(或者說(shuō)成是管理網(wǎng)絡(luò)適配器的驅(qū)動(dòng)程序)與協(xié)議驅(qū)動(dòng)(例如tcp/ip的實(shí)現(xiàn))之間通信的規(guī)范。ndis最主要的目的是作為一個(gè)允許協(xié)議驅(qū)動(dòng)發(fā)送和接收網(wǎng)絡(luò)(lan或wan)上的數(shù)據(jù)包而不必關(guān)心特定的適配器或特定的win32操作系統(tǒng)的封裝。 2) ndis支持三種類(lèi)型的網(wǎng)絡(luò)驅(qū)動(dòng): a. 網(wǎng)絡(luò)接口卡或nic驅(qū)動(dòng)(network interface card or nic drivers)。nic驅(qū)動(dòng)直接管理著網(wǎng)絡(luò)接口卡(nic)。nic驅(qū)動(dòng)接下邊與硬件連接,從上邊表現(xiàn)為一個(gè)接口,該接口允許高層發(fā)送數(shù)據(jù)包到網(wǎng)絡(luò)上,處理中斷,重置nic,停止nic,查詢(xún)和設(shè)置驅(qū)動(dòng)的運(yùn)行特征。nic驅(qū)動(dòng)可以是小端口(miniport)或完全的
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 蒸汽供氣合同范本
- 單位返聘合同范本
- 農(nóng)村工程改建合同范本
- 農(nóng)村住房貸款買(mǎi)賣(mài)合同范本
- 買(mǎi)賣(mài)股份合同范本
- 單位購(gòu)買(mǎi)服裝購(gòu)買(mǎi)合同范本
- 勞動(dòng)仲裁聘用合同范本
- 出售廢鋼 廢鐵合同范本
- 勞務(wù)分包項(xiàng)目合同范本
- 中介甲乙丙方合同范本
- Unit 4 Time to celebrate 教學(xué)設(shè)計(jì)-2024-2025學(xué)年外研版英語(yǔ)七年級(jí)上冊(cè)
- 健康檔案模板
- 筋膜刀的臨床應(yīng)用
- DB32-T 4790-2024建筑施工特種作業(yè)人員安全操作技能考核標(biāo)準(zhǔn)
- 2022年安徽阜陽(yáng)太和縣人民醫(yī)院本科及以上學(xué)歷招聘筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 2024-2030年中國(guó)反芻動(dòng)物飼料行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 護(hù)理團(tuán)體標(biāo)準(zhǔn)解讀-成人氧氣吸入療法護(hù)理
- 幼兒園大班《識(shí)字卡》課件
- 2024-2030全球與中國(guó)寵物醫(yī)院市場(chǎng)現(xiàn)狀及未來(lái)發(fā)展趨勢(shì)
- 《研學(xué)旅行課程設(shè)計(jì)》課件-2認(rèn)識(shí)研學(xué)旅行的參與方
- 安全警示教育的會(huì)議記錄內(nèi)容
評(píng)論
0/150
提交評(píng)論