青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長網

17站長網 首頁 安全 安全教程 查看內容

詳細介紹如何捕獲網絡數據包

2022-9-24 09:44| 查看: 1614 |來源: 互聯網

經常看到論壇有人問起關于數據包的截獲、分析等問題,幸好本人也對此略有所知,也寫過很多的sniffer,所以就想寫一系列的文章來詳細深入的探討關于數據包的知識 ...

經?吹秸搲腥藛柶痍P于數據包的截獲、分析等問題,幸好本人也對此略有所知,也寫過很多的sniffer,所以就想寫一系列的文章來詳細深入的探討關于數據包的知識。
我希望通過這一系列的文章,能使得關于數據包的知識得以普及,所以這系列的每一篇文章我都會有由淺入深的解釋、詳細的分析、以及編碼步驟,另外附上帶有詳細注釋的源碼(為了照顧大多數朋友,我提供的都是MFC的源碼)。
不過由于也是初學者,疏漏之處還望不吝指正。
本文凝聚著筆者心血,如要轉載,請指明原作者及出處,謝謝!^_^
 
OK,. Let’s go !  Have fun!! q^_^p
 
第二篇   手把手教你捕獲數據包
目錄:
一.捕獲數據包的實現原理
二.捕獲數據包的編程實現:
1.   raw socket的實現方法
2.   Winpcap的實現方法
a.      枚舉本機網卡的信息
b.      打開相應網卡并設置為混雜模式
c.       截獲數據包并保存為文件
 
作者:
CSDN  VC/MFC 網絡編程版主 PiggyXP  
 
一.捕獲數據包的實現原理:--------------------------------------------------------------------
在通常情況下,網絡通信的套接字程序只能響應與自己硬件地址相匹配的或是以廣播形式發出的數據幀,對于其他形式的數據幀比如已到達網絡接口但卻不是發給此地址的數據幀,網絡接口在驗證投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關的的數據包。
所以我們要想實現截獲流經網絡設備的所有數據包,就要采取一點特別的手段了:
將網卡設置為混雜模式。
這樣一來,該主機的網卡就可以捕獲到所有流經其網卡的數據包和幀。
但是要注意一點,這種截獲僅僅是數據包的一份拷貝,而不能對其進行截斷,要想截斷網絡流量就要采用一些更底層的辦法了,不在本文的討論范圍之內。
 
