




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、WinPcap開發(fā)(一):零基礎(chǔ)入門*原創(chuàng)作者:追影人0×00 前言網(wǎng)絡(luò)編程在網(wǎng)絡(luò)安全方面具有舉足輕重的作用,如何快捷高效的監(jiān)聽、分析、構(gòu)造網(wǎng)絡(luò)流量,成為很多安全從業(yè)者需要解決的重點(diǎn)問題。而winpcap這一免費(fèi)開源項(xiàng)目恰好可以為win32應(yīng)用程序提供訪問網(wǎng)絡(luò)底層的能力,所以其成為了相關(guān)網(wǎng)絡(luò)編程的首選開發(fā)工具。0×01 winpcap是什么?winpcap(windows packet capture)是windows平臺下一個免費(fèi)的網(wǎng)絡(luò)訪問系統(tǒng),可用于windows系統(tǒng)下的網(wǎng)絡(luò)編程。著名的wireshark便是基于winpcap開發(fā)的,大家在安裝wireshark中可以看
2、到winpcap驅(qū)動程序的安裝過程。有關(guān)winpcap的介紹網(wǎng)絡(luò)上很多,百科里面介紹的也很詳細(xì),我就不再copy了。需要注意的一點(diǎn)是,winpcap并不是一個簡單的library,而是一個針對Win32平臺上的抓包和網(wǎng)絡(luò)分析的一個架構(gòu),它包括一個核心態(tài)的包過濾器,一個底層的動態(tài)鏈接庫(packet.dll)和一個高層的不依賴于系統(tǒng)的庫(wpcap.dll)。所以它只能“嗅探”到物理線路上的數(shù)據(jù)包,而不具備攔截的能力,因此不適用于個人防火墻等項(xiàng)目。0×02 你需要準(zhǔn)備些什么?本系列文章主要帶大家認(rèn)識和了解如何利用winpcap網(wǎng)絡(luò)編程技術(shù)進(jìn)行網(wǎng)絡(luò)的協(xié)議分析、流量統(tǒng)計及網(wǎng)絡(luò)探測掃描等,這
3、里我們并不會去深硬的解讀相關(guān)源代碼,而是以輕松的方式結(jié)合實(shí)驗(yàn)來對相關(guān)原理進(jìn)行深入理解。在本系列文章中,筆者從簡到難,簡明介紹winpcap架構(gòu)原理、相關(guān)環(huán)境搭建及快速編寫核心代碼。但是在開始前,讀者需要有一些相關(guān)基礎(chǔ):了解網(wǎng)絡(luò)協(xié)議相關(guān)基礎(chǔ)知識,掌握一門winpcap開發(fā)庫支持的編程語言,自己能動手實(shí)踐編寫一些例子。Winpcap提供的開發(fā)接口原生是c語言的,不過熱心腸的程序猿們已經(jīng)為其他語言的使用提供了封裝,比如java、.net、python,好像連易語言都有。本系列文章將使用c語言來進(jìn)行各種實(shí)驗(yàn),有興趣的讀者可以將其轉(zhuǎn)換成自己熟悉的語言來動手實(shí)踐。0×03 你能學(xué)到什么?有關(guān)wi
4、npcap開發(fā)的文章在網(wǎng)上很容易找到,但是更多的都是對于代碼的講解,筆者在本文盡量系統(tǒng)性的從原理層面結(jié)合各個應(yīng)用場景來介紹相關(guān)知識:1. Winpcap獲取網(wǎng)卡基本信息及收發(fā)數(shù)據(jù)包2. 存活主機(jī)探測3. 端口掃描4. Arp欺騙5. 中間人攻擊的簡單實(shí)現(xiàn)6. 流量統(tǒng)計與分析0×04 知識補(bǔ)充進(jìn)行下面的介紹前,我們需要了解幾個名詞的關(guān)系。winpcap(windows packet capture)是windows平臺下一個免費(fèi)的網(wǎng)絡(luò)訪問系統(tǒng),可用于windows系統(tǒng)下的網(wǎng)絡(luò)編程。linux
5、 平臺下對應(yīng)的開發(fā)包是libpcap。Wireshark是基于winpcap處理網(wǎng)絡(luò)驅(qū)動層。Wpdpack是winpcap的開發(fā)包,提供開發(fā)相關(guān)程序的接口。0×05 環(huán)境準(zhǔn)備首先根據(jù)你所選擇的開發(fā)語言選擇對應(yīng)的編譯器,筆者使用c語言,利用VS2012進(jìn)行相關(guān)開發(fā)。安裝好編譯器后,進(jìn)行相關(guān)配置。下載wpdpack點(diǎn)擊這里 初學(xué)者可以選擇里面的Examples進(jìn)行編譯,可以看到找不到頭文件,及相關(guān)庫。 這是因?yàn)閣pdpack中的相關(guān)庫還沒有引入到編譯環(huán)境中 將wpdpack包中的Include和lib文件夾中的文件添加到VS的相關(guān)目錄下即可編譯通
6、過。將編譯后的程序進(jìn)行運(yùn)行則出現(xiàn)以下錯誤。 這是由于運(yùn)行時缺乏動態(tài)鏈接庫導(dǎo)致,最簡單的方法是直接下載并安裝winpcap驅(qū)動程序 下載 如果你覺得這樣子很麻煩,也可以采用簡易方法。程序在運(yùn)行時只需要winpcap在system32下面釋放的wpcap.dll和packet.dll,還有driver下面的npf.sys,所以不需要完整安裝winpcap,而選擇只復(fù)制以上三個文件到對應(yīng)目錄中即可。本節(jié)筆者將采用著名的Arpspoof源碼進(jìn)行相關(guān)講解,源碼下載地址0×06 枚舉可用網(wǎng)絡(luò)適配器資源在使用winpcap進(jìn)行收發(fā)數(shù)據(jù)包時,需指定對應(yīng)的網(wǎng)卡,所以有必要
7、列出計算機(jī)上所有可用的網(wǎng)絡(luò)適配資源。列取網(wǎng)卡信息的核心代碼:/該函數(shù)在Arpspoof程序中,筆者進(jìn)行了詳細(xì)注釋void ListAdapters()pcap_if_t *alldevs;/用于存儲網(wǎng)卡鏈表的頭指針pcap_if_t *d;/用于遍歷網(wǎng)卡鏈表的臨時變量 int i = 0;/記錄網(wǎng)卡個數(shù)char errbufPCAP_ERRBUF_SIZE;/存儲錯誤信息char szGateIPAddr16;/網(wǎng)卡對應(yīng)網(wǎng)關(guān)地址char *p;/網(wǎng)卡名詞char szI
8、PAddr16;/網(wǎng)卡對應(yīng)IPunsigned char ucPhysicalAddr6;/網(wǎng)卡對應(yīng)的MAC地址 if (pcap_findalldevs(&alldevs, errbuf) = -1)/獲取網(wǎng)卡鏈表 fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf);
9、; return; for (d=alldevs; d; d=d->next)/遍歷網(wǎng)卡鏈表 if (d->addresses != NULL && (p = strchr(d->name, '') != NULL
10、&& Getadapterbyname(p, szIPAddr, ucPhysicalAddr,szGateIPAddr)/獲取網(wǎng)卡的對應(yīng)信息for(int j = strlen(d->description) - 1; j > 0; j-)/對網(wǎng)卡的描述信息格式化if (d->descriptionj = 0x20)d->descriptionj = ''elsebreak;printf("n %d. %sntIP Address. . . . . : %sn", i, d->d
11、escription, szIPAddr);/格式化輸出網(wǎng)卡信息printf("tPhysical Address. . : %.2X-%.2X-%.2X-%.2X-%.2X-%.2Xn", ucPhysicalAddr0, ucPhysicalAddr1, ucPhysicalAddr2,ucPhysicalAddr3, ucPhysicalAddr4, ucPhysicalAddr5);printf("tDefault Gateway . . : %sn", szGateIPAddr);i +;
12、60; if (i=0) printf("nNo interfaces found! Make sure WinPcap is installed.n"); return; pcap
13、_freealldevs(alldevs);/釋放網(wǎng)卡鏈表科普Tips:“網(wǎng)卡”是神馬?計算機(jī)與外界局域網(wǎng)的連接是通過主機(jī)箱內(nèi)插入一塊網(wǎng)絡(luò)接口板(或者是在筆記本電腦中插入一塊PCMCIA卡)。網(wǎng)絡(luò)接口板又稱為通信適配器或網(wǎng)絡(luò)適配器(network adapter)或網(wǎng)絡(luò)接口卡NIC(Network Interface Card),但是更多的人愿意使用更為簡單的名稱“網(wǎng)卡”。利用上面的程序,我們可以查看計算機(jī)上可利用的所有網(wǎng)卡資源,以便選擇相應(yīng)的網(wǎng)卡資源進(jìn)行相關(guān)操作。為了便于觀察,我們在VMware虛擬機(jī)中進(jìn)行,首先在對應(yīng)的虛擬機(jī)設(shè)置中增加硬件選項(xiàng)中添加多塊網(wǎng)卡,然后配置相應(yīng)的IP,運(yùn)行程序,可
14、以得到對應(yīng)網(wǎng)卡的名稱描述、IP地址、MAC地址等。0×07 如何構(gòu)造和發(fā)送數(shù)據(jù)包上一步我們列出了所有的可用網(wǎng)卡資源,在發(fā)送數(shù)據(jù)包前,需要打開對應(yīng)的網(wǎng)卡來進(jìn)行發(fā)送數(shù)據(jù)包的操作。這里使用的函數(shù)是pcap_open_live:函數(shù)名稱:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) 函數(shù)功能:獲得用于捕獲網(wǎng)絡(luò)數(shù)據(jù)包的數(shù)據(jù)包捕獲描述字。 參數(shù)說明:device參數(shù)為指定打開的網(wǎng)絡(luò)設(shè)備名。snaplen參數(shù)定義捕獲數(shù)據(jù)的最大字節(jié)數(shù)。promisc指定是否將網(wǎng)絡(luò)接口置于混雜
15、模式。to_ms參數(shù)指定超時時間(毫秒)。ebuf參數(shù)則僅在pcap_open_live()函數(shù)出錯返回NULL時用于傳遞錯誤消息。返回值:打開的網(wǎng)卡句柄Arpspoof中將網(wǎng)卡的打開操作進(jìn)行了如下封裝,調(diào)用時直接輸入網(wǎng)卡序號即可,程序會對參數(shù)2、3、4進(jìn)行初始化設(shè)置:pcap_t* OpenAdapter(int uIndexofAdapter, char szIPSelf,unsigned char ucPhysicalAddr, char szGateIPAddr)pcap_if_t *alldevs;pcap_if_t
16、0;*d;pcap_t *fp = NULL; int i = 0; char errbufPCAP_ERRBUF_SIZE, *p; /* 這個API用來獲得網(wǎng)卡的列表 */ if (pcap_findalldevs(&alldevs, errbuf) = -1)
17、60; fprintf(stderr,"Error in pcap_findalldevs: %sn", errbuf); return NULL; /* 顯示列表的響應(yīng)字段的內(nèi)容 */ for (d=alldevs; d; d=d->next)
18、160; if (d->addresses != NULL && (p = strchr(d->name, '') != NULL&& Getadapterbyname(p, szIPSelf, ucPhysicalAddr, szGateIPAddr)if (i = uIndexofAdapter)if (fp = pcap_open_live(d->name, / 設(shè)備名稱65536,
19、160; / portion of the packet to capture./ 65536 grants that the whole packet will be captured on all the MACs.1, / 混雜模式1, /讀超時為1ms,越小越好errbuf / error buffer) = NULL)fprintf(stderr,"nUnable to open the adapter. %s is not supp
20、orted by WinPcapn", d->name);pcap_freealldevs(alldevs);return NULL;else/ 去掉網(wǎng)卡注釋右邊的空格for(int j = strlen(d->description) - 1; j > 0; j-)if (d->descriptionj = 0x20)d->descriptionj = ''elsebreak;printf("* Bind on %s %s .n", szIPSelf, d->description
21、);return fp;i +; if (i=0) printf("nNo interfaces found! Make sure WinPcap is installed.n"); return FALSE;
22、; /* We don't need any more the device list. Free it */ pcap_freealldevs(alldevs);return NULL; 使用范例:pcap_t *adhandle; / 網(wǎng)卡句柄unsigned char ucSelf6;char szIPSelf16, szIPGate16;if (adhandle = Op
23、enAdapter(0, szIPSelf, ucSelf, szIPGate) = NULL)printf("! Open adatper error!n");return FALSE;在獲取到網(wǎng)卡句柄并打開后,發(fā)送數(shù)據(jù)包就很容易了if(pcap_sendpacket(adhandle, (const unsigned char *) ucFrame,ucFrameLen) < 0)printf("Send Packet Errorn");return FALSE;ucFrame是封裝好的數(shù)據(jù)包,
24、ucFrameLen為數(shù)據(jù)包的長度。下面我們封裝一個例子,使用上述代碼發(fā)送ARP請求包,用于查詢某IP對應(yīng)的MAC地址。ARP協(xié)議格式關(guān)鍵代碼bool sendARPData(pcap_t *adhandle)u_char ucFrameARP_LEN;/ 設(shè)置Ethernet頭ETHeader eh = 0 ;memset(eh.dhost,0xff, 6);/ARP廣播包目的地址為ffffffffffffmemcpy(eh.shost, ucSelf, 6);eh.type = htons(ETHERTYPE_ARP);/幀類型為ARPmemcpy(
25、ucFrame, &eh, sizeof(eh); / 設(shè)置Arp頭ARPHeader ah = 0 ;ah.hrd = htons(ARPHRD_ETHER);ah.eth_type = htons(ETHERTYPE_IP);ah.maclen = 6;/硬件地址長度ah.iplen = 4;/IP地址長度ah.opcode = htons(ARP_REQUEST);/ARP請求包類型memcpy(ah.smac, ucSelf, 6); ah.saddr = inet_addr(szIPSelf); memset(ah.dmac, 0x00, 6)
26、;/ARP請求包中目的MAC地址均置0ah.daddr = inet_addr(""); /ARP請求的目的IP地址 memcpy(&ucFramesizeof(ETHeader), &ah, sizeof(ah); / 發(fā)送ARP數(shù)據(jù)包if(pcap_sendpacket(adhandle, (const unsigned char *) ucFrame,ARP_LEN) < 0)printf("Send Packet Errorn")
27、;return FALSE;return TRUE; 啟動wireshark進(jìn)行監(jiān)聽,運(yùn)行程序,我們可以看到如下結(jié)果,程序發(fā)出了一個ARP廣播包,用于查詢的主機(jī)MAC,并且目標(biāo)機(jī)在收到該查詢包后,進(jìn)行了回復(fù),將自己的MAC地址告訴了查詢發(fā)起的機(jī)器。0×08 如何監(jiān)聽分析數(shù)據(jù)包在監(jiān)聽數(shù)據(jù)包時,使用的關(guān)鍵函數(shù)為pcap_loop函數(shù)名稱:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);參數(shù)說明:p 是由pcap_open_live()
28、返回的所打開的網(wǎng)卡的指針;cnt用于設(shè)置所捕獲數(shù)據(jù)包的個數(shù);callback 是回調(diào)函數(shù),其原型為pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content);user值一般為NULL結(jié)合上面的代碼,我們在獲得并打開網(wǎng)卡句柄adhandle,使用下面的代碼并可捕獲數(shù)據(jù)包 /每次捕捉到數(shù)據(jù)包時,pcap都會自動調(diào)用這個回調(diào)函數(shù)void packet_handler(u_char *param, const struct pcap_pkthdr *he
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《初中生心理健康教育:理解自我關(guān)愛自我》課件
- 《校園意外傷害保險政策解讀與理賠流程課件》
- 《中醫(yī)養(yǎng)生科普宣講》課件
- 《巧按穴位守護(hù)健康》:課件
- 井下三違安全培訓(xùn)體系
- 《GBT16711-2022銀行業(yè)銀行電信報文商業(yè)標(biāo)識代碼》(2025版)深度解析
- 2022~2023學(xué)年廣東廣州天河區(qū)初一下學(xué)期期末語文試卷(含答案)
- 李曉紅-天津師范大學(xué)-多媒體課件設(shè)計
- 《數(shù)字營銷策略優(yōu)化課件》
- 《當(dāng)代建筑設(shè)計理念》課件
- 北師大版 2024-2025學(xué)年四年級數(shù)學(xué)上冊典型例題系列第六單元:商的變化規(guī)律和商不變的性質(zhì)專項(xiàng)練習(xí)(原卷版+解析)
- 2024年英語B級考試真題及答案
- 空調(diào)維護(hù)保養(yǎng)“三措兩案”及空調(diào)維修保養(yǎng)方案
- 人教版五年級英語123單元測試卷名校版含答案
- 施工升降機(jī)安裝拆卸安全教育
- 農(nóng)村土地承包法知識講座
- 采購培訓(xùn)總結(jié)報告
- 草木緣情:中國古典文學(xué)中的植物世界
- 中國絕緣材料產(chǎn)品及應(yīng)用手冊
- 擒拿格斗課件
- 中國馬克思主義與當(dāng)代思考題(附答案)
評論
0/150
提交評論