以太網採用 CSMA/CD,幀廣播發送,網卡默認只接收本機 MAC 或廣播幀。網絡監聽(Sniffer)需將網卡設置為**混雜模式**,接收所有經過的幀。普通 Socket(流/數據報)無法做到,必須使用**原始套接字**。
socket(AF_INET, SOCK_RAW, IPPROTO_IP)(需管理員權限)。setsockopt(s, IPPROTO_IP, IP_HDRINCL, ...),聲明自行包含 IP 頭或由系統填充。bind(s, (sockaddr*)&local, sizeof(local)),綁定具體 IP 地址。ioctlsocket(s, SIO_RCVALL, &optval),optval = 1 開啟,optval = 0 關閉。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);
// 分析端口、標志位、載荷...
}
教學/輕量級監控可用此法;生產級/安全級產品建議開發 **NDIS 中間驅動** 或 **WFP (Windows Filtering Platform)** 內核驅動,獲取完整幀、實現攔截、繞過用戶態限制。