日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对网络数据包进行嗅探

發布時間:2023/12/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对网络数据包进行嗅探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
例如我現在發表了一個帖子,點擊提問按鈕,我如何截獲點擊提問按鈕時所發出去的包呢?并把我發表的內容取出來。 ?
--------------------------------------------------------------- ?
--------------------------------------------------------------- ?
?
選自小豬的Blog: ?
?
一.捕獲數據包的實現原理 ?
?
二.捕獲數據包的編程實現: ?
?
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模型,接收方法差別很大,所以在此就不提供接收的代碼了。??

轉載于:https://www.cnblogs.com/henryzc/archive/2005/03/14/118270.html

總結

以上是生活随笔為你收集整理的对网络数据包进行嗅探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。