程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用原始套接字實現網絡監聽

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

編輯:關於VC++

1、引言

網絡監聽工具(sinff)是提供給網絡管理員的一類管理工具。在以太網中(Ethernet),當網絡上連接多台計算機時,某瞬間只能有一台計算機可以傳送數據。以太網中,數據是以被稱為幀的數據結構為單位進行交換的。通常,在計算機網絡上交換的數據結構體的單位是數據包。而在以太網中則稱為幀。這種數據包是由記錄著數據包發送給對方所必需信息的報頭部分和記錄著發送信息的報文部分構成。報頭部分包含接收端的地址、發送端的地址、數據校驗碼等信息。

在以太網上,幀(數據包)是被稱為帶碰撞檢測的載波偵聽多址訪問(CAMA/CD)發送的,在這種方法中,發送到指定地址的幀實際上是發送到所有計算機的,只是如果網卡檢測到經過的數據不是發往自身的,簡單忽略過去而已。

2、網絡監聽工作原理

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

3、具體實現

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

例子程序運行畫面如圖所示:

如圖一

4、小結

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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved