1. 程式人生 > >用原始套接字實現網路監聽

用原始套接字實現網路監聽

 作者:張志強

下載原始碼


1、引言
    網路監聽工具(sinff)是提供給網路管理員的一類管理工具。在乙太網中(Ethernet),當網路上連線多臺計算機時,某瞬間只能有一臺計算機可以傳送資料。乙太網中,資料是以被稱為幀的資料結構為單位進行交換的。通常,在計算機網路上交換的資料結構體的單位是資料包。而在乙太網中則稱為幀。這種資料包是由記錄著資料包傳送給對方所必需資訊的報頭部分和記錄著傳送資訊的報文部分構成。報頭部分包含接收端的地址、傳送端的地址、資料校驗碼等資訊。
在乙太網上,幀(資料包)是被稱為帶碰撞檢測的載波偵聽多址訪問(CAMA/CD)傳送的,在這種方法中,傳送到指定地址的幀實際上是傳送到所有計算機的,只是如果網絡卡檢測到經過的資料不是發往自身的,簡單忽略過去而已。

2、網路監聽工作原理
    工作在普通模式下的網絡卡只能接收發往本地地址和廣播的資料包,其餘資料包將簡單的轉發,並不把資料提交給主機處理。工作在混雜模式下的網絡卡將接收所有經過本網絡卡的資料。所以網路監聽程式只能工作在混雜模式下。對於不能工作在網絡卡,將無法監聽所有在網路上傳輸的資料。網路監聽的核心就是設定網絡卡為混雜模式。通常的套接字只能相應與自己硬體地址相匹配的或以廣播方式傳送的資料幀。對於其他資料幀,網路介面驗證投遞地址並非自身地址後將不做響應,也就是說網路程式無法接收到達網絡卡的資料包。

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

例子程式執行畫面如圖所示:

如圖一

4、小結
    本文介紹的以原始套接字實現網路偵聽的方法實現起來比較簡單,尤其是不需要編寫驅動程式就能實現網路偵聽。但由於接收到的資料報頭不含幀資訊,因此不能接收網路層的其他資料包,如ARP、RARP等。原始套接字只能監聽但不能實現攔截。另外最致命的缺點就是隻能在Winsock層次上進行,而對於網路協議棧中底層協議的資料包例如TDI無法進行處理。對於一些木 馬和病毒來說很容易避開這個層次的監聽。

相關推薦

原始實現網路

 作者:張志強 下載原始碼 1、引言    網路監聽工具(sinff)是提供給網路管理員的一類管理工具。在乙太網中(Ethernet),當網路上連線多臺計算機時,某瞬間只能有一臺計算機可以傳送資料。乙太網中,資料是以被稱為幀的資料結構為單位進行交換的。通常,在計算機網路上交換

網路程式設計——原始實現原理

目錄 1. 基礎知識  1.1、概述 1.2、鏈路層原始套接字  1.3、網路層原始套接字 2、原始套接字的實現 2.1  原始套接字報文收發流程 2.2鏈路層原始套接字的實現     2.2.1  套接字建

利用原始實現對流經本機IP包的捕獲

經過上一篇部落格的總結,我知道到了原始套接字接收到的字串的開始欄位是IP資料報的首部,所以我想除了之前利用win_pcap可以捕獲資料包以外,理論上來說原始套接字也可以實現對IP資料報的捕獲。思路也很簡單,捕獲到字串以後轉換成指向IP首部結構體的指標,再列印相關資訊就可以了

原始實現

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #ifdef WIN32 #include <Winsock2

原始實現--arp欺騙

1、利用原始套接字實現arp欺騙:       首先我們要清楚arp的原理: 這樣我們就可以很清楚我們要做什麼了: 2、既然這樣我們就可以十分明白自己該怎樣做了。   來看一下linux下的一些對於arp頭部的構造的原始碼和各個欄位的常見引數解析:去檔案/usr/

