1. 程式人生 > >網路嗅探器(Sniffer)的原理與實現(1)

網路嗅探器(Sniffer)的原理與實現(1)

.背景

為了使不同體系結構的計算機網路都能進行互聯,國際標準化組織ISO1997年成立了專門的結構研究這個問題。不久他們就提出了一個試圖使各種計算機在世界範圍內都能互聯的成網的標準框架,即著名的OSI/RM(Open Systems Interconnection Reference Model , 開放系統互聯基本參考模型),簡稱為OSI。它的主要目標是:只要遵循OSI標準,一個系統就可以和位於世界任何地方的,也遵循同一標準的其他任何系統進行通訊。

OSI採用分層結構,每一層完成不同的功能,較好地從理論上解決了不同系統之間互聯的難題。但是由於OSI模型歸於複雜以及種種原因,當它被制定出來時,

TCP/IP已經成為事實上的國際標準。

二.TCP/IP 4層結構

通常意義上的TCP/IP結構共有4層協議,從下到上依次是網路協議層,互聯協議層,傳輸層和應用層,不同的層次上執行的協議也不同。

1.網路協議層

網路協議層工作在TCP/IP模型的最底層,它負責將資料通過電纜傳送出去,並將接收到的訊號通過網絡卡驅動轉換成計算機能夠識別的資料。主要是管理網路資料包的接收很傳送,在作業系統中主要體現在裝置驅動程式和網路介面。對應各種網路通訊介質,不同的通訊網路有其不同的訪問協議,例如通常用的乙太網和PPP等。

執行至這一層的協議主要有:Ethernet 802.3等等。

2.互聯協議層

互聯協議層是十分重要的一層,網絡卡驅動將解析後的資料遞交給互聯協議層,互聯協議層的工作主要就是對這些混亂的資料進行解析,然後分門別類地傳遞給不同的上層協議。

執行在這一層的協議主要由:IP( Internet Protocol )ICMP( Internet Control Message Protocol ),ARP( Address Resolution Protocol , 地址轉換協議),RARP( Reverse Address Resolution Protocol .反向地址解析協議)

3.傳輸層協議