二. 捕獲數據包的編程實現:
1.raw socket的實現方法--------------------------------------------------------------------
不同于我們常用的數據流套接字和數據報套接字,在創建了原始套接字后,需要用WSAIoctl()函數來設置一下,它的定義是這樣的  
int WSAIoctl(
 SOCKET s,
 DWORD dwIoControlCode,
 LPVOID lpvInBuffer,
 DWORD cbInBuffer,
 LPVOID lpvOutBuffer,
 DWORD cbOutBuffer,
 LPDWORD lpcbBytesReturned,
 LPWSAOVERLAPPED lpOverlapped,
 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
雖然咋一看參數比較多,但是其實我們最關心的只是其中的第二項而已,我們需要做的就是把第二項設置為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,             //創建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結構的內容
 sa.sin_family = AF_INET;
 sa.sin_port = htons(6000);           // 端口號可以隨便改,當然與當然系統不能沖突
 memcpy(&(sa.sin_addr),pHostent->h_addr,pHostent->h_length);
 
bind(SnifferSocket,(LPSOCKADDR)&sa,sizeof(sa));            //綁定
 // 置ioctl來接收所有網絡數據,關鍵步驟
 DWORD dwBufferLen[10] ;
 DWORD dwBufferInLen = 1 ;
 DWORD dwBytesReturned = 0 ;
 WSAIoctl(SnifferSocket, IO_RCVALL,&dwBufferInLen, izeof(dwBufferInLen),
&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
至此,實際就可以開始對網絡數據包進行嗅探了,而對于數據包的接收還是和普通的socket一樣,通過recv()函數來完成,因為這里涉及到不同的socket模型,接收方法差別很大,所以在此就不提供接收的代碼了。
 
2.winpcap的實現方法:-----------------------------------------------------------------------
winpcap驅動包,是我們玩轉數據包不可或缺的好東東,winpcap的主要功能在于獨立于主機協議(如TCP-IP)而發送和接收原始數據報,主要為我們提供了四大功能:
功能:
1> 捕獲原始數據報,包括在共享網絡上各主機發送/接收的以及相互之間交換的數據報;
2> 在數據報發往應用程序之前,按照自定義的規則將某些特殊的數據報過濾掉;
3> 在網絡上發送原始的數據報;
4> 收集網絡通信過程中的統計信息
如果環境允許的話(比如你做的不是木馬程序),我還是推薦大家用winpcap來截獲數據包,因為它的功能更強大,工作效率更高,唯一的缺點就是在運行用winpcap開發的程序以前,都要在主機上先安裝winpcap的driver。
而且一會我們就會發現它比raw socket功能強大的多,而且工作得更為底層,最明顯的理由就是raw socket捕獲的數據包是沒有以太頭的,此乃后話。
至于怎么來安裝使用,請參考本系列的系列一《手把手教你玩轉ARP包中的》,里面有詳細的加載winpcap驅動的方法^_^
廢話不多說了,讓我們轉入正題, 具體用winpcap來截獲數據包需要做如下的一些工作:
A . 枚舉本機網卡的信息(主要是獲得網卡的名稱)
  其中要用到pcap_findalldevs函數,它是這樣定義的
  /*************************************************
int pcap_findalldevs  (  pcap_if_t **    alldevsp,  
char *    errbuf  
 )  
功能:
枚舉系統所有網絡設備的信息
參數:  alldevsp:  是一個pcap_if_t結構體的指針,如果函數pcap_findalldevs函數執行成功,將獲得一個可用網卡的列表,而里面存儲的就是第一個元素的指針。
Errbuf:    存儲錯誤信息的字符串
返回值: int :   如果返回0 則執行成功,錯誤返回 -1。
 *************************************************/
  我們利用這個函數來獲得網卡名字的完整代碼如下:
 
  pcap_if_t* alldevs;
  pcap_if_t* d;
  char errbuf[PCAP_ERRBUF_SIZE];
  pcap_findalldevs(&alldevs,errbuf);       // 獲得網絡設備指針
  for(d=alldevs;d;d=d->next)               // 枚舉網卡然后添加到ComboBox中
  {
d->name;                            // d->name就是我們需要的網卡名字字符串,按照你// 自己的需要保存到你的相應變量中去  
  }
pcap_freealldevs(alldevs);               // 釋放alldev資源
B. 打開相應網卡并設置為混雜模式: 在此之前肯定要有一段讓用戶選擇網卡、并獲得用戶選擇的網卡的名字的代碼,既然上面已經可以獲得所有網卡的名字了,這段代碼就暫且略過了。

tag標簽:網絡數據包
本文最后更新于 2022-9-24 09:44,某些文章具有時效性,若有錯誤或已失效,請在網站留言或聯系站長:17tui@17tui.com
·END·
站長網微信號:w17tui,關注站長、創業、關注互聯網人 - 互聯網創業者營銷服務中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!

17站長網微信二維碼

始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!

掃一掃,關注站長網微信

大家都在看

    熱門排行

      最近更新

        返回頂部
        主站蜘蛛池模板: 亚洲 欧美无码原创区 | 一级毛片免费下载 | 欧美手机在线播放 | 99久久热视频只有精品 | 精品三级在线观看 | 97国产精品人妻无码免费 | 郭德纲于谦2012最新相声 | 狠狠色噜噜狠狠狠狠米奇777 | 国产精品视频大全 | 国产精品综合AV一区二区国产馆 | 国产色青青视频在线观看 | www色小姐 | 国产精品野外AV久久久 | 中文字幕亚洲乱码熟女在线 | 99国产福利| 国产Av影片麻豆精品传媒 | 亚洲免费在线观看视频 | 国产成人AV永久免费观看 | 无码不卡中文字幕在线观看 | 在线视频一区二区三区在线播放 | 女人和男人插曲视频大全 | 一级无毛片 | 4480YY旧里番在线播放 | 99在线免费视频 | 亚洲 欧美 国产 综合五月天 | 香蕉久久日日躁夜夜嗓 | 成人久久欧美日韩一区二区三区 | 两个奶头被吃得又翘又痛 | 草莓视频在线观看完整高清免费 | 久久频这里精品99香蕉久网址 | 潮 喷女王cytherea | chinese黑人第一次 | 国产又粗又猛又爽又黄的免费视频 | qvod 在线电影 | 久久性色AV亚洲电影无码 | 白丝女仆被强扒内裤 | 国产精品女上位在线观看 | 久cao在线香蕉 | HEYZO无码中文字幕人妻 | 俺来也俺去也视频久久 | 女人 我狠狠疼你 |