WinPcap開發(fā)(一):零基礎(chǔ)入門_第1頁
WinPcap開發(fā)(一):零基礎(chǔ)入門_第2頁
WinPcap開發(fā)(一):零基礎(chǔ)入門_第3頁
WinPcap開發(fā)(一):零基礎(chǔ)入門_第4頁
WinPcap開發(fā)(一):零基礎(chǔ)入門_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論