一、WinPcap 簡介
WinPcap (Windows Packet Capture) 提供 Win32 應用程式存取網路底層能力:
- 捕獲原始封包 (含共享網路上其他主機流量)。
- 自訂規則過濾封包。
- 發送原始封包。
- 收集網路統計資訊。
限制:僅監聽,無法阻塞/控制其他程式流量,不適用 QoS 或個人防火牆。主流支援 NT/2000/XP。核心 DLL:packet.dll (底層)、wpcap.dll (高階封裝)。本文基於 packet.dll。
二、Packet.dll 核心資料結構與 API
2.1 主要結構體
_ADAPTER:網卡描述。
_PACKET:封包緩衝區描述。
NetType:網路類型 (LinkSpeed、LinkType:乙太網/Token Ring/FDDI/ATM...)。
npf_if_addr:IP/子網掩碼/廣播位址。
bpf_hdr:封包標頭 (時間戳/長度)。
bpf_stat:統計 (接收/丟棄/捕獲計數)。
2.2 常用 API 對照
| 函式 | 用途 |
| PacketGetAdapterNames | 取得網卡清單與描述 |
| PacketOpenAdapter / PacketCloseAdapter | 開啟/關閉網卡 |
| PacketGetNetInfoEx | 取得 IP/掩碼/廣播位址 |
| PacketGetNetType | 取得 MAC 層類型與速度 |
| PacketSetHwFilter | 設定硬體過濾 (混雜模式 NDIS_PACKET_TYPE_PROMISCUOUS 等) |
| PacketSetBuff | 設定核心緩衝區大小 |
| PacketSetReadTimeout | 設定讀取逾時 |
| PacketAllocatePacket / PacketFreePacket / PacketInitPacket | 封包記憶體管理 |
| PacketReceivePacket | 從驅動讀取封包 (同步/非同步) |
| PacketSendPacket | 發送封包 |
| PacketSetNumWrites | 設定重發次數 |
| PacketGetStats | 取得統計計數 |
三、T-ARP 功能與原理
3.1 命令列選項
-m 主機掃描:廣播 ARP Request 獲取存活主機 IP/MAC。
-a 反嗅探掃描:偽廣播位址 ff:ff:ff:ff:ff:fe 偵測嗅探主機。
-s ARP 欺騙/網路嗅探/IP 沖突:雙向偽造 ARP Reply 導流封包經本機 (需啟用 IP Routing 註冊鍵 IPEnableRouter=1)。
-r 重置:發送正確 ARP Reply 恢復通訊。
3.2 核心原理
- 啟動時以特殊 IP (
112.112.112.112) 發送 ARP Request 取得本機 MAC。
- -m:用本機 IP/MAC 廣播 ARP Request,存活主機回應。
- -a:用 31 位偽廣播位址,僅嗅探主機回應。
- -s:取得目標 A/B MAC,向 A 發送「B 的 IP 對應本機 MAC」的 ARP Reply,向 B 發送「A 的 IP 對應本機 MAC」;啟用 IP 轉發後本機成中間人,可監聽/修改流量。若 A=B=本機則為混雜模式嗅探;若 A=B≠本機則為 IP 沖突攻擊。
- -r:發送正確 MAC 映射恢復 ARP 快取。
四、關鍵執行緒與流程
sniff 執行緒:PacketSetHwFilter(..., PROMISCUOUS) → 迴圈 PacketReceivePacket → getdata 解析。
sendMASR 執行緒:發送 ARP Request (掃描/欺騙前置)。
sendSR 執行緒:週期性發送 ARP Reply 維持欺騙/重置。
五、完整原始碼 (節錄關鍵結構與主流程)
// 封包結構定義 (pragma pack 1)
typedef struct ethdr { uchar eh_dst[6], eh_src[6]; ushort eh_type; } ETHDR;
typedef struct arphdr { ushort arp_hdr, arp_pro; uchar arp_hln, arp_pln; ushort arp_opt; uchar arp_sha[6]; ulong arp_spa; uchar arp_tha[6]; ulong arp_tpa; } ARPHDR;
// 主流程
main() {
PacketGetAdapterNames(...) → 選擇網卡 → PacketOpenAdapter
PacketGetNetType / PacketGetNetInfoEx → 顯示網卡資訊
PacketAllocatePacket → 建立收發封包緩衝
CreateThread(sniff) → 監聽執行緒
getmine() → 取得本機 MAC
依選項建立 sendMASR / sendSR 執行緒
WaitForSingleObject(sendThread) → 等待發送結束
PacketGetStats → 顯示統計
釋放資源
}
完整 400+ 行原始碼見原文附件,含 ARP/乙太網封裝組裝、多執行緒同步、檔案記錄 (欺騙模式輸出 capture.txt)。
六、編譯與執行環境
- 安裝 WinPcap 2.3 (穩定) 或 3.0 Alpha。
- 專案連結
packet.lib、ws2_32.lib,包含 packet32.h、ntddndis.h。
- 管理員權限執行 (需開啟網卡混雜模式)。
- 上一篇文章: ADO 封裝類 CadoInterface:MFC 專用簡化資料庫操作
- 下一篇文章: 學生成績管理系統優化實戰:避免 ListCtrl 全量刷新的增量更新策略
Copyright ©
程式碼之家 All Rights Reserved