傳輸層協議有兩個具有代表性的協議,分別是TCP( Transmission Control Protocol , 傳輸控制協議UDP( User Datagram Protocol ,使用者資料報協議)。

TCP的面向連線的通訊協議,通過三次握手建立連線,通訊完後要斷開連線。由於它是面向連線的協議,那麼它只能用於點對點之間的通訊。

TCP是一種可靠的資料流服務,採用“重傳”和“肯定確認”機制來實現傳輸的可靠性。TCP還採用一種滑動視窗的方式進行流量的控制。所謂的視窗表示的是接收能力,用於限制傳送方的傳送速度。

UDP是面向無連線的通訊協議,UDP資料包括目的埠號和源埠號資訊,由於通訊不需要連線,所以它可以實現廣播發送。UDP通訊時不需要接收方的確認,屬於不可靠的傳輸,可能會出現丟包的現象,實際應用中要求在程式設計師程式設計驗證。

4.應用層協議

應用層協議一般是面向使用者的服務,如FTPTelnet,DNSSMTPPOP3等。

四.相關概念詳解

1.ARP/RARP

ARP/RARP協議是進行IP地址和MAC地址相互轉換的協議。在網路資料通訊中,鏈路層使用MAC地址進行實際的資料通訊,而在網路層使用IP地址進行機器定位定址。ARP協議把IP地址對映為MAC地址,而RARP協議是通過MAC地址對映為IP地址。

ARP請求應答報文是一種比較常用的資料包,它的主要目的是找到IP地址對應的MAC地址。利用ARP請求報文來獲得其MAC地址。這個過程是這樣的:

首先發送ARP請求報文,它是以廣播的方式傳送到網路上的,每一臺機器都會收到這個ARP請求報文,它是以廣播方式傳送到網路上的,每個機器都會收到這個ARP請求報文。在這個ARP請求報文中,傳送端乙太網地址欄位是傳送ARP請求報文機器的MAC地址,而且傳送端IP欄位內容是要查詢的MAC的主機的IP地址。當某個主機檢查到自己的IP地址是目的IP地址時,它會返回一個ARP應答報文,在此應答報文中,其傳送端乙太網地址欄位內容就是要查詢的MAC地址。

一個主機裡面一般有ARP快取,裡面儲存了IP地址和MAC地址對。

2.交換網路

在共享網路中,把網絡卡設為混雜模式就可以監聽所有的網路資料包,但是在交換網路中,情況就發生了變化。

乙太網分為共享式乙太網和交換式乙太網,共享式乙太網通常以集線器作為網路裝置,交換式乙太網通常使用交換機作為網路連線裝置。共享式乙太網中資料幀以廣播方式傳送到每個乙太網埠,網內每臺主機的網絡卡能接收到網內的所有資料幀。因此只要把網絡卡設定成為混雜模式就可以獲取到這本地網絡卡的所有資料幀。

最典型的交換網路使用交換機連線,在交換機中可以設為一個埠一個MAC地址,形成一個埠一個MAc地址對。這樣當網路資料包到達埠時,而不是轉發給所有的埠,只是轉發MAC對應的埠。這樣,其他埠的通訊不受干擾,所以其他埠上的主機就無法接收到網路上的資料包了。

可以利用ARP重定向技術來實現交換網路的資料包捕獲,其主要原理用到了ARP欺騙技術,但此方法有一定的危險性。另外有的交換機上有一個用於除錯的埠,任何其他埠的通訊資料都會出現在此埠上,所以也可以在此埠上進行網路資料包的監聽工作。

3.資料包在區域網內的傳輸方式

眾所周知,資料包在網際網路上的傳播是根據IP地址進行定址的,但是完整的過程並非如此。資料包通過IP地址可以達到的最遠的地點就是目標主機所在的子網,而在該子網內的定址卻是使用實體地址的,即MAC地址。

資料包被傳送到目標主機所在的子網時,它將被交給路由器,路由器在該子網內使用廣播方式傳播出去,這意味著該子網內的雖有主機都可以接收到該資料包。不過主機接收到資料包後通常會先檢查其目的地址,如果目的地址不是自己,那麼就是丟棄,只有目的地址為自己的資料包才會將其交付給上一層處理。

Sniffer將網絡卡設定為混雜模式,這樣就可以接收到所有的資料包了,達到了嗅探了目的。

網絡卡對接收到的資料包經過一步步的解析之後就得到了最終的應用程式報文,此時就可以清晰易懂地看出它所包含的內容。

四. 網路抓包用到的技術

1.原始套接字程式設計

2.Winpcap程式設計

使用Winpcap來生成資料包比使用原始套接字更加靈活,功能更加豐富。在基於原始套接字方法中,由於原始套接字的某些限制,其構造的資料包最底層協議的資料包只能是IP資料包不能夠構造IP層以下的協議資料包,例如鏈路層資料包就不能構造,而使用Winpcap可以構造基於鏈路層的資料包。

使用WinPcap構造資料包與使用原始套接字構造資料包是不同的。在原始套接字裡面構造的資料包是從IP層開始的,而在WinPcap中是從鏈路層開始構造的。也就是說,在WinPcap中藥構造一個Ip資料包,需要先構造鏈路層首部,在這裡是乙太網首部,然後再構造Ip首部,最後才是IP負載資料。而在原始套接字中直接從IP層開始構造,所以只需要構造IP首部和負載資料就可以了。

五.簡單嗅探器的具體實現解析

定義一個IP

typedef  struct IPHEAD

{

    unsigned char h_len:4;          //4位首部長度+4IP版本號

    unsigned char ver:4;

    unsigned char tos;              //8位服務型別TOS

    unsigned short total_len;        //16位總長度(位元組)

    unsigned short ident;           //16位標識

    unsigned short frag_and_flags;   //3位標誌位

    unsigned char ttl;              //8位生存時間 TTL

    unsigned char proto;           //8位協議 (TCP, UDP 或其他)

    unsigned short checksum;       //16IP首部校驗和

    unsigned int sourceip;          //32位源IP地址

    unsigned int destip;            //32位目的IP地址

}IPHEAD;

定義TCP頭部

typedef  struct TCPHEAD 

{

USHORT th_sport;            //16位源埠

USHORT th_dport;            //16位目的埠

unsigned int th_seq;            //32位序列號

unsigned int th_ack;            //32位確認號

unsigned char th_lenres;         //4位首部長度/6位保留字

unsigned char th_flag;           //6位標誌位

USHORT th_win;               //16位視窗大小

USHORT th_sum;              //16位校驗和

USHORT th_urp;              //16位緊急資料偏移量

}TCPHEAD ;

接收資料資訊:

IPHEAD  piphd=(struct IPHEAD *)cbuf;                 //取得IP頭資料的地址

int iIphLen = sizeof(unsigned long) * (piphd->h_len  & 0xf);

TCPHEAD  ptcphd=(struct TCPHEAD *)(cbuf+iIphLen);   //取得TCP頭資料的地址

得到頭部中的資訊,直接引用即可:

printf("From:%s\tport%d\t",inet_ntoa(*(structin_addr*)&piphd->sourceip),ntohs(ptcphd->th_sport) );

printf("To:%s\tport%d",inet_ntoa(*(structin_addr*)&piphd->destip),ntohs(ptcphd->th_dport));

判斷協議型別:

switch(piphd->proto)       //根據IP頭的協議判斷資料包協議型別

        {

        case 1:

            printf("ICMP\n");

            break;

        case 2:

            printf("IGMP\n");

            break;

        case 6:

            printf("TCP\n");

            break;

        case 17:

            printf("UDP\n");

            break;

        default:

            printf("unknow:%d\n",piphd->proto);

        }

}

