网络分析笔记01:pcapng格式的整体解包

本文详细介绍了pcapng文件格式,包括其特点、块结构、不同类型的块,如节头块、接口描述块、增强分组块等。还提供了Python进行块解析的源代码及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  本文首先介绍对pcapng格式进行介绍,然后讲解pcapng的整体结构,并使用Python语言进行块(block)的解包。

  在此需要说明的是,本文是为了能够深入对pcapng格式进行分析,所以不使用python的scapy库。


一、pcapng文件

  对网络传输数据进行处理,需使用专用的抓包工具,例如WireShark等,对于抓包后的数据进行分析,就需要用到一些专用的数据格式,pcapng就是其中广为使用的一种。我们先对其进行简要介绍。

1、pcapng概述

  网络上的数据是以流的方式进行数据传输的,我们从网络上抓包后,需要进行数据分析,所以需要对数据进行存储,pcapng就是用于存储的格式。

  pcnpng来源于IETF(互联网工程工作组),是pcap的新一代格式,相比较于原有的pcap格式,更具有逻辑性和可扩展性。

2、特点

(1)支持从多接口捕获

  pcapng允许捕获文件使用“接口描述块”定义多个接口。 每个包都可以与特定的接口相关联。

(2)提高时间戳分辨率

  pcap的时间戳分辨率是微秒,pcapng的时间戳是一个64位数,表示自1970年1月1日以来的时间单位数量。

(3)可以嵌入注释信息

  pcapng允许在捕获文件中嵌入注释信息。

(4)可嵌入额外数据

  使用pcapng,接口描述块允许描述字段、操作系统字段和过滤器字段,这些字段可以提供捕获源的额外细节。

(5)可扩展文件格式

   该格式部署了一个通用的块结构,该结构允许工具忽略未理解的块。 这允许格式随着时间的推移而演进。 特定的块是为接口和包定义的。 额外的元数据可以存储在可选块中。

二、块(block)结构

1、块结构

  pcapng由各种block组成,其结构描述如下:
在这里插入图片描述

2、字段含义

(1)block type

  不同类型的块有不同的类型值。

(2)block total length。

  块的总长度,单位字节,
  block body的长度 = block total length - 12

(3)block body

  4字节对齐。

(4)block total length

  重复长度。

三、block的类型

  主要块类型如下:

1、节头块(Section Header Block)

  0x0A0D0D0A
  节头块是强制性的,它确定了捕获转储文件的一节的开头。节头块不包含数据,而是标识了逻辑上相关的块(接口块,数据块)列表。

2、接口描述块(Interface Description Block)

  0x00000001
  接口描述块是强制性的。该块被用来指定进行捕获的网络接口的特性。 为了把捕获的数据关联到相应的接口,该接口描述块必须在使用它的任何其它块之前定义; 因此,此块通常会紧跟着节头块放置。 一个接口描述块只在其所在的一节内有效的。

3、分组块(Packet Block)

  0x00000002
  过时,使用增强分组块代替,

4、简单分组块(Simple Packet Block)

  0x00000003
  简单分组块是可选的,用于存储来自网络的分组的轻量级容器。
  简单分组块类似于分组块(见第3.5节),但它更小、处理起来更简单,只包含了一组最小信息集合。当性能或占用空间是关键因素时,这个块将优先于标准分组块被使用,如在持续流量转储应用程序。一个捕获文件可以同时包含分组块和简单的数据包块:例如硬件资源成为瓶颈时,捕捉工具可以从分组块切换到简单分组块。

5、名称解析块(Name Resolution Block

  0x00000004
  名称解析块用来把数字地址(存在于捕获的数据包)及其相应的规范名称关联起来,这是可选的。通过在文件中保存名称,这可以防止名称解析中的延迟时间。名称解析块避免了在跟踪捕获文件时发出大量的DNS的请求,并且允许在未联网的计算机上读取捕获数据时进行名称解析。

6、接口统计块(Interface Statistics Block)

  0x00000005
  接口统计块是可选的,它包含给定接口的捕获统计信息。在当前节(Section)中,接口相关的统计信息被接口ID字段中标识的接口引用。接口统计块通常被放置在该文件的末尾,但是没有明确要求关于其放置位置 - 它甚至可以出现多次对相同的接口。

7、增强分组块(Enhanced Packet Block)

  0x00000006
  一个增强分组块是用来存储来自网络的数据包的标准容器。增强型分组块是可选的,因为数据包可以通过该块或简单分组块进行存储。

四、块解析源代码(Python)

import sys
import struct

file = open("example.pcap", "rb")
file_result = open("result.txt", "w")
blockNumber = 0

print("对pcap文件进行分析...")

while True:
    # 读取block类型和长度
    try:
        data = file.read(8)
    except Exception as error:
        break
    if len(data) < 8:
        break

    print(".", end = "")

    (block_type, block_total_len) = struct.unpack("=LL", data)
    blockNumber = blockNumber + 1
    # 判读block类型和长度
    if block_type == 0x0A0D0D0A:
        file_result.write("|--%05u号块,类型:节头块(Section Header Block, 0x%08x)\n" % (blockNumber, block_type))
    elif block_type == 0x0000001:
        file_result.write("|--%05u号块,类型:接口描述块(Interface Description Block, 0x%08x)\n" % (blockNumber, block_type))
    elif block_type == 0x0000002:
        file_result.write("|--%05u号块,类型:分组块(Packet Block, 0x%08x)\n" % (blockNumber, block_type))
    elif block_type == 0x0000003:
        file_result.write("|--%05u号块,类型:简单分组块(Simple Packet Block, 0x%08x)\n" % (blockNumber, block_type))
    elif block_type == 0x0000004:
        file_result.write("|--%05u号块,类型:名称解析块(Name Resolution Block, 0x%08x)\n" % (blockNumber, block_type))
    elif block_type == 0x0000005:
        file_result.write("|--%05u号块,类型:接口统计块(Interface Statistics Block, 0x%08x)\n" % (blockNumber, block_type))
    elif block_type == 0x0000006:
        file_result.write("|--%05u号块,类型:增强分组块(Enhanced Packet Block, 0x%08x)\n" % (blockNumber, block_type))
    else:
        file_result.write("|--%05u号块,类型:未知(unknow, 0x%08x\n)" % (blockNumber, block_type))
    file_result.write("|  |--长度:%d\n" % block_total_len)
    block_bytes = file.read(block_total_len - 8)

file_result.write("|--所有包均已读取完毕!\n")
print("\npcap文件分析完毕!")

五、运行结果

|--00001号块,类型:节头块(Section Header Block, 0x0a0d0d0a)
|  |--长度:184
|--00002号块,类型:接口描述块(Interface Description Block, 0x00000001)
|  |--长度:88
|--00003号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:628
|--00004号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:628
|--00005号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:628
|--00006号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:180
|--00007号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:180
|--00008号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:180
|--00009号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:628
|--00010号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:628
|--00011号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:628
|--00012号块,类型:增强分组块(Enhanced Packet Block, 0x00000006)
|  |--长度:180
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

snmplink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值