From 892fb8f547ce4a31901fb029a762331b1188efb7 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Fri, 11 Nov 2022 23:19:01 +0300 Subject: net/svc messages finally getting parsed correctly --- go.mod | 2 +- go.sum | 10 ++---- packets/classes/datatable.go | 2 -- packets/messages/message.go | 12 +------ packets/messages/types/SvcCreateStringTable.go | 9 +++--- packets/messages/types/SvcGameEvent.go | 15 +++++++++ packets/messages/types/SvcGameEventList.go | 3 +- packets/messages/types/SvcPacketEntities.go | 5 +-- packets/messages/types/SvcSounds.go | 4 +-- packets/messages/types/SvcTempEntities.go | 4 +-- packets/messages/types/SvcUpdateStringTable.go | 3 +- packets/messages/types/SvcUserMessage.go | 3 +- packets/packet.go | 43 +++++++++++++------------- packets/types.go | 7 ----- 14 files changed, 54 insertions(+), 68 deletions(-) create mode 100644 packets/messages/types/SvcGameEvent.go diff --git a/go.mod b/go.mod index 07c96f9..d1b68cc 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/pektezol/demoparser go 1.19 -require github.com/pektezol/bitreader v1.2.5 +require github.com/pektezol/bitreader v1.2.9 diff --git a/go.sum b/go.sum index 92aeae2..4cccb6e 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,2 @@ -github.com/pektezol/bitreader v1.2.2 h1:NtRAoG48Wbnu/A300lGsQuo0ajLHKJXat884esWMrLo= -github.com/pektezol/bitreader v1.2.2/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= -github.com/pektezol/bitreader v1.2.3 h1:NeE3H+5AMeDXNN19DyaE/U3nmNgSeq3W5MfZn+/SZZQ= -github.com/pektezol/bitreader v1.2.3/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= -github.com/pektezol/bitreader v1.2.4 h1:davStm+5TMY4rpXwNpXA1JYN3sZ39+XV3tke2y74TxQ= -github.com/pektezol/bitreader v1.2.4/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= -github.com/pektezol/bitreader v1.2.5 h1:mQA94kFvw4ViSg3drGxWhtIh09Zvr7dwmJXI8KoLEkk= -github.com/pektezol/bitreader v1.2.5/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= +github.com/pektezol/bitreader v1.2.9 h1:DnCe5vDt6vC9zRVaeX47XjlcgK1i0jDPhYd8cimyPvo= +github.com/pektezol/bitreader v1.2.9/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= diff --git a/packets/classes/datatable.go b/packets/classes/datatable.go index 07cbd00..405dae6 100644 --- a/packets/classes/datatable.go +++ b/packets/classes/datatable.go @@ -30,8 +30,6 @@ type ServerClassInfo struct { func ParseDataTable(data []byte) DataTable { reader := bitreader.Reader(bytes.NewReader(data), true) sendtable := parseSendTable(reader) - fmt.Println("AAA") - fmt.Println(reader.TryReadBits(8)) serverclassinfo := parseServerClassInfo(reader) return DataTable{ SendTable: sendtable, diff --git a/packets/messages/message.go b/packets/messages/message.go index 376a3d5..4a00212 100644 --- a/packets/messages/message.go +++ b/packets/messages/message.go @@ -7,15 +7,6 @@ import ( "github.com/pektezol/demoparser/packets/messages/types" ) -// TODO: Read data properly in: -// SvcCreateStringTable -// SvcGameEventList -// SvcPacketEntities -// SvcSounds -// SvcTempEntities -// SvcUpdateStringTable -// SvcUserMessage - func ParseMessage(data []byte) []Message { reader := bitreader.Reader(bytes.NewReader(data), true) var messages []Message @@ -24,7 +15,6 @@ func ParseMessage(data []byte) []Message { if err != nil { break } - // fmt.Printf("Reading message type: %d\n", messageType) switch messageType { case 0: messages = append(messages, Message{Data: types.NetNop{}}) @@ -77,7 +67,7 @@ func ParseMessage(data []byte) []Message { case 24: messages = append(messages, Message{Data: types.ParseSvcEntityMessage(reader)}) case 25: - // TODO: SvcGameEvent + messages = append(messages, Message{Data: types.ParseSvcGameEvent(reader)}) case 26: messages = append(messages, Message{Data: types.ParseSvcPacketEntities(reader)}) case 27: diff --git a/packets/messages/types/SvcCreateStringTable.go b/packets/messages/types/SvcCreateStringTable.go index 336b3e0..72ab1a7 100644 --- a/packets/messages/types/SvcCreateStringTable.go +++ b/packets/messages/types/SvcCreateStringTable.go @@ -1,6 +1,8 @@ package types -import "github.com/pektezol/bitreader" +import ( + "github.com/pektezol/bitreader" +) type SvcCreateStringTable struct { Name string @@ -10,7 +12,7 @@ type SvcCreateStringTable struct { UserDataSize uint16 UserDataSizeBits uint8 Flags uint8 - StringData int + StringData []byte } func ParseSvcCreateStringTable(reader *bitreader.ReaderType) SvcCreateStringTable { @@ -26,8 +28,7 @@ func ParseSvcCreateStringTable(reader *bitreader.ReaderType) SvcCreateStringTabl svccreatestringtable.UserDataSizeBits = uint8(reader.TryReadBits(4)) } svccreatestringtable.Flags = uint8(reader.TryReadBits(2)) - reader.SkipBits(int(length)) // TODO: Read data properly - // svccreatestringtable.StringData = int(reader.TryReadBits(int(length / 8))) + svccreatestringtable.StringData = reader.TryReadBitsToSlice(int(length)) return svccreatestringtable } diff --git a/packets/messages/types/SvcGameEvent.go b/packets/messages/types/SvcGameEvent.go new file mode 100644 index 0000000..1d6b0ea --- /dev/null +++ b/packets/messages/types/SvcGameEvent.go @@ -0,0 +1,15 @@ +package types + +import ( + "github.com/pektezol/bitreader" +) + +type SvcGameEvent struct { + Data []byte +} + +func ParseSvcGameEvent(reader *bitreader.ReaderType) SvcGameEvent { + length := reader.TryReadBits(11) + reader.SkipBits(int(length)) + return SvcGameEvent{} // TODO: Parse SvcGameEvent +} diff --git a/packets/messages/types/SvcGameEventList.go b/packets/messages/types/SvcGameEventList.go index 3952517..fea0be4 100644 --- a/packets/messages/types/SvcGameEventList.go +++ b/packets/messages/types/SvcGameEventList.go @@ -10,9 +10,8 @@ type SvcGameEventList struct { func ParseSvcGameEventList(reader *bitreader.ReaderType) SvcGameEventList { events := reader.TryReadBits(9) length := reader.TryReadBits(20) - reader.SkipBits(int(length)) // TODO: Read data properly return SvcGameEventList{ Events: int16(events), - //Data: reader.TryReadBytesToSlice(int(length)), + Data: reader.TryReadBitsToSlice(int(length)), } } diff --git a/packets/messages/types/SvcPacketEntities.go b/packets/messages/types/SvcPacketEntities.go index 6621c3a..9d8a8b0 100644 --- a/packets/messages/types/SvcPacketEntities.go +++ b/packets/messages/types/SvcPacketEntities.go @@ -20,12 +20,13 @@ func ParseSvcPacketEntities(reader *bitreader.ReaderType) SvcPacketEntities { var deltafrom int32 if isdelta { deltafrom = int32(reader.TryReadInt32()) + } else { + deltafrom = -1 } baseline := reader.TryReadBool() updatedentries := reader.TryReadBits(11) length := reader.TryReadBits(20) updatebaseline := reader.TryReadBool() - reader.SkipBits(int(length)) // TODO: Read data properly return SvcPacketEntities{ MaxEntries: uint16(maxentries), IsDelta: isdelta, @@ -33,6 +34,6 @@ func ParseSvcPacketEntities(reader *bitreader.ReaderType) SvcPacketEntities { BaseLine: baseline, UpdatedEntries: uint16(updatedentries), UpdateBaseline: updatebaseline, - // Data: reader.TryReadBytesToSlice(int(length / 8)), + Data: reader.TryReadBitsToSlice(int(length)), } } diff --git a/packets/messages/types/SvcSounds.go b/packets/messages/types/SvcSounds.go index 4d858bf..2dc7974 100644 --- a/packets/messages/types/SvcSounds.go +++ b/packets/messages/types/SvcSounds.go @@ -22,11 +22,9 @@ func ParseSvcSounds(reader *bitreader.ReaderType) SvcSounds { } else { length = int16(reader.TryReadInt16()) } - reader.SkipBits(int(length)) // TODO: Read data properly - //data := reader.TryReadBytesToSlice(int(length / 8)) return SvcSounds{ ReliableSound: reliablesound, Size: size, - //Data: data, + Data: reader.TryReadBitsToSlice(int(length)), } } diff --git a/packets/messages/types/SvcTempEntities.go b/packets/messages/types/SvcTempEntities.go index 105e014..3bfae0c 100644 --- a/packets/messages/types/SvcTempEntities.go +++ b/packets/messages/types/SvcTempEntities.go @@ -12,9 +12,9 @@ type SvcTempEntities struct { func ParseSvcTempEntities(reader *bitreader.ReaderType) SvcTempEntities { numentries := reader.TryReadInt8() length := reader.TryReadBits(17) - reader.SkipBits(int(length)) // TODO: Read data properly + //reader.SkipBits(int(length)) // TODO: Read data properly return SvcTempEntities{ NumEntries: numentries, - //Data: reader.TryReadBytesToSlice(int(length/8) + int(length%8)), + Data: reader.TryReadBitsToSlice(int(length)), } } diff --git a/packets/messages/types/SvcUpdateStringTable.go b/packets/messages/types/SvcUpdateStringTable.go index d1ca9bb..9f178a5 100644 --- a/packets/messages/types/SvcUpdateStringTable.go +++ b/packets/messages/types/SvcUpdateStringTable.go @@ -16,7 +16,6 @@ func ParseSvcUpdateStringTable(reader *bitreader.ReaderType) SvcUpdateStringTabl svcupdatestringtable.NumChangedEntries = int16(reader.TryReadInt16()) } length := reader.TryReadBits(20) - reader.SkipBits(int(length)) // TODO: Read data properly - //svcupdatestringtable.Data = reader.TryReadBytesToSlice(int(length / 8)) + svcupdatestringtable.Data = reader.TryReadBitsToSlice(int(length)) return svcupdatestringtable } diff --git a/packets/messages/types/SvcUserMessage.go b/packets/messages/types/SvcUserMessage.go index 6d09fa1..c7b0566 100644 --- a/packets/messages/types/SvcUserMessage.go +++ b/packets/messages/types/SvcUserMessage.go @@ -12,9 +12,8 @@ type SvcUserMessage struct { func ParseSvcUserMessage(reader *bitreader.ReaderType) SvcUserMessage { msgtype := reader.TryReadInt8() length := reader.TryReadBits(12) - reader.SkipBits(int(length)) // TODO: Read data properly return SvcUserMessage{ MsgType: msgtype, - //Data: reader.TryReadBytesToSlice(int(length / 8)), + Data: reader.TryReadBitsToSlice(int(length)), } } diff --git a/packets/packet.go b/packets/packet.go index cc94e62..8f4a262 100644 --- a/packets/packet.go +++ b/packets/packet.go @@ -14,25 +14,26 @@ func ParsePacket(reader *bitreader.ReaderType) (status int) { messageType := reader.TryReadInt8() messageTick := reader.TryReadInt32() messageSlot := reader.TryReadInt8() + _ = messageSlot switch messageType { - case 1: // TODO: SignOn - Data + case 1: signOn := SignOn{ PacketInfo: classes.ParseCmdInfo(reader, MSSC), InSequence: int32(reader.TryReadInt32()), OutSequence: int32(reader.TryReadInt32()), - Size: int32(reader.TryReadInt32()), } - signOn.Data = messages.ParseMessage(reader.TryReadBytesToSlice(int(signOn.Size))) - fmt.Printf("[%d] (%d) {%d} SignOn: %v\n", messageTick, messageType, messageSlot, signOn) + size := int(reader.TryReadInt32()) + signOn.Data = messages.ParseMessage(reader.TryReadBytesToSlice(size)) + // fmt.Printf("[%d] (%d) {%d} SignOn: %v\n", messageTick, messageType, messageSlot, signOn) return 1 - case 2: // TODO: Packet - Data + case 2: packet := Packet{ PacketInfo: classes.ParseCmdInfo(reader, MSSC), InSequence: int32(reader.TryReadInt32()), OutSequence: int32(reader.TryReadInt32()), - Size: int32(reader.TryReadInt32()), } - packet.Data = messages.ParseMessage(reader.TryReadBytesToSlice(int(packet.Size))) + size := int(reader.TryReadInt32()) + packet.Data = messages.ParseMessage(reader.TryReadBytesToSlice(size)) // fmt.Printf("[%d] (%d) Packet: %v\n", messageTick, messageType, packet) return 2 case 3: @@ -40,26 +41,25 @@ func ParsePacket(reader *bitreader.ReaderType) (status int) { fmt.Printf("[%d] (%d) SyncTick: %v\n", messageTick, messageType, syncTick) return 3 case 4: - consoleCmd := ConsoleCmd{ - Size: int32(reader.TryReadInt32()), - } - consoleCmd.Data = reader.TryReadStringLen(int(consoleCmd.Size)) + size := int(reader.TryReadInt32()) + var consoleCmd ConsoleCmd + consoleCmd.Data = reader.TryReadStringLen(size) // fmt.Printf("[%d] (%d) ConsoleCmd: %s\n", messageTick, messageType, consoleCmd.Data) return 4 case 5: // TODO: UserCmd - Buttons userCmd := UserCmd{ - Cmd: int32(reader.TryReadInt32()), - Size: int32(reader.TryReadInt32()), + Cmd: int32(reader.TryReadInt32()), } - userCmd.Data = classes.ParseUserCmdInfo(reader.TryReadBytesToSlice(int(userCmd.Size))) + size := int(reader.TryReadInt32()) + userCmd.Data = classes.ParseUserCmdInfo(reader.TryReadBytesToSlice(size)) // fmt.Printf("[%d] (%d) UserCmd: %v\n", messageTick, messageType, userCmd) return 5 case 6: // TODO: DataTables // datatables := DataTables{ // Size: int32(reader.TryReadInt32()), // } - val := reader.TryReadInt32() - reader.SkipBytes(int(val)) + size := int(reader.TryReadInt32()) + reader.SkipBytes(size) // datatables.Data = classes.ParseDataTable(reader.TryReadBytesToSlice(int(datatables.Size))) // fmt.Printf("[%d] (%d) DataTables: %v\n", messageTick, messageType, datatables) return 6 @@ -71,15 +71,14 @@ func ParsePacket(reader *bitreader.ReaderType) (status int) { return 7 case 8: // TODO: CustomData reader.SkipBytes(4) - val := reader.TryReadInt32() - reader.SkipBytes(int(val)) + size := int(reader.TryReadInt32()) + reader.SkipBytes(size) // fmt.Printf("[%d] (%d) CustomData: \n", messageTick, messageType) return 8 case 9: // TODO: StringTables - Data - stringTables := StringTables{ - Size: int32(reader.TryReadInt32()), - } - stringTables.Data = classes.ParseStringTable(reader.TryReadBytesToSlice(int(stringTables.Size))) + var stringTables StringTables + size := int(reader.TryReadInt32()) + stringTables.Data = classes.ParseStringTable(reader.TryReadBytesToSlice(size)) // fmt.Printf("[%d] (%d) StringTables: %v\n", messageTick, messageType, stringTables) return 9 default: diff --git a/packets/types.go b/packets/types.go index 79cc5c2..41d633a 100644 --- a/packets/types.go +++ b/packets/types.go @@ -23,7 +23,6 @@ type SignOn struct { PacketInfo []classes.CmdInfo InSequence int32 OutSequence int32 - Size int32 Data []messages.Message } @@ -31,25 +30,21 @@ type Packet struct { PacketInfo []classes.CmdInfo InSequence int32 OutSequence int32 - Size int32 Data []messages.Message } type SyncTick struct{} type ConsoleCmd struct { - Size int32 Data string } type UserCmd struct { Cmd int32 - Size int32 Data classes.UserCmdInfo } type DataTables struct { - Size int32 Data classes.DataTable } @@ -59,11 +54,9 @@ type Stop struct { type CustomData struct { Unknown int32 - Size int32 Data []byte } type StringTables struct { - Size int32 Data []classes.StringTable } -- cgit v1.2.3