相關推薦

網路(Sniffer)的原理實現(1)

一.背景 為了使不同體系結構的計算機網路都能進行互聯,國際標準化組織ISO於1997年成立了專門的結構研究這個問題。不久他們就提出了一個試圖使各種計算機在世界範圍內都能互聯的成網的標準框架,即著名的OSI/RM(Open Systems Interconnection Re

winPcap+MFC實現網路

1.1、不可或缺的東西 WinPcap V4.1.2:驅動程式、Dll檔案 http://www.winpcap.org/install/bin/WinPcap_4_1_2.exe WinPcap V4.1.2 Developer’s Pack:庫檔案、標頭檔案、簡單的示例程式程式碼

使用libpcap庫用c編寫網路

定義:網路嗅探也叫網路偵聽,指的是使用特定的網路協議來分解捕獲到的資料包,並根據對應的網路協議識別對應資料片斷 作用:管理員可以用來監聽網路的流量情況            開發網路應用的程式設計師可以

C++標準模板庫(STL)迭代原理實現

引言 迭代器(iterator)是一種抽象的設計理念,通過迭代器可以在不瞭解容器內部原理的情況下遍歷容器。除此之外,STL中迭代器一個最重要的作用就是作為容器(vector,list等)與STL演算法的粘結劑,只要容器提供迭代器的介面,同一套演算法程式碼可以利

計算機網路實驗-網路

計算機網路實驗-網路嗅探器 內容 課題:簡單的個人網路嗅探器 一、目的 加深對 TCP/IP 協議的理解 二、任務: • 實現 Sniffer 的基本功能。 Sniffer 是一種用於監測網路效能、使用情況的工具。 • 能夠指定需要偵聽的網絡卡

【自動回帖/原理】自動回帖原理實現(一)原理

自動回帖技術 前言:2012.9月,由於某些原因,我開始編寫一個基於Discuz論壇的自動回帖器,這次的小工作讓我對Cookie有了進一步的認識,充分認識到,利用它實在可以做太多的事了~啊哈哈~話不多說~進入主題吧! 0.驗證碼識別 3年前想做的驗證碼識別已經ok了,參

Lucene 4.X 倒排索引原理實現: (1) 詞典的設計

詞典的格式設計 詞典中所儲存的資訊主要是三部分: Term字串 Term的統計資訊,比如文件頻率(Document Frequency) 倒排表的位置資訊 其中Term字串如何儲存是一個很大的問題,根據上一章基本原理的表述中,我們知道,寫入檔案的Term是按照字典順序排好序的,那麼如何將這些

【嵌入式開發】自定義AT指令實現sniffer網路功能

基礎 該功能是在NON-OS SDK下實現的。 Non-OS SDK 是不不基於作業系統的 SDK,提供 IOT_Demo 和 AT 的編譯。Non-OS SDK 主要使⽤用定時器和回撥函式的方式實現各個功能事件的巢狀,達到特定條件下觸發特定功能函式的目

用C++抓取網路資料包--的設計原理

嗅探器作為一種網路通訊程式,也是通過對網絡卡的程式設計來實現網路通訊的,對網絡卡的程式設計也是使用通常的套接字(socket)方式來進行。但是,通常的套接字程式只能響應與自己硬體地址相匹配的或是以廣播形式發出的資料幀,對於其他形式的資料幀比如已到達網路介面但卻不是發給此地址

實驗二 網路欺騙 實驗報告 二

實驗報告 二   中國人民公安大學 Chinese people’ public security university   網路對抗技術 實驗報告  

【目標檢測】目標檢測原理實現(五)--基於Cascade分類的目標檢測

基於Cascade分類器的目標檢測        從今天開始進入基於機器學習的目標檢測,前幾節雖然也接觸了一些機器學習的方法,但它主要是做輔助工作,機器學習的方法和非機器學習的方法結合在一起使用,說到這想起來前幾天看到一位博士師兄發的笑話,說的是百度實驗室:  

網路欺騙 實驗報告二

中國人民公安大學 Chinese people’ public security university 網路對抗技術 實驗報告 實驗二 網路嗅探與欺騙 學生姓名 程前錦  年級  2015級 區隊  一區 指導教師  高見

幾個Sniffer()工具

Sniffer(嗅探器)是一種常用的收集有用資料方法, 這些資料可以是使用者的帳號和密碼, 可以是一些商用機密資料等等. Sniffer可以作為能夠捕獲網路報文的裝置, ISS為Sniffer這樣定義:Sniffer是利用計算機的網路介面截獲目的地為其他計算機的資料報文的一種工具. Sniffer根據網路的型

Python黑帽程式設計 4.1 Sniffer()之資料捕獲(上)

Python黑帽程式設計 4.1 Sniffer(嗅探器)之資料捕獲(上) 網路嗅探,是監聽流經本機網絡卡資料包的一種技術,嗅探器就是利用這種技術進行資料捕獲和分析的軟體。 編寫嗅探器,捕獲資

神經網路中BP演算法的原理用Python實現原始碼

(1)什麼是梯度下降和鏈式求導法則 1.梯度下降 假設我們有一個函式J(w),如下圖所示。 現在,我們要求當w等於什麼的時候,J(w)能夠取到最小值。從圖中我們知道最小值在初始位置的左邊,也就意味著如果想要使J(w)最小,w的值需要減小。而初始位置的切線斜率a>0

Java 線程池的原理實現

控制 try 所在 使用 urn str waiting media .info 這幾天主要是狂看源程序,在彌補了一些曾經知識空白的同一時候,也學會了不少新的知識(比方 NIO)。或者稱為新技術吧。 線程池就是當中之中的一個,一提到線程。我們會想到曾經《操作系統》的

防盜鏈的基本原理實現

rec eal limit ole 站點 new exceptio stub text 1. 我的實現防盜鏈的做法,也是參考該位前輩的文章。基本原理就是就是一句話:通過判斷request請求頭的refer是否來源於本站。(當然請求頭是來自於客戶端的,是可偽造的,暫不在本文

Python_sniffer(網絡)

recv 捕獲 nbsp clas start cmp from art style import socket import threading import time activeDegree=dict() flag=1 def main(): global

WebSiteSniffer(網站資源)

strong ref .cn 文本文件 ict pic 視頻 ebs targe 軟件簡介: WebSiteSniffer 是一個數據包嗅探工具,捕獲通過網頁瀏覽器瀏覽互聯網時網站所有已下載的文件,並將其存儲在您選擇的硬盤驅動器的基礎文件夾下。WebSiteSnif

WebCookiesSniffer(網頁Cookies)

alt 簡介 blank ron href 字符 嗅探器 服務器 接收 軟件簡介: WebCookiesSniffer 是一個數據包嗅探工具,捕獲Web瀏覽器和Web服務器之間發送的所有網站的 Cookie,並將其顯示在一個簡單的表。 WebCookiesSniff