From 812096514d912aef9ab6610ecdacfffae43f9204 Mon Sep 17 00:00:00 2001 From: Pin Date: Mon, 20 Mar 2023 23:29:07 -0400 Subject: [PATCH] server updates --- client/golang/client.go | 24 ++++++++++------- server/README.md | 19 +++++++++++--- server/server.go | 2 +- server/structs/file_transfer.go | 21 +++++++++++++++ server/structs/saprus.go | 8 +++--- server/utils/file_transfer.go | 39 ++++++++++++++++++++++++++++ server/utils/packet_helper.go | 27 +++++++++++++++++++ server/utils/raw_packet_send.go | 46 ++++++++++++++++++++++++++++----- 8 files changed, 163 insertions(+), 23 deletions(-) create mode 100644 server/structs/file_transfer.go create mode 100644 server/utils/file_transfer.go create mode 100644 server/utils/packet_helper.go diff --git a/client/golang/client.go b/client/golang/client.go index b907abc..8c78022 100644 --- a/client/golang/client.go +++ b/client/golang/client.go @@ -1,12 +1,12 @@ package main import ( - "encoding/base64" + //"encoding/base64" "encoding/binary" "errors" "fmt" "net" - "strings" + //"strings" "time" "github.com/google/gopacket" @@ -21,10 +21,11 @@ func errCheck(err error) { } func listenDiscoverResponse(addrChan chan string, readyFlag chan int) { + finalMessage := "" handle, err := pcap.OpenLive("any", int32(1600), true, pcap.BlockForever) errCheck(err) - err = handle.SetBPFFilter("udp and port 8850") + err = handle.SetBPFFilter("udp and port 6767") errCheck(err) packets := gopacket.NewPacketSource(handle, handle.LinkType()).Packets() @@ -32,12 +33,17 @@ func listenDiscoverResponse(addrChan chan string, readyFlag chan int) { readyFlag <- 1 for pkt := range packets { - msg, err := base64.StdEncoding.DecodeString(string(pkt.ApplicationLayer().Payload())) + finalMessage = "" + payload := pkt.ApplicationLayer().Payload() + payloadLength := binary.BigEndian.Uint16([]byte{payload[2], payload[3]}) + + for i := uint16(0); i < payloadLength - 5; i++ { + finalMessage += string(payload[i+9]) + } + fmt.Println(finalMessage) if err == nil { - if strings.Contains(string(msg), "clientapi") { - addrChan <- string(msg) - return - } + //addrChan <- finalMessage + //return } } @@ -102,7 +108,7 @@ func main() { // Listen timeout select { case returnMSG := <- addrChan: - fmt.Printf("%s\n", strings.Fields(returnMSG)[1]) + fmt.Printf("%s\n", returnMSG) case <- time.After(5 * time.Second): fmt.Printf("error\n") } diff --git a/server/README.md b/server/README.md index 02b7d29..949d45e 100644 --- a/server/README.md +++ b/server/README.md @@ -31,8 +31,21 @@ Saprus Protocol Header: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Saprus Type | Length | | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ -| Saprus Type Payload (0-1455) | -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +| Saprus Type Payload (0-1454) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` +## File Transfer + +Saprus Type: 0x88 0x88 + +``` + 0 1 2 3 4 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Flag | Sequence | Checksum | | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +| Payload | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +``` diff --git a/server/server.go b/server/server.go index ab31730..bba06ba 100644 --- a/server/server.go +++ b/server/server.go @@ -38,7 +38,7 @@ func main() { log.Printf("Starting server\n") con := utils.SocketCall{} serv, err := net.ListenPacket("udp4", ":8888") - serverIP := "client data being send from the sender" + serverIP := "hello world this is saprus" msg := "clientapi: " + serverIP b64Msg := base64.StdEncoding.EncodeToString([]byte(msg)) diff --git a/server/structs/file_transfer.go b/server/structs/file_transfer.go new file mode 100644 index 0000000..abab9da --- /dev/null +++ b/server/structs/file_transfer.go @@ -0,0 +1,21 @@ +package structs + +import ( +) + +type SaprusFileTransfer struct { + Flag [1]byte + Sequence [2]byte + Checksum [2]byte + Payload []byte +} + +func (c SaprusFileTransfer) Bytes() []byte { + data := []byte{} + data = append(data, c.Flag[0]) + data = append(data, c.Sequence[0], c.Sequence[1]) + data = append(data, c.Checksum[0], c.Checksum[1]) + data = append(data, c.Payload...) + return data +} + diff --git a/server/structs/saprus.go b/server/structs/saprus.go index 7d3b184..58a6999 100644 --- a/server/structs/saprus.go +++ b/server/structs/saprus.go @@ -4,13 +4,15 @@ import ( ) type SaprusHeaderFrame struct { - PacketType uint16 - Length uint16 + PacketType [2]byte + Length [2]byte Payload []byte } func (c SaprusHeaderFrame) Bytes() []byte { - data := []byte{byte(c.PacketType), byte(c.Length)} + data := []byte{} + data = append(data, c.PacketType[0], c.PacketType[1]) + data = append(data, c.Length[0], c.Length[1]) data = append(data, c.Payload...) return data } diff --git a/server/utils/file_transfer.go b/server/utils/file_transfer.go new file mode 100644 index 0000000..9f223a7 --- /dev/null +++ b/server/utils/file_transfer.go @@ -0,0 +1,39 @@ +package utils + +import ( + "log" + "github.com/google/gopacket" + + "saprusserver/structs" +) + +func (c* SocketCall) FileTransferPacket(message string) gopacket.SerializeBuffer { + eth, ip, udp := basePacket(c) + + sapFile := structs.SaprusFileTransfer { + Flag: [1]byte{0x11}, + Sequence: [2]byte{0x22, 0x33}, + Checksum: [2]byte{0x44, 0x44}, + Payload: []byte(message), + } + + sapHeader := structs.SaprusHeaderFrame { + PacketType: [2]byte{0x88, 0x88}, + Length: c.saprusPayloadLength(sapFile.Bytes()), + Payload: sapFile.Bytes(), + } + + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions { + ComputeChecksums: true, + FixLengths: true, + } + + udp.SetNetworkLayerForChecksum(&ip) + err := gopacket.SerializeLayers(buf, opts, ð, &ip, &udp, gopacket.Payload(sapHeader.Bytes())) + if err != nil { + log.Panic(err) + } + return buf +} + diff --git a/server/utils/packet_helper.go b/server/utils/packet_helper.go new file mode 100644 index 0000000..3701514 --- /dev/null +++ b/server/utils/packet_helper.go @@ -0,0 +1,27 @@ +package utils + +import ( + "github.com/google/gopacket/layers" +) + +func basePacket(c* SocketCall) (layers.Ethernet, layers.IPv4, layers.UDP) { + eth := layers.Ethernet { + EthernetType: layers.EthernetTypeIPv4, + SrcMAC: c.Iface.HardwareAddr, + DstMAC: layers.EthernetBroadcast, + } + ip := layers.IPv4 { + Version: 4, + TTL: 64, + SrcIP: []byte{0, 0, 0, 0}, + DstIP: []byte{255, 255, 255, 255}, + Protocol: layers.IPProtocolUDP, + } + udp := layers.UDP { + SrcPort: 6868, + DstPort: 6767, + } + + return eth, ip, udp +} + diff --git a/server/utils/raw_packet_send.go b/server/utils/raw_packet_send.go index 7f237bb..292700d 100644 --- a/server/utils/raw_packet_send.go +++ b/server/utils/raw_packet_send.go @@ -1,8 +1,8 @@ package utils import ( - //"bytes" - //"encoding/binary" + "encoding/binary" + "fmt" "log" "net" "unicode/utf8" @@ -21,10 +21,12 @@ type SocketCall struct { func splitData(message string) []string { data := []string{} + maxPacketLength := 8 + //maxPacketLength := 1458 var i, j int - for i, j = 0, 1458; j < len(message); i, j = j, j+1458 { + for i, j = 0, maxPacketLength; j < len(message); i, j = j, j+maxPacketLength { for !utf8.RuneStart(message[j]) { j-- } @@ -35,15 +37,38 @@ func splitData(message string) []string { return data } +func (c* SocketCall) SendPackage(buf gopacket.SerializeBuffer) error { + _, err := c.conn.WriteTo(buf.Bytes(), &packet.Addr{HardwareAddr: layers.EthernetBroadcast}) + return err +} + func (c* SocketCall)SendData(message string) { + iface, _ := net.InterfaceByName("virbr0") + c.Iface = iface + + conn, _ := packet.Listen(iface, packet.Raw, int(layers.EthernetTypeIPv4), nil) + c.conn = conn + splitMessage := splitData(message) for i := 0; i < len(splitMessage); i++ { - c.init(splitMessage[i]) + c.SendPackage(c.FileTransferPacket(splitMessage[i])) } return } +func (c* SocketCall) saprusPayloadLength(pkt []byte) [2]byte{ + payloadLength := make([]byte, 2) + var length [2]byte + binary.BigEndian.PutUint16(payloadLength, uint16(len(pkt))) + + length[0] = payloadLength[0] + length[1] = payloadLength[1] + + return length +} + +/* func (c* SocketCall)init(data string) { iface, _ := net.InterfaceByName("virbr0") conn, err := packet.Listen(iface, packet.Raw, int(layers.EthernetTypeIPv4), nil) @@ -71,9 +96,16 @@ func (c* SocketCall)init(data string) { SrcPort: 6868, DstPort: 6767, } + + saprusPayloadLength := make([]byte, 2) + binary.BigEndian.PutUint16(saprusPayloadLength, uint16(len(data))) + var saprusPayloadLengthTwo [2]byte + saprusPayloadLengthTwo[0] = saprusPayloadLength[0] + saprusPayloadLengthTwo[1] = saprusPayloadLength[1] + saprus := structs.SaprusHeaderFrame{ - PacketType: 10, - Length: uint16(len(data)), + PacketType: [2]byte{0, 10}, + Length: saprusPayloadLengthTwo, Payload: []byte(data), } @@ -96,4 +128,4 @@ func (c* SocketCall)init(data string) { return } - +*/