




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、WinPcap開發(fā)(一):零基礎入門*原創(chuàng)作者:追影人0×00 前言網(wǎng)絡編程在網(wǎng)絡安全方面具有舉足輕重的作用,如何快捷高效的監(jiān)聽、分析、構(gòu)造網(wǎng)絡流量,成為很多安全從業(yè)者需要解決的重點問題。而winpcap這一免費開源項目恰好可以為win32應用程序提供訪問網(wǎng)絡底層的能力,所以其成為了相關網(wǎng)絡編程的首選開發(fā)工具。0×01 winpcap是什么?winpcap(windows packet capture)是windows平臺下一個免費的網(wǎng)絡訪問系統(tǒng),可用于windows系統(tǒng)下的網(wǎng)絡編程。著名的wireshark便是基于winpcap開發(fā)的,大家在安裝wireshark中可以看
2、到winpcap驅(qū)動程序的安裝過程。有關winpcap的介紹網(wǎng)絡上很多,百科里面介紹的也很詳細,我就不再copy了。需要注意的一點是,winpcap并不是一個簡單的library,而是一個針對Win32平臺上的抓包和網(wǎng)絡分析的一個架構(gòu),它包括一個核心態(tài)的包過濾器,一個底層的動態(tài)鏈接庫(packet.dll)和一個高層的不依賴于系統(tǒng)的庫(wpcap.dll)。所以它只能“嗅探”到物理線路上的數(shù)據(jù)包,而不具備攔截的能力,因此不適用于個人防火墻等項目。0×02 你需要準備些什么?本系列文章主要帶大家認識和了解如何利用winpcap網(wǎng)絡編程技術(shù)進行網(wǎng)絡的協(xié)議分析、流量統(tǒng)計及網(wǎng)絡探測掃描等,這
3、里我們并不會去深硬的解讀相關源代碼,而是以輕松的方式結(jié)合實驗來對相關原理進行深入理解。在本系列文章中,筆者從簡到難,簡明介紹winpcap架構(gòu)原理、相關環(huán)境搭建及快速編寫核心代碼。但是在開始前,讀者需要有一些相關基礎:了解網(wǎng)絡協(xié)議相關基礎知識,掌握一門winpcap開發(fā)庫支持的編程語言,自己能動手實踐編寫一些例子。Winpcap提供的開發(fā)接口原生是c語言的,不過熱心腸的程序猿們已經(jīng)為其他語言的使用提供了封裝,比如java、.net、python,好像連易語言都有。本系列文章將使用c語言來進行各種實驗,有興趣的讀者可以將其轉(zhuǎn)換成自己熟悉的語言來動手實踐。0×03 你能學到什么?有關wi
4、npcap開發(fā)的文章在網(wǎng)上很容易找到,但是更多的都是對于代碼的講解,筆者在本文盡量系統(tǒng)性的從原理層面結(jié)合各個應用場景來介紹相關知識:1. Winpcap獲取網(wǎng)卡基本信息及收發(fā)數(shù)據(jù)包2. 存活主機探測3. 端口掃描4. Arp欺騙5. 中間人攻擊的簡單實現(xiàn)6. 流量統(tǒng)計與分析0×04 知識補充進行下面的介紹前,我們需要了解幾個名詞的關系。winpcap(windows packet capture)是windows平臺下一個免費的網(wǎng)絡訪問系統(tǒng),可用于windows系統(tǒng)下的網(wǎng)絡編程。linux
5、 平臺下對應的開發(fā)包是libpcap。Wireshark是基于winpcap處理網(wǎng)絡驅(qū)動層。Wpdpack是winpcap的開發(fā)包,提供開發(fā)相關程序的接口。0×05 環(huán)境準備首先根據(jù)你所選擇的開發(fā)語言選擇對應的編譯器,筆者使用c語言,利用VS2012進行相關開發(fā)。安裝好編譯器后,進行相關配置。下載wpdpack點擊這里 初學者可以選擇里面的Examples進行編譯,可以看到找不到頭文件,及相關庫。 這是因為wpdpack中的相關庫還沒有引入到編譯環(huán)境中 將wpdpack包中的Include和lib文件夾中的文件添加到VS的相關目錄下即可編譯通
6、過。將編譯后的程序進行運行則出現(xiàn)以下錯誤。 這是由于運行時缺乏動態(tài)鏈接庫導致,最簡單的方法是直接下載并安裝winpcap驅(qū)動程序 下載 如果你覺得這樣子很麻煩,也可以采用簡易方法。程序在運行時只需要winpcap在system32下面釋放的wpcap.dll和packet.dll,還有driver下面的npf.sys,所以不需要完整安裝winpcap,而選擇只復制以上三個文件到對應目錄中即可。本節(jié)筆者將采用著名的Arpspoof源碼進行相關講解,源碼下載地址0×06 枚舉可用網(wǎng)絡適配器資源在使用winpcap進行收發(fā)數(shù)據(jù)包時,需指定對應的網(wǎng)卡,所以有必要
7、列出計算機上所有可用的網(wǎng)絡適配資源。列取網(wǎng)卡信息的核心代碼:/該函數(shù)在Arpspoof程序中,筆者進行了詳細注釋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)卡對應網(wǎng)關地址char *p;/網(wǎng)卡名詞char szI
8、PAddr16;/網(wǎng)卡對應IPunsigned char ucPhysicalAddr6;/網(wǎ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)卡的對應信息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)卡”是神馬?計算機與外界局域網(wǎng)的連接是通過主機箱內(nèi)插入一塊網(wǎng)絡接口板(或者是在筆記本電腦中插入一塊PCMCIA卡)。網(wǎng)絡接口板又稱為通信適配器或網(wǎng)絡適配器(network adapter)或網(wǎng)絡接口卡NIC(Network Interface Card),但是更多的人愿意使用更為簡單的名稱“網(wǎng)卡”。利用上面的程序,我們可以查看計算機上可利用的所有網(wǎng)卡資源,以便選擇相應的網(wǎng)卡資源進行相關操作。為了便于觀察,我們在VMware虛擬機中進行,首先在對應的虛擬機設置中增加硬件選項中添加多塊網(wǎng)卡,然后配置相應的IP,運行程序,可
14、以得到對應網(wǎng)卡的名稱描述、IP地址、MAC地址等。0×07 如何構(gòu)造和發(fā)送數(shù)據(jù)包上一步我們列出了所有的可用網(wǎng)卡資源,在發(fā)送數(shù)據(jù)包前,需要打開對應的網(wǎng)卡來進行發(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)絡數(shù)據(jù)包的數(shù)據(jù)包捕獲描述字。 參數(shù)說明:device參數(shù)為指定打開的網(wǎng)絡設備名。snaplen參數(shù)定義捕獲數(shù)據(jù)的最大字節(jié)數(shù)。promisc指定是否將網(wǎng)絡接口置于混雜
15、模式。to_ms參數(shù)指定超時時間(毫秒)。ebuf參數(shù)則僅在pcap_open_live()函數(shù)出錯返回NULL時用于傳遞錯誤消息。返回值:打開的網(wǎng)卡句柄Arpspoof中將網(wǎng)卡的打開操作進行了如下封裝,調(diào)用時直接輸入網(wǎng)卡序號即可,程序會對參數(shù)2、3、4進行初始化設置: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; /* 顯示列表的響應字段的內(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, / 設備名稱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對應的MAC地址。ARP協(xié)議格式關鍵代碼bool sendARPData(pcap_t *adhandle)u_char ucFrameARP_LEN;/ 設置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); / 設置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進行監(jiān)聽,運行程序,我們可以看到如下結(jié)果,程序發(fā)出了一個ARP廣播包,用于查詢的主機MAC,并且目標機在收到該查詢包后,進行了回復,將自己的MAC地址告訴了查詢發(fā)起的機器。0×08 如何監(jiān)聽分析數(shù)據(jù)包在監(jiān)聽數(shù)據(jù)包時,使用的關鍵函數(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ù)據(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)科護理循環(huán)+泌尿系統(tǒng)鞏固試題
- 流動人口協(xié)管員工作總結(jié)
- 2025年四川省愛眾能源工程有限公司對外招聘考試筆試試題(含答案)
- 體育產(chǎn)業(yè)廠房轉(zhuǎn)租及賽事運營合同
- 車間租賃及智能化生產(chǎn)系統(tǒng)建設協(xié)議
- 銀行承兌匯票財務擔保合同賬務處理規(guī)定
- 建筑工地安全生產(chǎn)管理
- 特種設備安全監(jiān)管部門
- 加油站重大隱患專項排查整治方案
- 企業(yè)實行安全生產(chǎn)目標四級控制
- DZ∕T 0215-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 煤(正式版)
- GB/T 3428-2024架空導線用鍍鋅鋼線
- 中國特色社會主義民族發(fā)展理論研究
- 《責任勝于能力》課件
- GB/T 5465.2-2023電氣設備用圖形符號第2部分:圖形符號
- 廢氣治理設施運行管理規(guī)程制度
- 市政工程質(zhì)量通病防治措施
- 漢字的發(fā)展(英文版介紹)Chinese-character
- 供貨方案及供貨計劃范文六篇
- 華為“1+X”職業(yè)技能等級(網(wǎng)絡系統(tǒng)建設與運維)中級考試題庫(含答案)
- 單位財務內(nèi)控制度
評論
0/150
提交評論