首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 原始套接字實現網絡監聽:原理、代碼與局限性分析

     編輯:VC 教學

背景:以太網數據交換與混雜模式

以太網採用 CSMA/CD,幀廣播發送,網卡默認只接收本機 MAC 或廣播幀。網絡監聽(Sniffer)需將網卡設置為**混雜模式**,接收所有經過的幀。普通 Socket(流/數據報)無法做到,必須使用**原始套接字**。

實現關鍵步驟

  1. 創建原始套接字:socket(AF_INET, SOCK_RAW, IPPROTO_IP)(需管理員權限)。
  2. 設置 IP 頭選項:setsockopt(s, IPPROTO_IP, IP_HDRINCL, ...),聲明自行包含 IP 頭或由系統填充。
  3. 綁定本地網卡:bind(s, (sockaddr*)&local, sizeof(local)),綁定具體 IP 地址。
  4. 啟用混雜模式:ioctlsocket(s, SIO_RCVALL, &optval),optval = 1 開啟,optval = 0 關閉。
  5. 接收數據:recv(s, buf, len, 0) 循環接收,數據包含完整 IP/TCP/UDP 頭及負載。

數據解析流程

接收到的緩衝區為原始幀數據,需按協議層級逐級解析:


// 伪代碼邏輯
IP_HEADER* ip = (IP_HEADER*)buf;
if (ip->Protocol == IPPROTO_TCP) {
    TCP_HEADER* tcp = (TCP_HEADER*)(buf + ip->HeaderLen * 4);
    PAYLOAD* data = (PAYLOAD*)(buf + ip->HeaderLen * 4 + tcp->HeaderLen * 4);
    // 分析端口、標志位、載荷...
}

核心局限性(必讀)

  • 無鏈路層頭部:原始套接字接收從 IP 層開始的數據,**無法獲取以太網幀頭**,故無法捕獲 ARP、RARP 等非 IP 協議數據包。
  • 僅監聽,無攔截/修改能力:屬於被動捕獲,無法阻斷或篡改數據流。
  • Winsock 層面限制:運行在用戶態 Winsock 層,繞過 TDI 等內核協議棧層的惡意代碼(Rootkit、高級木馬)將隱形。
  • 性能瓶頸:高流量下用戶態拷貝、上下文切換開銷大,不適合千兆以上線速分析。

工程建議

教學/輕量級監控可用此法;生產級/安全級產品建議開發 **NDIS 中間驅動** 或 **WFP (Windows Filtering Platform)** 內核驅動,獲取完整幀、實現攔截、繞過用戶態限制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved