github.com/qiwihui/DBShield@v0.0.0-20171107092910-fb8553bed8ef/misc/scripts/pcap2bytearray.go (about)

     1  // +build !windows
     2  
     3  // Converts pcap file to go byte array format to simpilify making test cases.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"log"
    10  	"os"
    11  	"strconv"
    12  
    13  	"github.com/google/gopacket"
    14  	"github.com/google/gopacket/layers"
    15  	"github.com/google/gopacket/pcap"
    16  )
    17  
    18  const fromClient = "0"
    19  const fromServer = "1"
    20  
    21  func main() {
    22  	if len(os.Args) == 2 {
    23  		var handle *pcap.Handle
    24  		var err error
    25  		if handle, err = pcap.OpenOffline(os.Args[1]); err != nil {
    26  			log.Fatal("PCAP OpenOffline error:", err)
    27  		}
    28  		run(handle)
    29  	} else {
    30  		println("go run pcam2bytearray.go file.pcap")
    31  	}
    32  }
    33  
    34  func hex(num int) string {
    35  	str := "0x"
    36  	if num < 16 {
    37  		str += "0"
    38  	}
    39  	return fmt.Sprintf("%s%X", str, int(num))
    40  }
    41  
    42  func run(src gopacket.PacketDataSource) {
    43  	dec := gopacket.DecodersByLayerName["Ethernet"]
    44  	source := gopacket.NewPacketSource(src, dec)
    45  	var c, s string
    46  	for packet := range source.Packets() {
    47  		var str *string
    48  		tcpLayer := packet.Layer(layers.LayerTypeTCP)
    49  		if tcpLayer == nil {
    50  			continue
    51  		}
    52  		tcp := tcpLayer.(*layers.TCP)
    53  		payload := tcpLayer.LayerPayload()
    54  		if len(payload) == 0 {
    55  			continue
    56  		}
    57  
    58  		if _, err := strconv.Atoi(tcp.SrcPort.String()); err != nil {
    59  			str = &s
    60  		} else {
    61  			str = &c
    62  		}
    63  
    64  		*str += " {\n    "
    65  		for i, b := range payload {
    66  			*str += hex(int(b)) + ", "
    67  			if (i+1)%12 == 0 {
    68  				*str += "\n    "
    69  			}
    70  		}
    71  		*str += "\n },\n"
    72  	}
    73  
    74  	fmt.Println("c.Buffer = [][]byte{")
    75  	fmt.Print(c)
    76  	fmt.Println("}")
    77  	fmt.Println("s.Buffer = [][]byte{")
    78  	fmt.Print(s)
    79  	fmt.Println("}")
    80  }