用C 抓取網路資料報 嗅探器的設計原理

2021-06-28 01:34:01 字數 1727 閱讀 1550

具體到程式設計實現上,這種對網絡卡混雜模式的設定是通過原始套接字(raw socket)來實現的,這也有別於通常經常使用的資料流套接字和資料報套接字。在建立了原始套接字後,需要通過setsockopt()函式來設定ip頭操作選項,然後再通過bind()函式將原始套接字繫結到本地網絡卡。為了讓原始套接字能接受所有的資料,還需要通過ioctlsocket()來進行設定,而且還可以指定是否親自處理ip頭。至此,實際就可以開始對網路資料報進行嗅探了,對資料報的獲取仍象流式套接字或資料報套接字那樣通過recv()函式來完成。但是與其他兩種套接字不同的是,原始套接字此時捕獲到的資料報並不僅僅是單純的資料資訊,而是包含有 ip頭、 tcp頭等資訊頭的最原始的資料資訊,這些資訊保留了它在網路傳輸時的原貌。通過對這些在低層傳輸的原始資訊的分析可以得到有關網路的一些資訊。由於這些資料經過了網路層和傳輸層的打包,因此需要根據其附加的幀頭對資料報進行分析。下面先給出結構.資料報的總體結構:

資料報ip頭 tcp頭(或其他資訊頭) 資料

資料在從應用層到達傳輸層時,將新增tcp資料段頭,或是udp資料段頭。其中udp資料段頭比較簡單,由乙個8位元組的頭和資料部分組成,具體格式如下:

16位 16位

源埠 目的埠

udp長度 udp校驗和

而tcp資料頭則比較複雜,以20個固定位元組開始,在固定頭後面還可以有一些長度不固定的可選項,下面給出tcp資料段頭的格式組成:

16位 16位

源埠 目的埠

順序號確認號

tcp頭長 (保留)7位 urg ack psh rst syn fin 視窗大小

校驗和 緊急指標

可選項(0或更多的32位字)

資料(可選項)

對於此tcp資料段頭的分析在程式設計實現中可通過資料結構_tcp來定義:

typedef struct _tcp tcp;

typedef tcp *lptcp;

typedef tcp unaligned * ulptcp;

在網路層,還要給tcp資料報新增乙個ip資料段頭以組成ip資料報。ip資料頭以大端點機次序傳送,從左到右,版本欄位的高位位元組先傳輸(sparc是大端點機;pentium是小端點機)。如果是小端點機,就要在傳送和接收時先行轉換然後才能進行傳輸。ip資料段頭格式如下:

16位 16位

版本 ihl 服務型別 總長

標識 標誌 分段偏移

生命期 協議 頭校驗和

源位址目的位址

選項(0或更多)

同樣,在實際程式設計中也需要通過乙個資料結構來表示此ip資料段頭,下面給出此資料結構的定義:

typedef struct _ip;

byte servicetype; // 服務型別

word totallen; // 總長

word id; // 標識

union;

byte timetolive; // 生命期

byte protocol; // 協議

word hdrchksum; // 頭校驗和

dword srcaddr; // 源位址

dword dstaddr; // 目的位址

byte options; // 選項

} ip;

typedef ip * lpip;

typedef ip unaligned * ulpip;

在明確了以上幾個資料段頭的組成結構後,就可以對捕獲到的資料報進行分析了。

利用arp發現網路中的嗅探器

1.sniffer原理 所謂知己知彼方能百戰不殆,要了解探測sniffer的方法,就先得了解sniffer的原理。首先,讓我們來看一看區域網中是怎樣傳輸資料的。當乙個資料報的目的地是區域網內的某台計算機時,此資料報將以廣播的形式被傳送到網內每一台計算機上。而每台計算機的網絡卡將分析資料報中的目的ma...

用 pc 抓取 vlan tag 的資料報

具體步驟 1.開啟 執行 輸入regedit,進入登錄檔 2.找到登錄檔中的 hkey local machine 3.在登錄檔 hkey local machine system下找到currentcontrolset 4.在currentcontrolset下找到control 5.在contr...

基於socket原始套接字的網路嗅探器

netsniffer.cpp 定義控制台應用程式的入口點。簡單說明一下什麼是網路嗅探器,網路嗅探器是乙個抓取所有經過網絡卡資料的軟體,在一般使用電腦時,網絡卡 只接受到傳送至本機的資料,那是因為這是網絡卡是非混雜模式的,擋乙個目的位址非本機位址的資料報經過網 卡時,網絡卡在資料鏈路層 mac位址 檢...