ping 程式(vc6.0 原始實現

#include <stdio.h> #include <WINSOCK2.H> #include <windows.h> #include <ws2tcpip.h> //IP_TTL #pragma comment(li

利用原始實現tracert路由追蹤

在windows的命令列下,使用tracert 域名/IP地址 可以記錄本機到目的主機所經過的路由器的IP地址。這個功能使用原始套接字也可以實現。 我們通過不斷地向目的主機發送ICMP-ECHORequest包,並且將包的TTL一開始設為1,這樣一到達閘道器路由器後,路由器

Linux原始實現分析---轉

本文從IPV4協議棧原始套接字的分類入手,詳細介紹了鏈路層和網路層原始套接字的特點及其核心實現細節。並結合原始套接字的實際應用,說明各型別原始套接字的適應範圍,以及在實際使用時需要注意的問題。 一、原始套接字概述 協議棧的原始套接字從實現上可以分為“鏈路層原始套

Linux網路程式設計之原始-ping協議實現

1.概述 PING協議是用來檢驗本地主機與遠端主機是否連線,傳送的是ICMP ECHO_REQUEST包。普通的套接字是基於TCP或者是UDP的,無法傳送ICMP包,所以必須用原始套接字來實現。PING協議的客戶端型別值為8,程式碼值為0,表示請求。而PING協議的響應端型別值為0,程式碼值也為

Windows網路程式設計(七):原始開發

在呼叫socket()函式時,如果將第二個引數填為SOCK_RAW,代表建立的是原始套接字型別,第三個引數可以選擇IPPROTO_ICMP、IPPROTO_TCP、IPPROTO和IPPROTO_RAW。 #include <winsock2.h> #pragma co

網路程式設計網路位元組序及udp寫客戶端和服務端聊天程式

認識IP地址 IP協議有兩個版本:IPV4和IPV6。 IPV4:IPV4版本的IP地址是4位元組無符號整數。那麼就存在IP地址資源匱乏的時候,這時可以採用兩種方法: DHCP:ip地址動態分配(應用層協議); NAT: 地址替換; 但是這兩種方法只是暫時的有I

Linux網路程式設計——原始程式設計

原始套接字的建立 int socket ( int family, int type, int protocol ); 引數: family:協議族 這裡寫 PF_PACKET type:  套接字類,這裡寫 SOCK_RAW protocol:協議類別,指定可以接收或傳送的資料包型別,不能寫

Linux網路程式設計——原始例項:MAC 頭部報文分析

通過《Linux網路程式設計——原始套接字程式設計》得知,我們可以通過原始套接字以及 recvfrom( ) 可以獲取鏈路層的資料包,那我們接收的鏈路層資料包到底長什麼樣的呢? MAC 頭部(有線區域網) 注意:CRC、PAD 在組包時可以忽略 鏈路層資料包的其中一

Linux 網路程式設計——原始例項:MAC 地址掃描器

如果 A (192.168.1.1 )向 B (192.168.1.2 )傳送一個數據包,那麼需要的條件有 ip、port、使用的協議(TCP/UDP)之外還需要 MAC 地址,因為在乙太網資料包中 MAC 地址是必須要有的。那麼怎樣才能知道對方的 MAC 地址?答案是:它通

Linux 網路程式設計——原始例項:傳送 UDP 資料包

乙太網(Ethernet)報文格式(MAC頭部報文格式): IP 報文格式: UDP 報文格式: 校驗和函式: /******************************************************* 功能:     

[原始碼和文件分享]使用原始Raw Socket實現資料包嗅探

背景 網路上隨時都流通了大量的資料包,我們要想實現抓包並分析,實現思路思路大概是:在合適的時候捕獲資料包,儲存到緩衝區,作為備用;然後,按照一定的結構和格式去讀取緩衝區的內容。由於各種公開的網路協議是已知的,所以對於資料包的分析就比較簡單。 通常我們都是使用類似WireShark的抓包軟體嗅

Linux原始之sniffer部分實現

1.概述  通常在同一個網段的所有網路介面都有訪問在物理媒體上傳輸的所有資料的能力,而每個網路介面都還應該有一個硬體地址,該硬體地址不同於網路中存在的其他網路介面的硬體地址,同時,每個網路至少還要一個廣播地址。(代表所有的介面地址),在正常情況下,一個合法的網路介面應該只響應這樣的兩種資料幀:&

Linux原始之ARP協議實現

1. ARP協議介紹  ARP(AddressResolutionProtocol)地址解析協議用於將計算機的網路地址(IP地址32位)轉化為實體地址(MAC地址48位)[RFC826].ARP協議是屬於鏈路層的協議,在乙太網中的資料幀從一個主機到達網內的另一臺主機是根據48位的乙太網地址(硬體

Linux 網路程式設計之原始

1. 介紹 前面主要介紹了流式套接字(SOCK_STREAM),資料報套接字(SOCK_DGRAM),基本上能夠滿足TCP與UDP的應用。但一些問題,我們仍然無法解決,如: (1)傳送一個自定義的IP包 (2)傳送ICMP包 (3)偵聽網路上的資料包 (4)偽裝IP地址 (5

利用網路實現TCP互動

我們來了解一下TCP互動流程: 大致流程如下: (1)伺服器根據地址的型別(屬於ipv4還是ipv6等)、socket型別(比如TCP、UDP)去建立socket,創建出的套接字socket本質