pcap(cap)包文件解析

https://blog.csdn.net/m0_37710388/article/details/89217421

    pcap文件是常用的数据报存储格式,可以理解为就是一种文件格式,只不过里面的数据是按照特定格式存储的,所以我们想要解析里面的数据,也必须按照一定的格式。普通的记事本打开pcap文件显示的是乱码,用Ultra Edit能够以16进制数据的格式显示,用wireshark这种抓包工具就可以正常打开这种文件,愉快地查看里面的网络数据报了,同时wireshark也可以生成这种格式的文件。当然这些工具只是我经常使用的,还有很多其它能够查看pcap文件的工具。

.pcap/.cap文件结构如下:


1.Pcap Header

    文件头,每一个pcap文件只有一个文件头,总共占24(B)字节,以下是总共7个字段的含义。

Magic(4B): 标记文件开始,并用来识别文件和字节顺序。值可以为0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原来的顺序一个字节一个字节的读,如果是0xd4c3b2a1表示小端模式,下面的字节都要交换顺序。现在的电脑大部分是小端模式。

Major(2B): 当前文件的主要版本号,一般为0x0200

Minor(2B): 当前文件的次要版本号,一般为0x0400

ThisZone(4B): 当地的标准事件,如果用的是GMT则全零,一般全零

SigFigs(4B): 时间戳的精度,一般为全零

SnapLen(4B): 最大的存储长度,设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将值设置为65535

LinkType(4B): 链路类型。解析数据包首先要判断它的LinkType,所以这个值很重要。一般的值为1,即以太网
常用的LinkType(链路类型):
值     类型描述
0     BSD loopback devices, except for later OpenBSD
1     Ethernet, and Linux loopback devices
6     802.5 Token Ring
7     ARCnet
8     SLIP
9     PPP
10     FDDI
100     LLC/SNAP-encapsulated ATM
101     “raw IP”, with no link
102     BSD/OS SLIP
103     BSD/OS PPP
104     Cisco HDLC
105     802.11
108     later OpenBSD loopback devices (with the AF_value in network byte order)
113     special Linux “cooked” capture
114     LocalTalk
2.Packet Header

数据包头可以有多个,每个数据包头后面都跟着真正的数据包。以下是Packet Header的4个字段含义

Timestamp(4B): 时间戳高位,精确到seconds,这是Unix时间戳。捕获数据包的时间一般是根据这个值
Timestamp(4B): 时间戳低位,能够精确到microseconds
Caplen(4B): 当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len(4B): 离线数据长度,网路中实际数据帧的长度,一般不大于Caplen,多数情况下和Caplen值一样
3.Packet Data

Packet是链路层的数据帧,长度就是Packet Header中定义的Caplen值,所以每个Packet Header后面都跟着Caplen长度的Packet Data。也就是说pcap文件并没有规定捕获的数据帧之间有什么间隔字符串。Packet数据帧部分的格式就是标准的网络协议格式了。

eg:
下图为16进制pcap文件:

备注:
红色部分:Pcap Header
蓝色部分:Packet Header
PcapHeader

Magic(4B): D4 C3 B2 A1 表示小端模式,后面的字节从后往前读;
Major(2B): 02 00,计算机读的是00 02;
Minor(2B): 04 00,计算机读的是00 04;
ThisZone(4B): 00 00 00 00,全零;
SigFigs(4B): 00 00 00 00,全零;
SnapLen(4B): FF FF 00 00, 计算机读的是:00 00 FF FF,所以是2^16-1=65535
LinkType(4B): 01 00 00 00, 计算机读的是:00 00 00 01,表示是以太网类型
Packet Header

Timestamp(4B): CA 4D A4 5C,计算机读的是:5C A4 4D CA,十进制:1554271690,日期为:2019-04-03 14:08:10;
Timestamp(4B): 4F 2A 08 00,计算机读的是:00 08 2A 4F,十进制:535119,代表535119ms;
Caplen(4B): BA 1C 00 00, 计算机读的是:00 00 1C BA,十进制:7354,代表后面的7354个字节为一个数据帧,之后又是一个新的PacketHeader,如此循环;
Len(4B): BA 1C 00 00,和Caplen相同

wireshark打开.pcap文件:

  • 15
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 Golang 中解析 pcap 并还原文件,可以使用第三方库 `gopacket` 和 `pcap`。其中,`gopacket` 是一个用于解析和操作网络数据的库,而 `pcap` 则是一个用于读取和写入 pcap 格式文件的库。 以下是一个简单的示例代码: ```go package main import ( "fmt" "github.com/google/gopacket" "github.com/google/gopacket/layers" "github.com/google/gopacket/pcap" "os" ) func main() { // 打开 pcap 文件 handle, err := pcap.OpenOffline("test.pcap") if err != nil { fmt.Fprintf(os.Stderr, "Error opening pcap file: %s\n", err) os.Exit(1) } defer handle.Close() // 设置过滤器,只捕获 TCP 流量 filter := "tcp" err = handle.SetBPFFilter(filter) if err != nil { fmt.Fprintf(os.Stderr, "Error setting BPF filter: %s\n", err) os.Exit(1) } // 迭代 pcap 文件中的数据 packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) for packet := range packetSource.Packets() { // 获取 TCP 层数据 tcpLayer := packet.Layer(layers.LayerTypeTCP) if tcpLayer == nil { continue } tcp, _ := tcpLayer.(*layers.TCP) // 获取 TCP 数据内容 payload := tcp.Payload // 将 TCP 数据内容写入文件 f, err := os.OpenFile("output", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Fprintf(os.Stderr, "Error opening output file: %s\n", err) os.Exit(1) } defer f.Close() _, err = f.Write(payload) if err != nil { fmt.Fprintf(os.Stderr, "Error writing to output file: %s\n", err) os.Exit(1) } } } ``` 以上代码实现了读取 pcap 文件中的 TCP 数据,并将 TCP 数据内容写入到文件中。需要注意的是,由于 pcap 文件中的数据可能是经过压缩、加密等处理的,因此需要根据具体的情况对数据进行还原。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值