首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C語言編寫 PCAP 文件供 Wireshark 分析:避坑指南與 Libpcap 實戰

     編輯:程式設計綜合問答

問題背景

開發者嘗試將抓取的網絡數據包(十六進制字符串)直接寫入 .pcap 文件,期望用 Wireshark 打開分析。但直接寫入原始數據包缺少 PCAP 文件頭與數據包頭,導致 Wireshark 報錯「數據包過大」或解析失敗。

PCAP 文件格式結構

+-------------------+
| Global Header (24 bytes) |  // 文件全局頭:魔數、版本、時區、鏈路層類型等
+-------------------+
| Packet Header 1 (16 bytes) | // 第 1 個數據包頭:時間戳、捕獲長度、原始長度
+-------------------+
| Packet Data 1 (variable)   | // 第 1 個數據包內容
+-------------------+
| Packet Header 2 (16 bytes) |
+-------------------+
| Packet Data 2 (variable)   |
+-------------------+
...

常見錯誤分析

  • 僅寫入原始幀數據:缺少 Global Header 與每個 Packet Header,Wireshark 無法識別文件格式。
  • 手工構造結構體寫入:易出現字節序、對齊、時間戳精度、鏈路層類型(DLT_EN10MB 等)不匹配問題,導致「超出最大長度」「截斷」等錯誤。
  • UDP/TCP 校驗和錯誤:Wireshark 會驗證校驗和,手工構造數據包常忽略此項。

最佳解決方案:使用 Libpcap/WinPcap 庫

放棄手工拼接二進制結構,直接調用成熟庫函數,保證格式完全合規。

核心步驟

  1. 調用 pcap_open_dead() 創建離線保存句柄(指定鏈路層類型 DLT_EN10MB)。
  2. 調用 pcap_dump_open() 打開輸出文件獲取 dumper。
  3. 構造 struct pcap_pkthdr(時間戳、捕獲長度、原始長度)。
  4. 調用 pcap_dump() 寫入數據包頭與數據。
  5. 調用 pcap_dump_close() 關閉文件。

關鍵代碼示例

#include 

// 假設 raw_data 指向完整以太網幀,长度为 data_len
pcap_t *pd = pcap_open_dead(DLT_EN10MB, 65535); // 鏈路層類型、最大捕獲長度
if (!pd) { fprintf(stderr, "pcap_open_dead failed\n"); return -1; }

pcap_dumper_t *dumper = pcap_dump_open(pd, "output.pcap");
if (!dumper) { fprintf(stderr, "pcap_dump_open failed\n"); pcap_close(pd); return -1; }

struct pcap_pkthdr hdr;
hdr.ts.tv_sec = time(NULL);   // 秒級時間戳
hdr.ts.tv_usec = 0;           // 微秒
hdr.caplen = data_len;        // 捕獲長度
hdr.len = data_len;           // 原始長度

pcap_dump((u_char *)dumper, &hdr, raw_data); // 寫入

pcap_dump_close(dumper);
pcap_close(pd);

進階:從 ETW/ETL 文件提取數據包

用戶提到使用 netsh trace 生成 .etl 文件,需解析 ETL 獲取數據包與進程 ID。建議:

  • 使用 Microsoft Trace Data Helper (TDH) API 解析 ETL 事件。
  • 事件提供者 Microsoft-Windows-TCPIP (GUID: {9A280AC0-C8E0-11D1-84E2-00C04FB998A2}) 包含網絡發送/接收事件,負載中含完整幀數據與 PID。
  • 參考開源項目 etl2pcap 或 WinPcap 相關工具。
  • 最終仍推薦用 Libpcap 寫入標準 PCAP,而非自行構造。

參考資源

核心教訓: 任何涉及標準文件格式(PCAP、ELF、ZIP、PNG...)的生成,**務必使用成熟庫**,手工拼接二進制結構極易踩坑且難維護。

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