pcap报文格式和wireshak中的frame层

       这篇文章是我早期写的,后来为了撰写专栏《wireshark从入门到精通》,我在此文章基础上对内容部分进行了新增和改动,新文章见这里,对于wireshark想深入了解的同学欢迎订阅查看。

       本文主要聊一聊pcap报文文件格式以及wireshark frame层的相关内容。

       使用wireshark查看报文的时候发现,wireshark解码后所提供的信息除了我们所知道的各种协议的层之外(诸如IP层,TCP层,HTTP层的数据),其实在最上层还有一个frame层,如图1所示:

这里写图片描述

图1

       从图1中可以看出该层所提供的信息包括两类,一类是没有中括号的,这类信息表示的是,从pcap数据报文本身能够提取的一些信息。像Encapsulation type: Ethernet (1)表示以太网的链路;Arrival Time: Apr 15, 2018 10:11:42.583288000以及Epoch Time: 1523758302.583288000 seconds表示获取报文的时间,只是两种不同的时间格式;Frame Length: 255 bytes (2040 bits)表示数据的长度,也就是根据协议这种类格式中length所得到的长度,和后面的Capture Length长度略有不同: Capture Length: 255 bytes (2040 bits)表示在网卡上所捕获的实际数据长度。通常情况下Frame Length和Capture Length 是相同的,但是如果Capture Length所捕获的数据有缺失,则Capture Length要比Frame Length要小一些。另外一类是带有中括号的,这类信息表示的是根据报文整体的分析所给出的辅助性信息。像[Protocols in frame: eth:ethertype:ip:tcp:ssl]这种信息就是根据报文解码分析所得到的,pcap本身并不含有这些字段信息。

       上述frame层中这些没有中括号的信息都是从pcap 报文中获取,但是又不是协议所提供的,这些信息不属于网络传输过程中传输协议数据或者传输内容数据的一部分,属于的是诸如winpcap 以及libpcap 这种用于抓取网络数据的库,在抓取数据时候将每一片的报文添加的一些头部信息中的内容,因此有必要简单介绍一些pap文件的构成,如图2所示。
这里写图片描述

图2

       在wireshark的官网,这里给出了pcap文件的存储格式,如图2。如同现有的文件格式包括我们所分析的各种协议,其实都有固定的一种模式,那就是tlv意思就是type,length,value。 之于文件来说,type就是告诉解码器文件的类型; length就是告诉解码器文件内容长度;value就是具体的内容数据。

       如图2所示,可以看到一个总的头部信息Global Header,以及每一片报文会有其对应的头部信息Packet Header,这些信息都是在形成pcap 报文的过程中主动写进去的,剩下的Packet Data表示抓取网络通信中的实际数据内容。分别解释一下Global Header以及Packet Header中个字段的含义。

       在wireshark官网中给出的Global Header头部包含如下各字段:

typedef struct pcap_hdr_s {
        guint32 magic_number;   /* magic number */
        guint16 version_major;  /* major version number */
        guint16 version_minor;  /* minor version number */
        gint32  thiszone;       /* GMT to local correction */
        guint32 sigfigs;        /* accuracy of timestamps */
        guint32 snaplen;        /* max length of captured packets, in octets */
        guint32 network;        /* data link type */
} pcap_hdr_t;

       给出的Packet Header头部包含如下各字段:

typedef struct pcaprec_hdr_s {
        guint32 ts_sec;         /* timestamp seconds */
        guint32 ts_usec;        /* timestamp microseconds */
        guint32 incl_len;       /* number of octets of packet saved in file */
        guint32 orig_len;       /* actual length of packet */
} pcaprec_hdr_t;

       下面的码流为使用sublime打开上述图1中frame38报文效果:

