深入了解pcapng格式

一、pcapng概覽

pcapNG格式(Libpcap Next Generation Dump File Format)是新一代抓包文件格式,它支持更多種類的抓包設備和文件的元數據。pcapNG格式於2009年推出,並逐漸受到網路安全行業的廣泛關注和使用。

每一個pcapng文件都可以包含多個塊(block),每個塊可以包含多個子塊(sub-block)。每個塊和子塊都有頭部和數據部分組成。

二、pcapng文件頭

每個pcapng文件都有一個文件頭,描述整個文件的屬性和特徵。文件頭由一個「section header block」組成,它包含了版本號、操作系統、捕獲軟體、硬體等信息,還可以指定每個塊的位元組序。

typedef struct pcapng_hdr_s{
    uint32_t magic_number;  // 標識文件類型
    uint16_t version_major;  // 主版本號
    uint16_t version_minor;  // 子版本號
    int64_t  section_length;  // 文件長度
    uint32_t byte_order_magic;  // 位元組序
} pcapng_hdr_t;

三、數據塊

pcapng文件是由很多不同的塊組成,每個塊都有一個頭部和數據。

最常用的塊是「interface block」,它包含一個網路介面的描述信息。比如MAC地址、IP地址、類型等。

typedef struct interface_block_s{
    uint32_t block_type;  // 塊類型
    uint32_t block_total_length;  // 數據塊長度
    uint16_t link_type;  // 鏈路類型
    uint16_t reserved;  // 保留位
    uint32_t snap_len;  // 最大抓包長度
} interface_block_t;

四、擴展數據塊

pcapng格式支持用戶自定義塊,這些塊被稱為擴展數據塊(enhanced packet block)。擴展數據塊可以存儲模擬數據,或者在實際數據流中插入自定義數據。擴展數據塊的存在可以大大增加pcapng格式的靈活性和擴展性。

typedef struct enhanced_packet_block_s{
    uint32_t block_type;  // 塊類型
    uint32_t interface_id;  // 介面id
    int64_t timestamp_high;  // 時間戳高8位元組
    int64_t timestamp_low;   // 時間戳低8位元組
    uint32_t capture_len;  // 抓包長度
    uint32_t packet_len;   // 包長度
} enhanced_packet_block_t;

五、文件實例

以一個簡單的HTTP消息為例,來說明pcapng格式的結構。下面是一個示例HTTP請求的抓包結果:

