版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、上海電力學(xué)院計算機(jī)網(wǎng)絡(luò)安全(1)課程實(shí)驗(yàn)報告實(shí)驗(yàn)名稱: winpcap編程實(shí)驗(yàn) 基于Winpcap 編程實(shí)現(xiàn)抓包實(shí)驗(yàn)一. 本設(shè)計要達(dá)到的目標(biāo) 基于winpcap編程實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)的捕獲,并分析數(shù)據(jù)類型,對于IP,ICMP,ARP,UDP等,能夠自動識別其協(xié)議類型并分析幀的構(gòu)成。二.實(shí)現(xiàn)步驟(1)需要通過資料來了解winpcap抓包的工作原理,熟悉其運(yùn)行過程 Winpcap的內(nèi)部結(jié)構(gòu)Wincap有三部分組成:一個數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序,一個低級的動態(tài)連接庫和一個高級的靜態(tài)連接庫。底層動態(tài)鏈接庫運(yùn)行在用戶層,它將應(yīng)用程序和數(shù)據(jù)包監(jiān)聽設(shè)備驅(qū)動程序隔離開來,使得應(yīng)用程序可以不加修改地在不同的WINDO
2、WS系統(tǒng)上運(yùn)行。高級的靜態(tài)鏈接庫和應(yīng)用程序編譯在一起,它使用低級動態(tài)鏈接庫提供的服務(wù),向應(yīng)用程序提供完善的監(jiān)聽接口。抓包是WinPcap的基本功能,也是NPF最重要的操作。在抓包的時候,驅(qū)動(例如NIC Driver)使用一個網(wǎng)絡(luò)接口監(jiān)視著數(shù)據(jù)包,并將這些數(shù)據(jù)包完整無缺地投遞給用戶級應(yīng)用程序。(2)進(jìn)一步了解winpcap編程所需要的編譯環(huán)境,下載WpdPack,了解編譯環(huán)境所需要的庫文件.在編譯時需要把wpdpack中的include與lib添加進(jìn)vc的庫文件里。(3)明確整個編程的步驟與具體函數(shù)。剛開始要定義,在主函數(shù)中獲取設(shè)備接口信息,獲得網(wǎng)絡(luò)地址與掩碼地址,打開網(wǎng)絡(luò)接口,還要設(shè)置過濾規(guī)
3、則。使用loop函數(shù)來回調(diào)循環(huán)捕獲數(shù)據(jù)包,以便一層一層解析。(4)還要定義幾個以太網(wǎng),ARP,IP,UDP,TCP,ICMP協(xié)議的格式。需要注意在存儲空間中,在存儲空間中才能更好的逐層分析,不然很容易出錯(5)定義分析協(xié)議的函數(shù),定義方式與回調(diào)函數(shù)相同. 常用的函數(shù)有:用于獲取本機(jī)設(shè)備列表的pcap_findalldevs_ex函數(shù)用于打開設(shè)備的pcap_open函數(shù),可以指定為混雜模式打開用于編譯數(shù)據(jù)包過濾器的pcap_compile 函數(shù)用于設(shè)置數(shù)據(jù)包過濾器的pcap_setfilter 函數(shù)用于從設(shè)備讀取數(shù)據(jù)包的pcap_netx_ex 函數(shù)用于關(guān)閉設(shè)備的pcap_close 函數(shù)(參數(shù)
4、為pcap_open 返回值)用于釋放設(shè)備列表的pcap_freealldevs 函數(shù)(對應(yīng)pcap_findalldevs_ex)三.系統(tǒng)流程圖主函數(shù)以太網(wǎng)協(xié)議分析函數(shù)分析ARP協(xié)議函數(shù)分析Ip協(xié)議函數(shù)分析ICMP協(xié)議函數(shù)判斷下層函數(shù)分析TCP協(xié)議函數(shù)分析UDP協(xié)議函數(shù)16進(jìn)制數(shù)據(jù)四.關(guān)鍵代碼及其分析主函數(shù)void main() pcap_t *pcap_handle; /* Winpcap句柄 */ char error_contentPCAP_ERRBUF_SIZE; /* 存儲錯誤信息 */ char *net_interface; /* 網(wǎng)絡(luò)接口 */ bpf_program bpf
5、_filter; /* BPF過濾規(guī)則 */ char bpf_filter_string = ; /* 過濾規(guī)則字符串 */ bpf_u_int32 net_mask; /* 掩碼 */ bpf_u_int32 net_ip; /* 網(wǎng)路地址 */ net_interface = pcap_lookupdev(error_content); /* 獲得可用的網(wǎng)絡(luò)接口 */ pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 獲得網(wǎng)絡(luò)地址和掩碼地址 */ pcap_handle = pcap_open_live
6、(net_interface, BUFSIZ, 1, 1, error_content); /* 打開網(wǎng)路接口 */ pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip); /* 編譯BPF過濾規(guī)則 */ pcap_setfilter(pcap_handle, &bpf_filter); /* 設(shè)置過濾規(guī)則 */對IP協(xié)議的定義class ip_header public: #if defined(WORDS_BIGENDIAN) u_int8_t ip_version: 4, /* 版本 */ ip_head
7、er_length: 4; /* 首部長度 */ #else u_int8_t ip_header_length: 4, ip_version: 4; #endif u_int8_t ip_tos; /* 服務(wù)質(zhì)量 */ u_int16_t ip_length; /* 長度 */ u_int16_t ip_id; /* 標(biāo)識 */ u_int16_t ip_off; /* 偏移 */ u_int8_t ip_ttl; /* 生存時間 */ u_int8_t ip_protocol; /* 協(xié)議類型 */ u_int16_t ip_checksum; /* 校驗(yàn)和 */ in_addr ip_s
8、ouce_address; /* 源IP地址 */ in_addr ip_destination_address; /* 目的IP地址 */pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /* 注冊回調(diào)函數(shù),循環(huán)捕獲網(wǎng)絡(luò)數(shù)據(jù)包,利用回調(diào)函數(shù)來處理每個數(shù)據(jù)包 */ 分析UDP協(xié)議的函數(shù)代碼 void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_cont
9、ent) class udp_header *udp_protocol; /* UDP協(xié)議變量 */ u_short source_port; /* 源端口 */ u_short destination_port; /* 目的端口號 */ u_short length; /長度 udp_protocol = (class udp_header*)(packet_content + 14+20);/* 獲得UDP協(xié)議內(nèi)容 */ source_port = ntohs(udp_protocol-udp_source_port); /* 獲得源端口 */ destination_port = nto
10、hs(udp_protocol-udp_destination_port); /* 獲得目的端口 */ length = ntohs(udp_protocol-udp_length); /* 獲得長度 */ cout- UDP協(xié)議 -endl; cout源端口號:decsource_portendl; cout目的端口號:decdestination_portendl; switch (destination_port) case 138: cout上層協(xié)議為NETBIOS數(shù)據(jù)報服務(wù)endl; break; case 137: cout上層協(xié)議為NETBIOS名字服務(wù)endl; break;
11、case 139: cout上層協(xié)議為NETBIOS會話服務(wù)endl; break; case 53: cout上層協(xié)議為域名服務(wù)endl; break; default: break; cout長度:lengthendl; cout校驗(yàn)和:setw(4)setfill(0)hexudp_checksum)endl; 五.參考文獻(xiàn)(1) Winpcap中文文檔(2) 網(wǎng)絡(luò)資料/view/d64047d676eeaeaad1f330c7.html?from=search /winpcap-sniffer.
12、html完整源程序#include pcap.h #include #include #includeusing namespace std; /*以下是以太網(wǎng)協(xié)議格式的定義*/ class ether_header public: u_int8_t ether_dhost6; /* 目的以太網(wǎng)地址 */ u_int8_t ether_shost6; /* 源以太網(wǎng)地址 */ u_int16_t ether_type; /* 以太網(wǎng)類型 */ ; /* 下面是ARP協(xié)議格式的定義*/ class arp_header public: u_int16_t arp_hardware_type; /
13、* 硬件類型 */ u_int16_t arp_protocol_type; /* 協(xié)議類型 */ u_int8_t arp_hardware_length; /* 硬件地址長度 */ u_int8_t arp_protocol_length; /* 協(xié)議地址長度 */ u_int16_t arp_operation_code; /* 操作碼 */ u_int8_t arp_source_ethernet_address6; /* 源以太網(wǎng)地址 */ u_int8_t arp_source_ip_address4; /* 源IP地址 */ u_int8_t arp_destination_et
14、hernet_address6; /* 目的以太網(wǎng)地址 */ u_int8_t arp_destination_ip_address4; /* 目的IP地址 */ ; /*下面是IP協(xié)議格式的定義 */ class ip_header public: #if defined(WORDS_BIGENDIAN) u_int8_t ip_version: 4, /* 版本 */ ip_header_length: 4; /* 首部長度 */ #else u_int8_t ip_header_length: 4, ip_version: 4; #endif u_int8_t ip_tos; /* 服務(wù)
15、質(zhì)量 */ u_int16_t ip_length; /* 長度 */ u_int16_t ip_id; /* 標(biāo)識 */ u_int16_t ip_off; /* 偏移 */ u_int8_t ip_ttl; /* 生存時間 */ u_int8_t ip_protocol; /* 協(xié)議類型 */ u_int16_t ip_checksum; /* 校驗(yàn)和 */ in_addr ip_souce_address; /* 源IP地址 */ in_addr ip_destination_address; /* 目的IP地址 */ ; /*下面是UDP協(xié)議格式定義*/ class udp_heade
16、r public: u_int16_t udp_source_port; /* 源端口號 */ u_int16_t udp_destination_port; /* 目的端口號 */ u_int16_t udp_length; /* 長度 */ u_int16_t udp_checksum; /* 校驗(yàn)和 */ ; /* 下面是TCP協(xié)議格式的定義*/ class tcp_header public: u_int16_t tcp_source_port; /* 源端口號 */ u_int16_t tcp_destination_port; /* 目的端口號 */ u_int32_t tcp_s
17、equence_lliiuuwweennttaaoo; /* 序列號 */ u_int32_t tcp_acknowledgement; /* 確認(rèn)序列號 */ #ifdef WORDS_BIGENDIAN u_int8_t tcp_offset: 4, /* 偏移 */ tcp_reserved: 4; /* 未用 */ #else u_int8_t tcp_reserved: 4, /* 未用 */ tcp_offset: 4; /* 偏移 */ #endif u_int8_t tcp_flags; /* 標(biāo)記 */ u_int16_t tcp_windows; /* 窗口大小 */ u_
18、int16_t tcp_checksum; /* 校驗(yàn)和 */ u_int16_t tcp_urgent_pointer; /* 緊急指針 */ ; /* 下面是ICMP協(xié)議格式的定義*/ class icmp_header public: u_int8_t icmp_type; /* ICMP類型 */ u_int8_t icmp_code; /* ICMP代碼 */ u_int16_t icmp_checksum; /* 校驗(yàn)和 */ u_int16_t icmp_id; /* 標(biāo)識符 */ u_int16_t icmp_sequence; /* 序列碼 */ ; /* 下面是分析TCP協(xié)
19、議的函數(shù),其定義方式與回調(diào)函數(shù)相同 */ void tcp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content) class tcp_header *tcp_protocol;/* TCP協(xié)議變量 */ u_char flags; /* 標(biāo)記 */ int header_length; /* 長度 */ u_short source_port; /* 源端口 */ u_short destination_port; /* 目的端口 */
20、 u_short windows; /* 窗口大小 */ u_short urgent_pointer;/* 緊急指針 */ u_int sequence; /* 序列號 */ u_int acknowledgement; /* 確認(rèn)號 */ u_int16_t checksum; /* 校驗(yàn)和 */ tcp_protocol = ( tcp_header*)(packet_content + 14+20); /* 獲得TCP協(xié)議內(nèi)容 */ source_port = ntohs(tcp_protocol-tcp_source_port); /* 獲得源端口 */ destination_po
21、rt = ntohs(tcp_protocol-tcp_destination_port); /* 獲得目的端口 */ header_length = tcp_protocol-tcp_offset *4; /* 長度 */ sequence = ntohl(tcp_protocol-tcp_sequence_lliiuuwweennttaaoo); /* 序列碼 */ acknowledgement = ntohl(tcp_protocol-tcp_acknowledgement); /* 確認(rèn)序列碼 */ windows = ntohs(tcp_protocol-tcp_windows);
22、 /* 窗口大小 */ urgent_pointer = ntohs(tcp_protocol-tcp_urgent_pointer); /* 緊急指針 */ flags = tcp_protocol-tcp_flags; /* 標(biāo)識 */ checksum = ntohs(tcp_protocol-tcp_checksum); /* 校驗(yàn)和 */ cout TCP協(xié)議 endl; cout源端口號:dec source_port endl; cout目的端口號:dec destination_portendl; switch (destination_port) case 80: cout上
23、層協(xié)議為HTTP協(xié)議:endl; break; case 21: cout上層協(xié)議為FTP協(xié)議endl; break; case 23: cout上層協(xié)議為TELNET協(xié)議endl; break; case 25: cout上層協(xié)議為SMTP協(xié)議endl; break; case 110: cout上層協(xié)議為POP3協(xié)議endl; break; default: break; cout序列碼sequenceendl; cout確認(rèn)號:acknowledgementendl; cout首部長度:decheader_lengthendl; cout保留:tcp_reserved)endl; cou
24、t標(biāo)記:; if (flags &0x08) coutPSH endl; if (flags &0x10) coutACK endl; if (flags &0x02) coutSYN endl; if (flags &0x20) coutURG endl; if (flags &0x01) coutFIN endl; if (flags &0x04) coutRST endl; coutendl; cout窗口大小:windowsendl; cout校驗(yàn)和: setw(4) setfill(0) hex checksumendl; cout緊急指針:urgent_pointerudp_sou
25、rce_port); /* 獲得源端口 */ destination_port = ntohs(udp_protocol-udp_destination_port); /* 獲得目的端口 */ length = ntohs(udp_protocol-udp_length); /* 獲得長度 */ cout UDP協(xié)議 endl; cout源端口號:decsource_portendl; cout目的端口號:decdestination_portendl; switch (destination_port) case 138: cout上層協(xié)議為NETBIOS數(shù)據(jù)報服務(wù)endl; break;
26、case 137: cout上層協(xié)議為NETBIOS名字服務(wù)endl; break; case 139: cout上層協(xié)議為NETBIOS會話服務(wù)endl; break; case 53: cout上層協(xié)議為域名服務(wù)endl; break; default: break; cout長度:lengthendl; cout校驗(yàn)和:setw(4)setfill(0)hexudp_checksum)endl; /* 下面是實(shí)現(xiàn)分析ICMP協(xié)議的函數(shù),函數(shù)類型與回調(diào)函數(shù)相同 */ void icmp_protocol_packet_callback(u_char *argument, const pca
27、p_pkthdr *packet_header, const u_char *packet_content) class icmp_header *icmp_protocol; /* ICMP協(xié)議變量 */ icmp_protocol = (icmp_header*)(packet_content + 14+20); /* 獲得ICMP協(xié)議內(nèi)容 */ cout ICMP協(xié)議 endl; coutICMP類型:icmp_typeicmp_type) case 8: coutICMP回顯請求協(xié)議endl; coutICMP代碼:icmp_codeendl; cout標(biāo)識符:icmp_idendl;
28、 cout序列碼:icmp_sequenceendl; break; case 0: coutICMP回顯應(yīng)答協(xié)議endl; coutICMP代碼: icmp_codeendl; cout標(biāo)識符: setw(4) setfill(0) hexicmp_id) endl; cout序列碼: icmp_sequenceendl; break; default: break; coutICMP校驗(yàn)和:setw(4) setfill(0) hex icmp_checksum) endl; /* 獲得ICMP校驗(yàn)和 */ return ; /*下面是實(shí)現(xiàn)ARP協(xié)議分析的函數(shù),函數(shù)類型與回調(diào)函數(shù)相同 */
29、 void arp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content) arp_header *arp_protocol; u_short protocol_type; u_short hardware_type; u_short operation_code; u_char *mac_string; in_addr source_ip_address; in_addr destination_ip_address; u_char h
30、ardware_length; u_char protocol_length; cout ARP協(xié)議 arp_hardware_type); protocol_type = ntohs(arp_protocol-arp_protocol_type); operation_code = ntohs(arp_protocol-arp_operation_code); hardware_length = arp_protocol-arp_hardware_length; protocol_length = arp_protocol-arp_protocol_length; cout硬件類型: arp
31、_hardware_type)endl; cout協(xié)議類型 : setw(4)setfill(0)arp_protocol_type)endl; cout硬件地址長度: arp_hardware_length)endl; cout協(xié)議地址長度: arp_protocol_length)endl; coutARP 操作: arp_operation_code)endl; switch (operation_code) case 1: coutARP請求協(xié)議endl; break; case 2: coutARP應(yīng)答協(xié)議endl; break; case 3: coutRARP請求協(xié)議endl;
32、break; case 4: coutRARP應(yīng)答協(xié)議endl; break; default: break; cout源以太網(wǎng)地址: arp_source_ethernet_address; cout setw(2) setfill(0) hex int(*mac_string) . setw(2) setfill(0) hex int(*(mac_string + 1) . setw(2) setfill(0) hex int(*(mac_string + 2) . setw(2) setfill(0) hex int(*(mac_string + 3) . setw(2) setfill
33、(0) hex int(*(mac_string + 4) . setw(2) setfill(0) hex int(*(mac_string + 5) arp_source_ip_address, sizeof( in_addr); cout源IP地址:inet_ntoa(source_ip_address)endl; cout目的以太網(wǎng)地址:arp_destination_ethernet_address; cout setw(2) setfill(0) hex int(*mac_string) . setw(2) setfill(0) hex int(*(mac_string + 1)
34、. setw(2) setfill(0) hex int(*(mac_string + 2) . setw(2) setfill(0) hex int(*(mac_string + 3) . setw(2) setfill(0) hex int(*(mac_string + 4) . setw(2) setfill(0) hex int(*(mac_string + 5) arp_destination_ip_address, sizeof( in_addr); cout目的IP地址:inet_ntoa(destination_ip_address)ip_checksum); /* 獲得校驗(yàn)和
35、 */ header_length = ip_protocol-ip_header_length *4; /* 獲得長度 */ tos = ip_protocol-ip_tos; /* 獲得服務(wù)質(zhì)量 */ offset = ntohs(ip_protocol-ip_off); /* 獲得偏移 */ cout IP協(xié)議 endl; cout版本號:ip_version)endl; cout首部長度: header_lengthendl; cout服務(wù)質(zhì)量: ip_tos) endl; cout總長度: ip_length)endl; cout標(biāo)識: setw(4)setfill(0)hexip_
36、id) endl; cout偏移: (offset &0x1fff) *8endl; cout生存時間: ip_ttl)endl; cout協(xié)議類型: ip_protocol)ip_protocol) case 6: cout上層協(xié)議為TCP協(xié)議endl; break; case 17: cout上層協(xié)議為UDP協(xié)議endl; break; case 1: cout上層協(xié)議為ICMP協(xié)議ICMPendl; break; default: break; cout校驗(yàn)和:checksumendl; cout源IP地址:ip_souce_address)endl; /* 獲得源IP地址 */ cout目的IP地址:ip_destination_address)ip_protocol) /* 根據(jù)IP協(xié)議判斷上層協(xié)議 */ case 6: tcp_protocol_packet_callback(argument, packet_heade
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個性化反擔(dān)保合同合同新規(guī)定樣本版B版
- 2025年度生態(tài)養(yǎng)殖場承包經(jīng)營權(quán)轉(zhuǎn)讓合同范本4篇
- 2024年高科技園區(qū)全額承包運(yùn)營管理合同3篇
- 二零二五版農(nóng)業(yè)墊資服務(wù)合同樣本2篇
- 2025年度應(yīng)急指揮車輛設(shè)備采購合同4篇
- 教育信息化背景下的中小學(xué)教學(xué)方法變革
- 2025年度珠寶首飾出口貨物運(yùn)輸代理與鑒定服務(wù)合同4篇
- 2025年物流配送與快遞快遞行業(yè)標(biāo)準(zhǔn)化合同范本3篇
- 2025年度動物行為研究錄像采集合同4篇
- 2025年度特種工程挖掘機(jī)購置與操作培訓(xùn)合同4篇
- 定額〔2025〕1號文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價格水平調(diào)整的通知
- 2024年城市軌道交通設(shè)備維保及安全檢查合同3篇
- 【教案】+同一直線上二力的合成(教學(xué)設(shè)計)(人教版2024)八年級物理下冊
- 湖北省武漢市青山區(qū)2023-2024學(xué)年七年級上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含解析)
- 單位往個人轉(zhuǎn)賬的合同(2篇)
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學(xué)生運(yùn)動能力測評規(guī)范
- 高危妊娠的評估和護(hù)理
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
- 2023年高考全國甲卷數(shù)學(xué)(理)試卷【含答案】
- 數(shù)獨(dú)題目A4打印版無答案
評論
0/150
提交評論