国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
手把手教你捕獲數(shù)據(jù)包(上)【數(shù)據(jù)包的游戲系列之二】

  

     經(jīng)??吹秸搲腥藛柶痍P于數(shù)據(jù)包的截獲、分析等問題,幸好本人也對此略有所知,也寫過很多的sniffer,所以就想寫一系列的文章來詳細深入的探討關于數(shù)據(jù)包的知識。

我希望通過這一系列的文章,能使得關于數(shù)據(jù)包的知識得以普及,所以這系列的每一篇文章我都會有由淺入深的解釋、詳細的分析、以及編碼步驟,另外附上帶有詳細注釋的源碼(為了照顧大多數(shù)朋友,我提供的都是MFC的源碼)。

不過由于也是初學者,疏漏之處還望不吝指正。

本文凝聚著筆者心血,如要轉(zhuǎn)載,請指明原作者及出處,謝謝!^_^

 

OK,. Let’s go !  Have fun!! q^_^p

 

第二篇   手把手教你捕獲數(shù)據(jù)包

目錄:

一.捕獲數(shù)據(jù)包的實現(xiàn)原理

二.捕獲數(shù)據(jù)包的編程實現(xiàn):

1.   raw socket的實現(xiàn)方法

2.   Winpcap的實現(xiàn)方法

a.      枚舉本機網(wǎng)卡的信息

b.      打開相應網(wǎng)卡并設置為混雜模式

c.       截獲數(shù)據(jù)包并保存為文件

 

作者:

CSDN  VC/MFC 網(wǎng)絡編程版主 PiggyXP 

 

一.捕獲數(shù)據(jù)包的實現(xiàn)原理:--------------------------------------------------------------------

在通常情況下,網(wǎng)絡通信的套接字程序只能響應與自己硬件地址相匹配的或是以廣播形式發(fā)出的數(shù)據(jù)幀,對于其他形式的數(shù)據(jù)幀比如已到達網(wǎng)絡接口但卻不是發(fā)給此地址的數(shù)據(jù)幀,網(wǎng)絡接口在驗證投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關的的數(shù)據(jù)包。

所以我們要想實現(xiàn)截獲流經(jīng)網(wǎng)絡設備的所有數(shù)據(jù)包,就要采取一點特別的手段了:

將網(wǎng)卡設置為混雜模式

這樣一來,該主機的網(wǎng)卡就可以捕獲到所有流經(jīng)其網(wǎng)卡的數(shù)據(jù)包和幀。

但是要注意一點,這種截獲僅僅是數(shù)據(jù)包的一份拷貝,而不能對其進行截斷,要想截斷網(wǎng)絡流量就要采用一些更底層的辦法了,不在本文的討論范圍之內(nèi)。

 

二. 捕獲數(shù)據(jù)包的編程實現(xiàn):

1.raw socket的實現(xiàn)方法--------------------------------------------------------------------

不同于我們常用的數(shù)據(jù)流套接字和數(shù)據(jù)報套接字,在創(chuàng)建了原始套接字后,需要用WSAIoctl()函數(shù)來設置一下,它的定義是這樣的

