Finally finished fucking writeProperties
This commit is contained in:
parent
4b25fafbe5
commit
ec4f67ced7
89
main.go
89
main.go
@ -3,11 +3,13 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -30,11 +32,6 @@ type HandshakePacket struct {
|
|||||||
NextState int
|
NextState int
|
||||||
}
|
}
|
||||||
|
|
||||||
type EncryptionPacket struct {
|
|
||||||
SharedSecret PrefixedByteArray
|
|
||||||
VerifyToken PrefixedByteArray
|
|
||||||
}
|
|
||||||
|
|
||||||
type LoginStartPacket struct {
|
type LoginStartPacket struct {
|
||||||
Name string
|
Name string
|
||||||
UUID string
|
UUID string
|
||||||
@ -62,6 +59,12 @@ type Player struct {
|
|||||||
ID string `json:"id"`
|
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 {
|
type Chat struct {
|
||||||
Text string `json:"text"`
|
Text string `json:"text"`
|
||||||
}
|
}
|
||||||
@ -152,27 +155,28 @@ func handleConnection(client *ClientState) {
|
|||||||
}
|
}
|
||||||
fmt.Println("Login Start:", loginStart)
|
fmt.Println("Login Start:", loginStart)
|
||||||
|
|
||||||
// Send Encryption Request back
|
// Send Login Success
|
||||||
var packetData bytes.Buffer
|
var packetData bytes.Buffer
|
||||||
writeVarInt(&packetData, 1) // Packet length: 1 byte for ID
|
packetData.WriteByte(0x02) // Login Success ID
|
||||||
packetData.WriteByte(0x01) // Encryption Request ID
|
|
||||||
|
|
||||||
// Server ID
|
// UUID
|
||||||
writeString(&packetData, "JustAnotherServer")
|
writeUUID(&packetData, loginStart.UUID)
|
||||||
|
|
||||||
// Public Key
|
// Username
|
||||||
writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}})
|
writeString(&packetData, loginStart.Name)
|
||||||
|
|
||||||
// Verify Token
|
writeProperties(&packetData)
|
||||||
writePrefixedByteArray(&packetData, PrefixedByteArray{Length: 0, Data: []byte{}})
|
|
||||||
|
|
||||||
// Should authenticate (actually a boolean)
|
var responsePacket bytes.Buffer
|
||||||
packetData.WriteByte(1)
|
writeVarInt(&responsePacket, packetData.Len())
|
||||||
|
responsePacket.Write(packetData.Bytes())
|
||||||
|
|
||||||
if _, err := client.conn.Write(packetData.Bytes()); err != nil {
|
fmt.Println("Login Success Packet:", responsePacket.Bytes())
|
||||||
fmt.Println("Error sending encryption request:", err)
|
|
||||||
|
if _, err := client.conn.Write(responsePacket.Bytes()); err != nil {
|
||||||
|
fmt.Println("Error sending login success:", err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("Encryption request sent successfully")
|
fmt.Println("Login success sent successfully")
|
||||||
}
|
}
|
||||||
} else if client.nextState == 3 {
|
} else if client.nextState == 3 {
|
||||||
// Transfer
|
// Transfer
|
||||||
@ -305,6 +309,34 @@ func writePrefixedByteArray(buf *bytes.Buffer, value PrefixedByteArray) {
|
|||||||
buf.Write(value.Data)
|
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) {
|
func readVarInt(reader *bytes.Reader) (int, error) {
|
||||||
value, position := 0, 0
|
value, position := 0, 0
|
||||||
for {
|
for {
|
||||||
@ -324,6 +356,25 @@ func readVarInt(reader *bytes.Reader) (int, error) {
|
|||||||
return value, nil
|
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) {
|
func readString(reader *bytes.Reader) (string, error) {
|
||||||
length, err := readVarInt(reader)
|
length, err := readVarInt(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user