0

我使用 gopacket 从原始字节创建了一个数据包,并将这些数据包写入 pcap 文件。

我从原始字节创建了一个 UDP 数据包,如下所示。

package main

import (
        "fmt"
        "net"
        "log"
        "os"
        "time"
        //"encoding/hex"
        "github.com/google/gopacket"
        "github.com/google/gopacket/layers"
        "github.com/google/gopacket/pcap"
        "github.com/google/gopacket/pcapgo"
)

var (
        device       string = "eth0"
        snapshot_len int32  = 65535
        promiscuous  bool   = false
        err          error
        timeout      time.Duration = 30 * time.Second
        handle       *pcap.Handle
        buffer       gopacket.SerializeBuffer
        options      gopacket.SerializeOptions
)

func main() {
        ethernetLayer := &layers.Ethernet{
            SrcMAC: net.HardwareAddr{0xFF, 0xAA, 0xFA, 0xAA, 0xFF, 0xAA},
            DstMAC: net.HardwareAddr{0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD},
        }
        ipLayer := &layers.IPv4{
            SrcIP: net.IP{127,0,0,1},
            DstIP: net.IP{8,8,8,8},
        }
        udpLayer := &layers.UDP{
            SrcPort: 51190,
            DstPort: 4789,
        }
        rawBytes := []byte{10, 20, 30}
        buffer = gopacket.NewSerializeBuffer()
        gopacket.SerializeLayers(buffer, options,
                ethernetLayer,
                ipLayer,
                udpLayer,
                gopacket.Payload(rawBytes),
        )
        outgoingPacket := buffer.Bytes()
        fmt.Println(outgoingPacket)
        ethpacket := gopacket.NewPacket(outgoingPacket,
                                    layers.LayerTypeEthernet,
                                    gopacket.Default )

如何将此数据包写入 pcap 文件。

我在此链接上找到的示例显示了如何从设备读取数据包并写入 pcap 文件,但没有给出当我有一堆数据包时写入 pcap 文件的示例。

https://www.devdungeon.com/content/packet-capture-injection-and-analysis-gopacket#write-pcap-file

请帮助我继续进行此操作。

因为,我已经有了我的数据包框架,所以我修改了写 pcap 代码如下。

        f, err := os.Create("temp.pcap")
        if err != nil {
                log.Fatal(err)
                os.Exit(1)
        }
        defer f.Close()

        w := pcapgo.NewWriter(f)
        w.WriteFileHeader(uint32(snapshot_len), layers.LinkTypeEthernet)
        err = w.WritePacket(ethpacket.Metadata().CaptureInfo, ethpacket.Data())
        if err != nil {
            log.Fatal(err)
        }

运行程序后,这是它抛出的错误。pcap 文件显示 24 个字节,其中只有 pcap 文件头。

去运行 create_pcap.go

2021/08/24 06:34:22 捕获长度 0 与数据长度 60 不匹配

ls -l

-rw-r--r-- 1 根 24 Aug 24 06:34 temp.pcap

4

0 回答 0