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