一、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