d4c3 b2a1 0200 0400 0000 0000 0000 0000
0000 0400 0100 0000 deb4 d25a 78e6 0800
ff00 0000 ff00 0000 fcd7 33ec 414a 446d
57bb 14a1 0800 4500 00f1 20e2 4000 8006
423e c0a8 0072 b461 216b ced2 01bb 5e7a
21d5 6546 e5be 5018 40b0 c8f6 0000 1603
0100 c401 0000 c003 0389 0bb6 3b80 f388
3965 716e b3d9 c374 258d 6ce3 ca20 6748
68dc d4d0 25e3 f3b2 1e00 001c 8a8a c02b
c02f c02c c030 cca9 cca8 c013 c014 009c
009d 002f 0035 000a 0100 007b baba 0000
ff01 0001 0000 0000 1200 1000 000d 7777

       Global Header中magic_number 为文件开始表示,一般为0xd4c3b2a1,同时头部字节需要交换读取顺序,如上述码流所示。如果我们在windows上使用nodepadd++以ANSI 格式编码(由于我使用的是中文操作系统,因此其对应编码方式应该是gbk)查看的时候,会显示前两个汉字为“悦病”,则是因为悦在gbk编码中为Oxd4c3,而病为0xb2a1(好像在gb2312 中病的编码为0xb2a0,这个略有不同)。version_major和version_minor一共4个字节表示大小版本号,即pcap格式版本,当前版本为2.4,如上。thiszone为4个字节的区域时间信息,默认为GMT,其值为0。sigfigs为4个字节的精确时间戳,通常默认为0。snaplen为4个字节的包最大长度描述的是允许抓取的每一片报文的最大长度,一般默认 ffff 0000 ,65535个字节即可以表示通常报文的最大长度,我这里面设置为 0400 0000(头部字节需要交换读取顺序)表示一个比较大的字节大小,如果想限制抓取每一片报文的长度,则可以设置。network为4个字节的链路类型,就是反应在frame 层中的Encapsulation type Ethemet(1)其值为1。

       每一片Packet Header中包括ts_sec和ts_usec共8 个字节的时间信息,体现在Frame 中主要是每一片报文的捕获时间,为 deb4 d25a 78e6 0800,转换后的时间为Apr 15, 2018 10:11:42.583288000,在一开始的图中则有体现;incl_len为4 个字节的捕获长度信息,以及orig_len为4个字节的实际长度信息,均为ff00 0000,转换为主机字节序表示255个字节长度。至于incl_len和orig_len的区别,在前面介绍frame层信息的时候已经阐述。

       当然frame虽然不是网络协议的一部分,但是wireshark却像各个协议一样为frame层提供了显示过滤器,供筛选报文之用,如图3:
这里写图片描述

图3

       通过上述的介绍应该可以对frame 层所提供的信息以及pcap文件格式有了总体的认识。

       本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

Wireshark是一款常用的网络抓包工具,而Wireshark Lua插件可以帮助我们从pcap报文提取出文件、图片和视频等特定类型的数据。 首先,我们需要通过Wireshark打开一个pcap文件,在“File”菜单选择“Open”,然后选择相应的pcap文件并打开它。接下来,我们需要使用Wireshark Lua插件来提取我们所需的文件、图片或视频。 对于文件的提取,我们可以编写一个简单的Lua脚本来实现。首先,在Wireshark的安装目录下找到“plugins”文件夹,创建一个新的文件夹,并将Lua脚本命名为“extract_files.lua”。然后,打开该Lua脚本,在其编写以下代码: ``` -- 获取所有的数据包 local packets = {} do local iter = 0 -- 遍历每个数据包 -- 通过wireshark.file()来获取文件 function process_packet(pinfo, tvb) iter = iter + 1 local filedata = wireshark.file():open(pinfo.number .. "_file") if filedata then table.insert(packets, filedata) end end -- 便利数据包 -- 这个函数将在每个数据包到达时被调用 -- 这里定义了我们要捕获的协议为HTTP function main() ip_proto_table = DissectorTable.get("ip.proto") ip_proto_table:add(6, http_proto) ip_proto_table:add(17, http_proto) end end ``` 以上代码的功能是在每个HTTP数据包到达时打开一个文件,然后将该文件添加到`packets`列表。 接下来,我们可以在终端使用Wireshark Lua插件来运行我们的脚本。在终端输入以下命令: ``` wireshark -X lua_script:extract_files.lua -r your_pcap_file.pcap ``` 在运行命令后,Wireshark将根据我们的脚本提取pcap文件的所有文件,并将其保存在新的文件夹。 对于提取图片和视频,我们可以编写类似的脚本,只需要根据特定的协议或数据包格式来过滤和提取我们所需的图片或视频文件即可。 总之,Wireshark Lua插件提供了一种灵活的方式来从pcap报文提取文件、图片和视频等特定类型的数据。通过编写适当的Lua脚本,我们可以轻松地提取出我们需要的数据,并进一步分析和处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

村中少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值