int WSAIoctl(

  SOCKET s,

  DWORD dwIoControlCode,

  LPVOID lpvInBuffer,

  DWORD cbInBuffer,

  LPVOID lpvOutBuffer,

  DWORD cbOutBuffer,

  LPDWORD lpcbBytesReturned,

  LPWSAOVERLAPPED lpOverlapped,

  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

雖然咋一看參數(shù)比較多,但是其實我們最關心的只是其中的第二項而已,我們需要做的就是把第二項設置為SIO_RCVALL,講了這么多其實要做的就是這么一行代碼,很簡單吧?^_^

 當然我們還可以指定是否親自處理IP頭,但是這并不是必須的。

完整的代碼類似與如下這樣,加粗的代碼是與平常不同的需要注意的地方:

( 為了讓代碼一目了然,我把錯誤處理去掉了,下同)

 

#include “WinSock2.h”

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

 

SOCKET SnifferSocket

  WSADATA wsaData;

  iFlag=WSAStartup(MAKEWORD(2,2),&wsaData);           //開啟winsock.dll

                                 

SnifferSocket=WSASocket(AF_INET,             //創(chuàng)建raw  socket

SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);

 

  char FAR name[128];                                //獲取本機IP地址

gethostname(name, sizeof(name));

  struct hostent FAR * pHostent;

  pHostent = gethostbyname(name);

 

  SOCKADDR_IN sa;                           //填充SOCKADDR_IN結構的內(nèi)容

  sa.sin_family = AF_INET;

  sa.sin_port = htons(6000);           // 端口號可以隨便改,當然與當然系統(tǒng)不能沖突

  memcpy(&(sa.sin_addr),pHostent->h_addr,pHostent->h_length);

 

bind(SnifferSocket,(LPSOCKADDR)&sa,sizeof(sa));            //綁定

 

  // ioctl來接收所有網(wǎng)絡數(shù)據(jù),關鍵步驟

  DWORD dwBufferLen[10] ;

  DWORD dwBufferInLen = 1 ;

  DWORD dwBytesReturned = 0 ;

  WSAIoctl(SnifferSocket, IO_RCVALL,&dwBufferInLen, izeof(dwBufferInLen),

        &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );

 

至此,實際就可以開始對網(wǎng)絡數(shù)據(jù)包進行嗅探了,而對于數(shù)據(jù)包的接收還是和普通的socket一樣,通過recv()函數(shù)來完成,因為這里涉及到不同的socket模型,接收方法差別很大,所以在此就不提供接收的代碼了。

 

2.winpcap的實現(xiàn)方法:-----------------------------------------------------------------------

winpcap驅(qū)動包,是我們玩轉(zhuǎn)數(shù)據(jù)包不可或缺的好東東,winpcap的主要功能在于獨立于主機協(xié)議(如TCP-IP)而發(fā)送和接收原始數(shù)據(jù)報,主要為我們提供了四大功能:

功能:
    1>
捕獲原始數(shù)據(jù)報,包括在共享網(wǎng)絡上各主機發(fā)送/接收的以及相互之間交換的數(shù)據(jù)報;
    2>
在數(shù)據(jù)報發(fā)往應用程序之前,按照自定義的規(guī)則將某些特殊的數(shù)據(jù)報過濾掉;
    3>
在網(wǎng)絡上發(fā)送原始的數(shù)據(jù)報;
    4>
收集網(wǎng)絡通信過程中的統(tǒng)計信息

如果環(huán)境允許的話(比如你做的不是木馬程序),我還是推薦大家用winpcap來截獲數(shù)據(jù)包,因為它的功能更強大,工作效率更高,唯一的缺點就是在運行用winpcap開發(fā)的程序以前,都要在主機上先安裝winpcapdriver。

而且一會我們就會發(fā)現(xiàn)它比raw socket功能強大的多,而且工作得更為底層,最明顯的理由就是raw socket捕獲的數(shù)據(jù)包是沒有以太頭的,此乃后話。

至于怎么來安裝使用,請參考本系列的系列一《手把手教你玩轉(zhuǎn)ARP包中的》,里面有詳細的加載winpcap驅(qū)動的方法^_^

廢話不多說了,讓我們轉(zhuǎn)入正題, 具體用winpcap來截獲數(shù)據(jù)包需要做如下的一些工作:

A . 枚舉本機網(wǎng)卡的信息(主要是獲得網(wǎng)卡的名稱)

   其中要用到pcap_findalldevs函數(shù),它是這樣定義的

   /*************************************************

int pcap_findalldevs  (  pcap_if_t **    alldevsp, 

                             char *    errbuf

                          ) 

     功能:

             枚舉系統(tǒng)所有網(wǎng)絡設備的信息

     參數(shù):  alldevsp  是一個pcap_if_t結構體的指針,如果函數(shù)pcap_findalldevs函數(shù)執(zhí)行成功,將獲得一個可用網(wǎng)卡的列表,而里面存儲的就是第一個元素的指針。

             Errbuf    存儲錯誤信息的字符串

     返回值: int    如果返回0 則執(zhí)行成功,錯誤返回 -1。

  *************************************************/

   我們利用這個函數(shù)來獲得網(wǎng)卡名字的完整代碼如下:

 

       pcap_if_t* alldevs;

       pcap_if_t* d;

       char errbuf[PCAP_ERRBUF_SIZE];

       pcap_findalldevs(&alldevs,errbuf);       // 獲得網(wǎng)絡設備指針

       for(d=alldevs;d;d=d->next)               // 枚舉網(wǎng)卡然后添加到ComboBox

       {

d->name;                            // d->name就是我們需要的網(wǎng)卡名字字符串,按照你// 自己的需要保存到你的相應變量中去

       }

pcap_freealldevs(alldevs);               // 釋放alldev資源

 

請期待下文。。。。。^_^

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
循序漸進學習使用WINPCAP
使用winpcap庫打造網(wǎng)絡端口監(jiān)聽程序(三)
WinpCap的詳解(一)
Wincap
wimpcap基礎知識 good
libpcap 得到本機網(wǎng)卡設備列表
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服