Example #1
0
        public Message(byte[] Data) : base(Data)
        {
            PacketBody = new Body();

            this.PacketBody.SequenceNumber        = this.Reader.ReadByte();
            this.PacketBody.FragmentCount         = this.Reader.ReadByte();
            this.PacketBody.FragmentNumber        = this.Reader.ReadByte();
            this.PacketBody.Unknown1              = this.Reader.ReadUInt32();
            this.PacketBody.Unknown2              = this.Reader.ReadByte();
            this.PacketBody.Unknown3              = this.Reader.ReadUInt32();
            this.PacketBody.CompressedMessageSize = (ushort)((this.Reader.ReadUInt16() & 0x7FFF) - 2);
            this.PacketBody.Unknown8              = this.Reader.ReadUInt16();
            this.PacketBody.MessageData           = new byte[4096]; //no decompressed size is being sent with the packet here?

            byte[] compressedMessageData = new byte[this.PacketBody.CompressedMessageSize + 0x10];
            this.Reader.Read(compressedMessageData, 0, this.PacketBody.CompressedMessageSize);
            LightweightCompression lWCompression = new LightweightCompression();

            lWCompression.Start(compressedMessageData, this.PacketBody.CompressedMessageSize, false);
            this.PacketBody.UncompressedMessageSize = lWCompression.Read(this.PacketBody.MessageData, 4096);

            this.PacketBody.Unknown5 = this.Reader.ReadUInt32();

            var dwLoop = 0;

            do
            {
                this.PacketBody.Unknown6 |= (byte)(this.Reader.ReadByte() << dwLoop);
                dwLoop += 8;
            } while (dwLoop < 32);

            if (this.PacketBody.Unknown5 != 1)
            {
                this.PacketBody.SnapshotSequence            = this.Reader.ReadUInt32();
                this.PacketBody.BaseSequence                = this.Reader.ReadUInt32();
                this.PacketBody.CompressedBodyMessageSize   = this.Reader.ReadUInt32() & 0x7FFFFFFF;
                this.PacketBody.UncompressedBodyMessageSize = this.Reader.ReadUInt32();
                this.PacketBody.ComponentCount              = this.Reader.ReadUInt16();
                this.PacketBody.Unknown7            = this.Reader.ReadUInt32();
                this.PacketBody.FragmentMessageData = new byte[this.Reader.BaseStream.Length - this.Reader.BaseStream.Position];
                this.Reader.Read(this.PacketBody.FragmentMessageData, 0, this.PacketBody.FragmentMessageData.Length);
            }
        }
