




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、WinPcap開發(fā)(一):零基礎(chǔ)入門*原創(chuàng)作者:追影人0×00 前言網(wǎng)絡(luò)編程在網(wǎng)絡(luò)安全方面具有舉足輕重的作用,如何快捷高效的監(jiān)聽、分析、構(gòu)造網(wǎng)絡(luò)流量,成為很多安全從業(yè)者需要解決的重點(diǎn)問(wèn)題。而winpcap這一免費(fèi)開源項(xiàng)目恰好可以為win32應(yīng)用程序提供訪問(wèn)網(wǎng)絡(luò)底層的能力,所以其成為了相關(guān)網(wǎng)絡(luò)編程的首選開發(fā)工具。0×01 winpcap是什么?winpcap(windows packet capture)是windows平臺(tái)下一個(gè)免費(fèi)的網(wǎng)絡(luò)訪問(wèn)系統(tǒng),可用于windows系統(tǒng)下的網(wǎng)絡(luò)編程。著名的wireshark便是基于winpcap開發(fā)的,大家在安裝wireshark中可以看
2、到winpcap驅(qū)動(dòng)程序的安裝過(guò)程。有關(guān)winpcap的介紹網(wǎng)絡(luò)上很多,百科里面介紹的也很詳細(xì),我就不再copy了。需要注意的一點(diǎn)是,winpcap并不是一個(gè)簡(jiǎn)單的library,而是一個(gè)針對(duì)Win32平臺(tái)上的抓包和網(wǎng)絡(luò)分析的一個(gè)架構(gòu),它包括一個(gè)核心態(tài)的包過(guò)濾器,一個(gè)底層的動(dòng)態(tài)鏈接庫(kù)(packet.dll)和一個(gè)高層的不依賴于系統(tǒng)的庫(kù)(wpcap.dll)。所以它只能“嗅探”到物理線路上的數(shù)據(jù)包,而不具備攔截的能力,因此不適用于個(gè)人防火墻等項(xiàng)目。0×02 你需要準(zhǔn)備些什么?本系列文章主要帶大家認(rèn)識(shí)和了解如何利用winpcap網(wǎng)絡(luò)編程技術(shù)進(jìn)行網(wǎng)絡(luò)的協(xié)議分析、流量統(tǒng)計(jì)及網(wǎng)絡(luò)探測(cè)掃描等,這
3、里我們并不會(huì)去深硬的解讀相關(guān)源代碼,而是以輕松的方式結(jié)合實(shí)驗(yàn)來(lái)對(duì)相關(guān)原理進(jìn)行深入理解。在本系列文章中,筆者從簡(jiǎn)到難,簡(jiǎn)明介紹winpcap架構(gòu)原理、相關(guān)環(huán)境搭建及快速編寫核心代碼。但是在開始前,讀者需要有一些相關(guān)基礎(chǔ):了解網(wǎng)絡(luò)協(xié)議相關(guān)基礎(chǔ)知識(shí),掌握一門winpcap開發(fā)庫(kù)支持的編程語(yǔ)言,自己能動(dòng)手實(shí)踐編寫一些例子。Winpcap提供的開發(fā)接口原生是c語(yǔ)言的,不過(guò)熱心腸的程序猿們已經(jīng)為其他語(yǔ)言的使用提供了封裝,比如java、.net、python,好像連易語(yǔ)言都有。本系列文章將使用c語(yǔ)言來(lái)進(jìn)行各種實(shí)驗(yàn),有興趣的讀者可以將其轉(zhuǎn)換成自己熟悉的語(yǔ)言來(lái)動(dòng)手實(shí)踐。0×03 你能學(xué)到什么?有關(guān)wi
4、npcap開發(fā)的文章在網(wǎng)上很容易找到,但是更多的都是對(duì)于代碼的講解,筆者在本文盡量系統(tǒng)性的從原理層面結(jié)合各個(gè)應(yīng)用場(chǎng)景來(lái)介紹相關(guān)知識(shí):1. Winpcap獲取網(wǎng)卡基本信息及收發(fā)數(shù)據(jù)包2. 存活主機(jī)探測(cè)3. 端口掃描4. Arp欺騙5. 中間人攻擊的簡(jiǎn)單實(shí)現(xiàn)6. 流量統(tǒng)計(jì)與分析0×04 知識(shí)補(bǔ)充進(jìn)行下面的介紹前,我們需要了解幾個(gè)名詞的關(guān)系。winpcap(windows packet capture)是windows平臺(tái)下一個(gè)免費(fèi)的網(wǎng)絡(luò)訪問(wèn)系統(tǒng),可用于windows系統(tǒng)下的網(wǎng)絡(luò)編程。linux
5、 平臺(tái)下對(duì)應(yīng)的開發(fā)包是libpcap。Wireshark是基于winpcap處理網(wǎng)絡(luò)驅(qū)動(dòng)層。Wpdpack是winpcap的開發(fā)包,提供開發(fā)相關(guān)程序的接口。0×05 環(huán)境準(zhǔn)備首先根據(jù)你所選擇的開發(fā)語(yǔ)言選擇對(duì)應(yīng)的編譯器,筆者使用c語(yǔ)言,利用VS2012進(jìn)行相關(guān)開發(fā)。安裝好編譯器后,進(jìn)行相關(guān)配置。下載wpdpack點(diǎn)擊這里 初學(xué)者可以選擇里面的Examples進(jìn)行編譯,可以看到找不到頭文件,及相關(guān)庫(kù)。 這是因?yàn)閣pdpack中的相關(guān)庫(kù)還沒有引入到編譯環(huán)境中 將wpdpack包中的Include和lib文件夾中的文件添加到VS的相關(guān)目錄下即可編譯通
6、過(guò)。將編譯后的程序進(jìn)行運(yùn)行則出現(xiàn)以下錯(cuò)誤。 這是由于運(yùn)行時(shí)缺乏動(dòng)態(tài)鏈接庫(kù)導(dǎo)致,最簡(jiǎn)單的方法是直接下載并安裝winpcap驅(qū)動(dòng)程序 下載 如果你覺得這樣子很麻煩,也可以采用簡(jiǎn)易方法。程序在運(yùn)行時(shí)只需要winpcap在system32下面釋放的wpcap.dll和packet.dll,還有driver下面的npf.sys,所以不需要完整安裝winpcap,而選擇只復(fù)制以上三個(gè)文件到對(duì)應(yīng)目錄中即可。本節(jié)筆者將采用著名的Arpspoof源碼進(jìn)行相關(guān)講解,源碼下載地址0×06 枚舉可用網(wǎng)絡(luò)適配器資源在使用winpcap進(jìn)行收發(fā)數(shù)據(jù)包時(shí),需指定對(duì)應(yīng)的網(wǎng)卡,所以有必要
7、列出計(jì)算機(jī)上所有可用的網(wǎng)絡(luò)適配資源。列取網(wǎng)卡信息的核心代碼:/該函數(shù)在Arpspoof程序中,筆者進(jìn)行了詳細(xì)注釋void ListAdapters()pcap_if_t *alldevs;/用于存儲(chǔ)網(wǎng)卡鏈表的頭指針pcap_if_t *d;/用于遍歷網(wǎng)卡鏈表的臨時(shí)變量 int i = 0;/記錄網(wǎng)卡個(gè)數(shù)char errbufPCAP_ERRBUF_SIZE;/存儲(chǔ)錯(cuò)誤信息char szGateIPAddr16;/網(wǎng)卡對(duì)應(yīng)網(wǎng)關(guān)地址char *p;/網(wǎng)卡名詞char szI
8、PAddr16;/網(wǎng)卡對(duì)應(yīng)IPunsigned char ucPhysicalAddr6;/網(wǎng)卡對(duì)應(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)卡的對(duì)應(yīng)信息for(int j = strlen(d->description) - 1; j > 0; j-)/對(duì)網(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ì)算機(jī)與外界局域網(wǎng)的連接是通過(guò)主機(jī)箱內(nèi)插入一塊網(wǎng)絡(luò)接口板(或者是在筆記本電腦中插入一塊PCMCIA卡)。網(wǎng)絡(luò)接口板又稱為通信適配器或網(wǎng)絡(luò)適配器(network adapter)或網(wǎng)絡(luò)接口卡NIC(Network Interface Card),但是更多的人愿意使用更為簡(jiǎn)單的名稱“網(wǎng)卡”。利用上面的程序,我們可以查看計(jì)算機(jī)上可利用的所有網(wǎng)卡資源,以便選擇相應(yīng)的網(wǎng)卡資源進(jìn)行相關(guān)操作。為了便于觀察,我們?cè)赩Mware虛擬機(jī)中進(jìn)行,首先在對(duì)應(yīng)的虛擬機(jī)設(shè)置中增加硬件選項(xiàng)中添加多塊網(wǎng)卡,然后配置相應(yīng)的IP,運(yùn)行程序,可
14、以得到對(duì)應(yīng)網(wǎng)卡的名稱描述、IP地址、MAC地址等。0×07 如何構(gòu)造和發(fā)送數(shù)據(jù)包上一步我們列出了所有的可用網(wǎng)卡資源,在發(fā)送數(shù)據(jù)包前,需要打開對(duì)應(yīng)的網(wǎng)卡來(lái)進(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ù)說(shuō)明:device參數(shù)為指定打開的網(wǎng)絡(luò)設(shè)備名。snaplen參數(shù)定義捕獲數(shù)據(jù)的最大字節(jié)數(shù)。promisc指定是否將網(wǎng)絡(luò)接口置于混雜
15、模式。to_ms參數(shù)指定超時(shí)時(shí)間(毫秒)。ebuf參數(shù)則僅在pcap_open_live()函數(shù)出錯(cuò)返回NULL時(shí)用于傳遞錯(cuò)誤消息。返回值:打開的網(wǎng)卡句柄Arpspoof中將網(wǎng)卡的打開操作進(jìn)行了如下封裝,調(diào)用時(shí)直接輸入網(wǎng)卡序號(hào)即可,程序會(huì)對(duì)參數(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; /* 這個(gè)API用來(lái)獲得網(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, /讀超時(shí)為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ù)包的長(zhǎng)度。下面我們封裝一個(gè)例子,使用上述代碼發(fā)送ARP請(qǐng)求包,用于查詢某IP對(duì)應(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;/硬件地址長(zhǎng)度ah.iplen = 4;/IP地址長(zhǎng)度ah.opcode = htons(ARP_REQUEST);/ARP請(qǐng)求包類型memcpy(ah.smac, ucSelf, 6); ah.saddr = inet_addr(szIPSelf); memset(ah.dmac, 0x00, 6)
26、;/ARP請(qǐng)求包中目的MAC地址均置0ah.daddr = inet_addr(""); /ARP請(qǐng)求的目的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; 啟動(dòng)wireshark進(jìn)行監(jiān)聽,運(yùn)行程序,我們可以看到如下結(jié)果,程序發(fā)出了一個(gè)ARP廣播包,用于查詢的主機(jī)MAC,并且目標(biāo)機(jī)在收到該查詢包后,進(jìn)行了回復(fù),將自己的MAC地址告訴了查詢發(fā)起的機(jī)器。0×08 如何監(jiān)聽分析數(shù)據(jù)包在監(jiān)聽數(shù)據(jù)包時(shí),使用的關(guān)鍵函數(shù)為pcap_loop函數(shù)名稱:int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);參數(shù)說(shuō)明:p 是由pcap_open_live()
28、返回的所打開的網(wǎng)卡的指針;cnt用于設(shè)置所捕獲數(shù)據(jù)包的個(gè)數(shù);callback 是回調(diào)函數(shù),其原型為pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content);user值一般為NULL結(jié)合上面的代碼,我們?cè)讷@得并打開網(wǎng)卡句柄adhandle,使用下面的代碼并可捕獲數(shù)據(jù)包 /每次捕捉到數(shù)據(jù)包時(shí),pcap都會(huì)自動(dòng)調(diào)用這個(gè)回調(diào)函數(shù)void packet_handler(u_char *param, const struct pcap_pkthdr *he
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)男士牛仔上衣行業(yè)深度研究及發(fā)展前景投資評(píng)估分析
- 2025至2030中國(guó)生命素內(nèi)衣行業(yè)市場(chǎng)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 美術(shù)培訓(xùn)沙發(fā)課件
- 教育前沿技術(shù)與人才培養(yǎng)研究
- 技術(shù)趨勢(shì)與商業(yè)競(jìng)爭(zhēng)-對(duì)現(xiàn)有工具的分析
- 健康醫(yī)療領(lǐng)域中的品牌形象建設(shè)研究
- 醫(yī)療行業(yè)線上教育活動(dòng)策劃全解析
- 企業(yè)培訓(xùn)的未來(lái)-虛擬現(xiàn)實(shí)技術(shù)的前景與挑戰(zhàn)
- 教育行業(yè)中的精準(zhǔn)決策支持系統(tǒng)研究
- 醫(yī)學(xué)教育與專業(yè)發(fā)展的動(dòng)機(jī)驅(qū)動(dòng)與效果衡量
- 市政工程質(zhì)量通病防治措施
- 《三國(guó)的世界》解說(shuō)詞 第五集
- 供貨方案及供貨計(jì)劃范文六篇
- 全老舊小區(qū)改造配套基礎(chǔ)設(shè)施項(xiàng)目工程監(jiān)理實(shí)施細(xì)則
- DB41T 1564-2018豫南再生稻栽培技術(shù)規(guī)程
- 統(tǒng)編初中《道德與法治》課標(biāo)解讀與新教材介紹課件
- GB/T 5975-1986鋼絲繩用壓板
- GB/T 3235-2008通風(fēng)機(jī)基本型式、尺寸參數(shù)及性能曲線
- GA/T 1127-2013安全防范視頻監(jiān)控?cái)z像機(jī)通用技術(shù)要求
- 心臟術(shù)后圍手術(shù)期的液體管理原則及注意點(diǎn)課件
- 內(nèi)膜系統(tǒng)溶酶體過(guò)氧化物酶體
評(píng)論
0/150
提交評(píng)論