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

Windows 原始套接字實作網路封包偵聽器(IP/TCP/UDP/ICMP 解析)

     編輯:VC 教學

概述

使用 WinSock2 SOCK_RAW 套接字搭配 SIO_RCVALL IOCTL,可在 Windows 上攔截本機網卡收發的所有 IP 封包。本文提供一個完整的主控台程式,支援:

  • 協議過濾:TCP / UDP / ICMP
  • IP 過濾:來源 IP、目的 IP
  • 連接埠/類型過濾
  • 敏感字串過濾(TCP 負載)
  • 封包內容解碼顯示(十六進制/ASCII)
  • 命令列參數控制

關鍵資料結構

// IP 標頭
typedef struct _iphdr {
    BYTE  h_lenver;      // 4位版本 | 4位首部長度
    BYTE  tos;
    WORD  total_len;
    WORD  ident;
    WORD  frag_and_flags;
    BYTE  ttl;
    BYTE  proto;         // 協議:TCP=6, UDP=17, ICMP=1
    WORD  checksum;
    DWORD sourceIP;
    DWORD destIP;
} IP_HEADER;

// TCP 標頭
typedef struct _tcphdr {
    WORD  th_sport;      // 來源埠
    WORD  th_dport;      // 目的埠
    DWORD th_seq;
    DWORD th_ack;
    BYTE  th_lenres;     // 4位首部長度 | 6位保留
    BYTE  th_flag;       // 6位旗標:FIN,SYN,RST,PSH,ACK,URG
    WORD  th_win;
    WORD  th_sum;
    WORD  th_urp;
} TCP_HEADER;

// UDP 標頭
typedef struct _udphdr {
    WORD uh_sport;
    WORD uh_dport;
    WORD uh_len;
    WORD uh_sum;
} UDP_HEADER;

// ICMP 標頭
typedef struct _icmphdr {
    BYTE  i_type;
    BYTE  i_code;
    WORD  i_cksum;
    WORD  i_id;
    WORD  i_seq;
    DWORD timestamp;
} ICMP_HEADER;

核心流程

  1. 初始化 WinSock:WSAStartup(MAKEWORD(2,1), &wsaData)
  2. 建立原始套接字:socket(AF_INET, SOCK_RAW, IPPROTO_IP)
  3. 綁定本機 IP:gethostname → gethostbyname → bind
  4. 啟用混雜模式:WSAIoctl(s, SIO_RCVALL, &in, sizeof(in), &out, sizeof(out), &ret, NULL, NULL)
  5. 迴圈接收與解析:
    while (1) {
        recv(s, buf, MAX_PACK_LEN, 0);
        DecodeIpPack(buf, len);
    }

解析邏輯

  • DecodeIpPack:提取 IP 標頭,依 proto 分派至 TCP/UDP/ICMP 解析器,並套用 IP/埠/字串過濾。
  • DecodeTcpPack:計算 TCP 首部長度(th_lenres >> 4 * 4),解析旗標、埠號、序號、視窗,選擇性輸出負載資料。
  • DecodeUdpPack:解析埠號、長度,選擇性十六進制/ASCII 輸出負載。
  • DecodeIcmpPack:解析類型/代碼(Echo Request=8, Echo Reply=0 等),選擇性輸出負載。

命令列參數

IPSpy.exe [/t] [/u] [/i] [/p] [/f:srcIP] [/d:dstIP] [/s:string] [/o:port]

/t  顯示 TCP 封包
/u  顯示 UDP 封包
/i  顯示 ICMP 封包
/p  解碼封包負載 (預設關閉)
/f  來源 IP 過濾
/d  目的 IP 過濾
/s  TCP 負載敏感字串過濾
/o  埠號/ICMP 類型過濾

編譯與執行注意

  • 需連結 Ws2_32.lib。
  • 需系統管理員權限執行(原始套接字需要)。
  • Windows 7+ 可能需啟用「允許非系統進程使用原始套接字」註冊表或群組原則。
  • 僅供教學/除錯用途,實際部署請遵守當地法律法規。

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