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

Wireshark/PCAP:從已知十六進制封包資料手工構建 PCAP 檔案完整流程

     編輯:程式設計綜合問答

應用場景

已知單一封包的原始十六進制/二進制資料(含乙太網頭到 Payload),需產生標準 `.pcap` 檔案供 Wireshark 分析。

PCAP 檔案結構速覽

Global Header (24 bytes)
Packet Header 1 (16 bytes)  →  ts_sec, ts_usec, caplen, len
Packet Data 1   (caplen bytes)
Packet Header 2 ...
Packet Data 2 ...

關鍵欄位設定

欄位說明建議值
magic_number檔案識別/位序`0xa1b2c3d4` (小端)
version_major/minor版本`2.4`
thiszone時區修正`0`
sigfigs時間戳精度`0`
snaplen最大擷取長度`65535`
network資料鏈路類型`1` (DLT_EN10MB 乙太網)
ts_sec/ts_usec封包時間戳可全 `0` 或真實時間
caplen實際擷取長度封包資料長度(位元組)
len原始封包長度通常等於 caplen

C/C++ 使用 libpcap 產生範例

#include 

int main() {
    const char *hex = "FFFFFFFFFFFF00112233445500AABBCCDDEEFF08004500..."; // 你的十六進制字串
    size_t hex_len = strlen(hex);
    size_t bin_len = hex_len / 2;
    u_char *bin = malloc(bin_len);
    for (size_t i = 0; i < bin_len; ++i) {
        sscanf(hex + 2*i, "%2hhx", &bin[i]);
    }

    // 1. 開啟離線儲存器
    pcap_t *pd = pcap_open_dead(DLT_EN10MB, 65535);
    pcap_dumper_t *dumper = pcap_dump_open(pd, "manual.pcap");

    // 2. 填寫封包頭
    struct pcap_pkthdr hdr = {0};
    hdr.ts.tv_sec = 0;
    hdr.ts.tv_usec = 0;
    hdr.caplen = bin_len;
    hdr.len = bin_len;

    // 3. 寫入封包
    pcap_dump((u_char*)dumper, &hdr, bin);

    // 4. 關閉
    pcap_dump_close(dumper);
    pcap_close(pd);
    free(bin);
    return 0;
}

Python 純標準庫實作(無需 libpcap)

import struct, binascii

hex_data = "FFFFFFFFFFFF00112233445500AABBCCDDEEFF08004500..."
bin_data = binascii.unhexlify(hex_data)

with open("manual.pcap", "wb") as f:
    # Global Header: little-endian
    f.write(struct.pack('

驗證步驟

  1. `wireshark manual.pcap` 或 `tshark -r manual.pcap` 開啟檢查。
  2. 確認 Frame 1 顯示正確協議層級(Ethernet → IP → TCP/UDP...)。
  3. 若解析異常,核對 `network` (DLT) 與實際封包鏈路層是否一致。

常見坑點

  • 位元組序**:PCAP 檔案標準為**小端序**,`struct.pack` 需用 `<` 前綴。
  • DLT 類型錯誤**:若封包無乙太網頭(如純 IP),需用 `DLT_RAW` (101) 或 `DLT_LINUX_SLL` (113)。
  • 時間戳全零**:Wireshark 仍可讀取,但無法做時間分析;建議填入真實 `gettimeofday`。

總結

已知十六進制封包資料 → **二進制化 → 填寫 Global Header + Packet Header + Data → 寫入檔案**。C 语言用 `pcap_open_dead`/`pcap_dump` 最省力;Python 純標準庫亦可輕鬆完成。

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