From 643be473a255242218c047d6bacddffd681a69f6 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/saprus.go | 8 +++--- server/utils/raw_packet_send.go | 44 ++++++++++++++++++++++++++++----- 5 files changed, 75 insertions(+), 22 deletions(-) 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/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/raw_packet_send.go b/server/utils/raw_packet_send.go index 7f237bb..54ec6e4 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,37 @@ 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 +95,17 @@ func (c* SocketCall)init(data string) { SrcPort: 6868, DstPort: 6767, } + + // FUCK THIS + 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), }