000000: 00 50 56 c0 00 01 52 54 00 12 35 14 08 00        .PV...RT..5...
000008: 45 00 00 4a 1b 54 40 00 40 06 56 45 c0 a8 01 01   E..J.T@.@.VE....
000016: 81 62 53 ea 00 50 b9 63 b9 9b c3 2c 1b c1 50 18   .bS..P.c...,.P.
000024: fa f0 2d 8c 00 00 47 45 54 20 2f 20 48 54 54 50   ..-...GET / HTTP
000032: 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 6c 6f 63 61   /1.1..Host: loca
000040: 6c 68 6f 73 74 0d 0a 55 73 65 72 2d 41 67 65 6e   lhost..User-Agen
000048: 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 20 28   t: Mozilla/5.0 (
000056: 57 69 6e 64 6f 77 73 20 4e 54 20 31 30 2e 30 3b   Windows NT 10.0;
000064: 20 57 69 6e 36 34 3b 20 78 36 34 29 20 41 70 70    Win64; x64) App
000072: 6c 65 57 65 62 4b 69 74 2f 35 33 37 2e 33 36 20   leWebKit/537.36 
000080: 28 4b 48 54 4d 4c 2c 20 6c 69 6b 65 20 47 65 63   (KHTML, like Gec
000088: 6b 6f 29 20 43 68 72 6f 6d 65 2f 38 57 2e 30 2e   ko) Chrome/8W.0.
000096: 34 38 30 38 2e 31 31 39 20 53 61 66 61 72 69 2f   4808.119 Safari/
000104: 35 33 37 2e 33 36 0d 0a 41 63 63 65 70 74 3a 20   537.36..Accept: 
000112: 74 65 78 74 2f 68 74 6d 6c 2c 20 61 70 70 6c 69   text/html, appli
000120: 63 61 74 69 6f 6e 2f 78 68 74 6d 6c 2b 78 6d 6c   cation/xhtml+xml
000128: 3b 20 71 3d 30 2e 39 2c 20 2a 2f 2a 3b 20 71 3d   ; q=0.9, */*; q=
000136: 30 2e 38 0d 0a 41 63 63 65 70 74 2d 45 6e 63 6f   0.8..Accept-Enco
000144: 64 69 6e 67 3a 20 67 7a 69 70 2c 20 64 65 66 6c   ding: gzip, defl
000152: 61 74 65 0d 0a 41 63 63 65 70 74 2d 4c 61 6e 67   ate..Accept-Lang
000160: 75 61 67 65 3a 20 7a 68 2d 43 4e 2c 7a 68 3b 71   uage: zh-CN,zh;q
000168: 3d 30 2e 39 2c 65 6e 2d 55 53 3b 71 3d 30 2e 38   =0.9,en-US;q=0.8
000176: 0d 0a 43 6f 6f 6b 69 65 3a 20 5f 5f 75 74 6d 5f   ..Cookie: __utm_
000184: 7a 3d 31 2e 34 33 38 35 31 31 34 31 2e 31 33 33   z=1.43851141.133
000192: 33 38 36 32 32 32 39 2e 31 33 36 38 30 39 39 39   8632229.13680999
000200: 2e 31 36 33 34 38 36 38 39 39 3b 20 5f 74 7a 3d   .163486899; _tz=
000208: 2e 2d 38 3b 20 5f 67 61 3d 47 41 31 2e 32 32 35   .-8; _ga=GA1.225
000216: 33 32 32 33 30 37 2e 31 33 36 38 30 31 2e 31 34   322307.136801.14
000224: 34 36 38 34 34 37 3b 20 5f 67 69 64 3d 43 67 7a   468447; _gid=Cgz
000232: 49 6f 76 45 32 30 31 76 47 6d 4c 5a 6a 34 32 47   IovE201vGmLZj42G
000240: 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65   ..Connection: ke
000248: 65 70 2d 61 6c 69 76 65 0d 0a 0d 0a               ep-alive....

上述抓包文件結合HTTP協議的規範解釋:

  • 前8位元組:表示數據包的時間戳(Thu Nov 23 19:14:53.391640),的雙精度位表示,收集到的時間戳,秒數的高位在最高位,後64位表示精確到微秒。
  • 接下來4位元組: 表示數據包的長度(0x00000098),即實際收到的大小,可以少於原始分組大小,或者被截斷。*
  • 接下來的數據:是捕獲的數據本身,它被限制到抓取大小(0x000000c0),這是啟動Wireshark時為抓取設置的最大捕獲大小。

我們可以將上述數據轉換成pcapng格式:

00000000: 0a 0d 0d 0a 04 00 00 00 05 00 00 00 ff ff 00 00   ................
00000010: 53 62 3a 66 00 00 00 00 01 00 00 00 c0 00 00 00 Sb:f............
00000020: 98 00 00 00 f2 b1 e5 8c 41 67 6c 55 11 bd c9 e9 ........AglU....
00000030: cf ae 0b 3c 08 00 45 00 00 c0 1b 3a 40 00 40 06 ...<..E....:@.@.
00000040: cb a8 c0 a8 01 01 81 62 53 ea 00 50 b9 63 b9 9b ......bS..P.c..
00000050: c3 2c 1b c1 50 18 fa f0 2d 8c 47 45 54 20 2f 20 .,..P...-.GET /
00000060: 48 54 54 50 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 HTTP/1.1..Host:
00000070: 6c 6f 63 61 6c 68 6f 73 74 0d 0a 55 73 65 72 2d localhost..User-
00000080: 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 Agent: Mozilla/5
00000090: 2e 30 20 28 57 69 6e 64 6f 77 73 20 4e 54 20 31 .0 (Windows NT 1
000000a0: 30 2e 30 3b 20 57 69 6

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291672.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 14:06
下一篇 2024-12-25 14:06

相關推薦

  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • 如何將視頻導出成更小的格式給IT前端文件

    本文將從以下幾個方面介紹如何將視頻導出成更小的格式,以便於在IT前端文件中使用。 一、選擇更小的視頻格式 在選擇視頻格式時,應該儘可能選擇更小的格式,如MP4、WebM、FLV等。…

    編程 2025-04-28
  • JavaScript中使用new Date轉換為YYYYMMDD格式

    在JavaScript中,我們通常會使用Date對象來表示日期和時間。當我們需要在網站上顯示日期時,很多情況下需要將Date對象轉換成YYYYMMDD格式的字元串。下面我們來詳細了…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25

發表回復

登錄後才能評論