您的位置:

深入了解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