From ec4f67ced760147ce535c8889306f4388fabe62e Mon Sep 17 00:00:00 2001 From: Verox001 Date: Tue, 25 Feb 2025 01:29:32 +0100 Subject: [PATCH] Finally finished fucking writeProperties --- main.go | 89 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 19 deletions(-) diff --git a/main.go b/main.go index 670bf1b..8984dff 100644 --- a/main.go +++ b/main.go @@ -3,11 +3,13 @@ package main import ( "bytes" "encoding/binary" + "encoding/hex" "encoding/json" "errors" "fmt" "io" "net" + "strings" ) const ( @@ -30,11 +32,6 @@ type HandshakePacket struct { NextState int } -type EncryptionPacket struct { - SharedSecret PrefixedByteArray - VerifyToken PrefixedByteArray -} - type LoginStartPacket struct { Name string UUID string @@ -62,6 +59,12 @@ type Player struct { ID string `json:"id"` } +type Property struct { + Name string `json:"name"` + Value string `json:"value"` + Signature string `json:"signature,omitempty"` // Optional field +} + type Chat struct { Text string `json:"text"` } @@ -152,27 +155,28 @@ func handleConnection(client *ClientState) { } fmt.Println("Login Start:", loginStart) - // Send Encryption Request back + // Send Login Success var packetData bytes.Buffer - writeVarInt(&packetData, 1) // Packet length: 1 byte for ID - packetData.WriteByte(0x01) // Encryption Request ID + packetData.WriteByte(0x02) // Login Success ID - // Server ID - writeString(&packetData, "JustAnotherServer") + // UUID + writeUUID(&packetData, loginStart.UUID) - // Public Key - writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}}) + // Username + writeString(&packetData, loginStart.Name) - // Verify Token - writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}}) + writeProperties(&packetData) - // Should authenticate (actually a boolean) - packetData.WriteByte(1) + var responsePacket bytes.Buffer + writeVarInt(&responsePacket, packetData.Len()) + responsePacket.Write(packetData.Bytes()) - if _, err := client.conn.Write(packetData.Bytes()); err != nil { - fmt.Println("Error sending encryption request:", err) + fmt.Println("Login Success Packet:", responsePacket.Bytes()) + + if _, err := client.conn.Write(responsePacket.Bytes()); err != nil { + fmt.Println("Error sending login success:", err) } else { - fmt.Println("Encryption request sent successfully") + fmt.Println("Login success sent successfully") } } else if client.nextState == 3 { // Transfer @@ -305,6 +309,34 @@ func writePrefixedByteArray(buf *bytes.Buffer, value PrefixedByteArray) { buf.Write(value.Data) } +func writeUUID(buf *bytes.Buffer, uuidStr string) { + // Remove hyphens from UUID (Minecraft expects raw bytes) + cleanUUID := strings.ReplaceAll(uuidStr, "-", "") + uuidBytes, err := hex.DecodeString(cleanUUID) + if err != nil { + fmt.Println("Error parsing UUID:", err) + return + } + buf.Write(uuidBytes) +} + +func writeProperties(buf *bytes.Buffer) { + // Write number of properties (1 property in this case) + writeVarInt(buf, 1) + + // Write "textures" property + writeString(buf, "GlitchedSteve") + + // Write Base64-encoded skin data + textureData := "ewogICJ0aW1lc3RhbXAiIDogMTc0MDQyMzYwMjU3NywKICAicHJvZmlsZUlkIiA6ICI5NjFlZjYzYTE0ZDQ0ZjdhODM1ZGFiMTRlMmFmNmUwOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJ1UGlwZSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8zZjg1NzhlZjU2MjliOWVhZmE2NWY4MDUxMGExMzdhNTc3MjEzNTg4MDU4NDUxYjA0NmViYjQ3ZWFiN2JhZDg3IgogICAgfQogIH0KfQ==" + writeString(buf, textureData) + + // Write signature + buf.WriteByte(1) // No signature + signature := "KcyYXr9cbd4Fy16JEjgcVNAEEnXvUTohvToqQjNbz2dIrCjoE88IZJeXqdPUTUu5+rFd/U1qaVQswOomyxYA+7xDHlluB89BbOtT2YlrVo5asR1h+3hp+Dwpn1wwDX+2aA7ES5dHe96Bd2oeKXpHCTYAP9s3Dk3uQrURhmdc8TcrA8JohSCoGuaFR1o8QWg3QDGenL47SxSF6fbhCS4ors5lWkkkvXvK7+XxG4hk+rYe8uavU8Z5pjUxK4RJezLAy5Bt4FX0HCTtShVHSRrdIesEV9jqzdcMAK81+q9bkT2JhYbWZYAjF9hjv1dSxzZNmsS/vdna/mhH0/1yvSKCqD8Wk/V4akHlt9DcfyanKnjyVEWc9HtBRdnFvSPRKWeYeaieADD8kX7veelhEIkG/DkzS7/CORbnetVKw34UGqlvgxecGIzZ9+tUq4fEc/MqU/EKQhMghyb0cmHT6EtZTnJSkxftgVmTNFcrqhhiFPVnhlKsK0mUPS1U5mxmfIAimRQeIEGJ/JAqOsAawUMiqhSVNp+mid2d993ODNhPI5Ldz8lORP3vvEqjH1+HF6vR8lI/ioFrnGGryBI/ETY8wgTRp+GhPG2s02x+d2FNQJmfcaV+Z4sB70S88fzFa2cuem4xaZIgknFLENUtlZCZMo8HkQXyfGh6wpBkguRI9Qg=" + writeString(buf, signature) +} + func readVarInt(reader *bytes.Reader) (int, error) { value, position := 0, 0 for { @@ -324,6 +356,25 @@ func readVarInt(reader *bytes.Reader) (int, error) { return value, nil } +func readVarLong(reader *bytes.Reader) (int64, error) { + value, position := int64(0), 0 + for { + b, err := reader.ReadByte() + if err != nil { + return 0, err + } + value |= int64(b&0x7F) << position + if (b & 0x80) == 0 { + break + } + position += 7 + if position >= 64 { + return 0, errors.New("VarLong too big") + } + } + return value, nil +} + func readString(reader *bytes.Reader) (string, error) { length, err := readVarInt(reader) if err != nil {