Example #2
0
        private Sequence ProcessSequence()
        {
            Sequence seq = new Sequence();

            byte[] data = new byte[this._currentSequenceBufferOffset];
            Array.Copy(_sequenceBuffer, 0, data, 0, data.Length);
            BinaryReader reader = new BinaryReader(new MemoryStream(data));

            try
            {
                seq.Unknown1 = reader.ReadUInt32();
                seq.Unknown2 = reader.ReadByte();

                if ((seq.Unknown2 & 1) != 0)
                {
                    seq.Unknown3 = reader.ReadUInt32();
                    seq.CompressedMessageSize   = (ushort)((reader.ReadUInt16() & 0x7FFF) - 2);
                    seq.UncompressedMessageSize = reader.ReadUInt16();

                    seq.MessageData = new byte[seq.UncompressedMessageSize];
                    byte[] compressedMessageData = new byte[seq.CompressedMessageSize + 0x10];
                    reader.Read(compressedMessageData, 0, seq.CompressedMessageSize);
                    LightweightCompression lWCompression = new LightweightCompression();
                    lWCompression.Start(compressedMessageData, seq.CompressedMessageSize, false);
                    lWCompression.Read(seq.MessageData, seq.UncompressedMessageSize);
                }

                if ((seq.Unknown2 & 2) != 0)
                {
                    seq.Compressed2MessageSize   = (ushort)((reader.ReadUInt16() & 0x7FFF) - 2);
                    seq.Uncompressed2MessageSize = reader.ReadUInt16();

                    seq.Message2Data = new byte[seq.Uncompressed2MessageSize];
                    byte[] compressedMessageData = new byte[seq.Compressed2MessageSize + 0x10];
                    reader.Read(compressedMessageData, 0, seq.Compressed2MessageSize);
                    LightweightCompression lWCompression = new LightweightCompression();
                    lWCompression.Start(compressedMessageData, seq.Compressed2MessageSize, false);
                    lWCompression.Read(seq.Message2Data, seq.Uncompressed2MessageSize);
                }

                seq = ReadSnapshotAcks(reader, seq);

                //client packets dont seem to always contain a snapshot
                if (reader.BaseStream.Position == reader.BaseStream.Length)
                {
                    reader.Close();
                    return(seq);
                }

                seq.SnapshotSequence            = reader.ReadUInt32();
                seq.BaseSequence                = reader.ReadUInt32();
                seq.CompressedBodyMessageSize   = reader.ReadUInt32() & 0x7FFFFFFF;
                seq.UncompressedBodyMessageSize = reader.ReadUInt32();
                seq.ComponentCount              = reader.ReadUInt16();
                seq.Unknown7 = reader.ReadUInt32();

                byte[] compressedSnapshotData = new byte[seq.CompressedBodyMessageSize + 0x10];
                reader.Read(compressedSnapshotData, 0, (int)seq.CompressedBodyMessageSize);
                seq.SnapshotMessageData = new byte[seq.UncompressedBodyMessageSize];

                LightweightCompression lWSnapCompression = new LightweightCompression();
                lWSnapCompression.Start(compressedSnapshotData, (int)seq.CompressedBodyMessageSize, false);
                lWSnapCompression.Read(seq.SnapshotMessageData, (int)seq.UncompressedBodyMessageSize);

                Log.Debug("Unknown1: {@Unknown1}", seq.Unknown1.ToString("X"));
                Log.Debug("Unknown2: {@Unknown2}", seq.Unknown2);
                Log.Debug("Unknown3: {@Unknown3}", seq.Unknown3);

                Log.Debug("CompressedMessageSize: {@CompressedMessageSize}", seq.CompressedMessageSize);
                Log.Debug("UncompressedMessageSize: {@UncompressedMessageSize}", seq.UncompressedMessageSize);
                Log.Debug("MessageData: {@MessageData}", seq.MessageData);

                Log.Debug("Compressed2MessageSize: {@Compressed2MessageSize}", seq.Compressed2MessageSize);
                Log.Debug("Uncompressed2MessageSize: {@Uncompressed2MessageSize}", seq.Uncompressed2MessageSize);
                Log.Debug("Message2Data: {@Message2Data}", seq.Message2Data);

                Log.Debug("Unknown5: {@Unknown5}", seq.Unknown5);
                Log.Debug("Unknown6: {@Unknown6}", seq.Unknown6);

                Log.Debug("SnapshotSequence: {@SnapshotSequence}", seq.SnapshotSequence);
                Log.Debug("BaseSequence: {@BaseSequence}", seq.BaseSequence);
                Log.Debug("CompressedBodyMessageSize: {@CompressedBodyMessageSize}", seq.CompressedBodyMessageSize);
                Log.Debug("UncompressedBodyMessageSize: {@UncompressedBodyMessageSize}", seq.UncompressedBodyMessageSize);
                Log.Debug("ComponentCount: {@ComponentCount}", seq.ComponentCount);
                Log.Debug("Unknown7: {@Unknown7}", seq.Unknown7);

                if (reader.BaseStream.Position != reader.BaseStream.Length)
                {
                    throw (new Exception("Didn't read sequence to end"));
                }

                reader.Close();

                return(seq);
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                Log.Error("Unknown1: {@Unknown1}", seq.Unknown1.ToString("X"));
                Log.Error("Unknown2: {@Unknown2}", seq.Unknown2);
                Log.Error("Unknown3: {@Unknown3}", seq.Unknown3);

                Log.Error("CompressedMessageSize: {@CompressedMessageSize}", seq.CompressedMessageSize);
                Log.Error("UncompressedMessageSize: {@UncompressedMessageSize}", seq.UncompressedMessageSize);
                Log.Error("MessageData: {@MessageData}", seq.MessageData);

                Log.Error("Compressed2MessageSize: {@Compressed2MessageSize}", seq.Compressed2MessageSize);
                Log.Error("Uncompressed2MessageSize: {@Uncompressed2MessageSize}", seq.Uncompressed2MessageSize);
                Log.Error("Message2Data: {@Message2Data}", seq.Message2Data);

                Log.Error("Unknown5: {@Unknown5}", seq.Unknown5);
                Log.Error("Unknown6: {@Unknown6}", seq.Unknown6);

                Log.Error("SnapshotSequence: {@SnapshotSequence}", seq.SnapshotSequence);
                Log.Error("BaseSequence: {@BaseSequence}", seq.BaseSequence);
                Log.Error("CompressedBodyMessageSize: {@CompressedBodyMessageSize}", seq.CompressedBodyMessageSize);
                Log.Error("UncompressedBodyMessageSize: {@UncompressedBodyMessageSize}", seq.UncompressedBodyMessageSize);
                Log.Error("ComponentCount: {@ComponentCount}", seq.ComponentCount);
                Log.Error("Unknown7: {@Unknown7}", seq.Unknown7);
                Console.ReadLine();

                return(new Sequence());
            }
        }