コード例 #1
0
        public RiftPacket Read(DateTime pTransmitted)
        {
            long packetLength;
            int  sizeOfPacketLength;

            switch (mProtocolState)
            {
            case EProtocolState.Normal:
            {
                if (ReadEncodedLong(mUnprocessedBuffer, 0, mUnprocessedLength, out packetLength, out sizeOfPacketLength) &&
                    (sizeOfPacketLength + packetLength) <= mUnprocessedLength)
                {
                    Buffer.BlockCopy(mUnprocessedBuffer, 0, mProcessedBuffer, mProcessedLength, sizeOfPacketLength + (int)packetLength);
                    mUnprocessedLength -= (sizeOfPacketLength + (int)packetLength);
                    mProcessedLength   += (sizeOfPacketLength + (int)packetLength);
                    if (mUnprocessedLength > 0)
                    {
                        Buffer.BlockCopy(mUnprocessedBuffer, sizeOfPacketLength + (int)packetLength, mUnprocessedBuffer, 0, mUnprocessedLength);
                    }
                }
                break;
            }

            case EProtocolState.Compressed:
            {
                for (int index = 0; index < mUnprocessedLength; ++index)
                {
                    if (index >= 3 &&
                        mUnprocessedBuffer[index] == 0xFF &&
                        mUnprocessedBuffer[index - 1] == 0xFF &&
                        mUnprocessedBuffer[index - 2] == 0x00 &&
                        mUnprocessedBuffer[index - 3] == 0x00)
                    {
                        mInflaterStream.SetLength(0);
                        mInflater.Write(mUnprocessedBuffer, 0, index + 1);
                        mInflater.Flush();
                        mInflaterStream.Position = 0;
                        mProcessedLength        += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength);
                        mUnprocessedLength      -= (index + 1);
                        if (mUnprocessedLength > 0)
                        {
                            Buffer.BlockCopy(mUnprocessedBuffer, index + 1, mUnprocessedBuffer, 0, mUnprocessedLength);
                        }
                        break;
                    }
                }
                break;
            }

            case EProtocolState.EncryptedAndCompressed:
            {
                for (int index = 0; index < mUnprocessedLength; ++index)
                {
                    if (mDecryptLength >= mDecryptBuffer.Length || index >= mUnprocessedBuffer.Length)
                    {
                        System.Diagnostics.Debug.Write("Bad");
                    }
                    mDecryptBuffer[mDecryptLength] = DecryptByte(mUnprocessedBuffer[index]);
                    ++mDecryptLength;
                    if (mDecryptLength >= 4 &&
                        mDecryptBuffer[mDecryptLength - 1] == 0xFF &&
                        mDecryptBuffer[mDecryptLength - 2] == 0xFF &&
                        mDecryptBuffer[mDecryptLength - 3] == 0x00 &&
                        mDecryptBuffer[mDecryptLength - 4] == 0x00)
                    {
                        mInflaterStream.SetLength(0);
                        mInflater.Write(mDecryptBuffer, 0, mDecryptLength);
                        mInflater.Flush();
                        mInflaterStream.Position = 0;
                        mProcessedLength        += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength);
                        mDecryptLength           = 0;
                    }
                }
                mUnprocessedLength = 0;
                break;
            }

            default: break;
            }

            if (!ReadEncodedLong(mProcessedBuffer, 0, mProcessedLength, out packetLength, out sizeOfPacketLength))
            {
                return(null);
            }
            if (mProcessedLength < (sizeOfPacketLength + packetLength))
            {
                return(null);
            }
            byte[] packetBuffer = new byte[packetLength];
            Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength, packetBuffer, 0, (int)packetLength);
            mProcessedLength -= (sizeOfPacketLength + (int)packetLength);
            if (mProcessedLength > 0)
            {
                Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength + (int)packetLength, mProcessedBuffer, 0, mProcessedLength);
            }
            //PacketDescriptions.PacketDescription description = PacketDescriptions.Instance.Descriptions.Find(d => d.Outbound == mOutbound && d.Opcode == opcode);
            RiftPacketReader reader = new RiftPacketReader(pTransmitted, mOutbound, packetBuffer, 0, packetBuffer.Length);
            RiftPacket       packet;
            int sizeOfPacket;

            if (!reader.ReadPacket(out packet, out sizeOfPacket))
            {
                return(null);
            }
            packet.Raw = packetBuffer;
            return(packet);
        }
コード例 #2
0
ファイル: SessionForm.cs プロジェクト: whatbeit/RiftShark
        public void OpenFile(string pFilename)
        {
            mFileSaveMenu.Enabled = false;
            mTerminated = true;
            int percent = 0;
            using (FileStream stream = new FileStream(pFilename, FileMode.Open, FileAccess.Read))
            {
                BinaryReader reader = new BinaryReader(stream);
                mLocalPort = reader.ReadUInt16();
                while (stream.Position < stream.Length)
                {
                    long timestamp = reader.ReadInt64();
                    bool outbound = reader.ReadBoolean();
                    int size = reader.ReadInt32();
                    byte[] buffer = reader.ReadBytes(size);
                    RiftPacketReader packetReader = new RiftPacketReader(new DateTime(timestamp), outbound, buffer, 0, buffer.Length);
                    RiftPacket packet;
                    int sizeOfPacket;
                    packetReader.ReadPacket(out packet, out sizeOfPacket);
                    packet.Raw = buffer;
                    AddPacket(packet);

                    int newPercent = (int)((stream.Position * 100) / stream.Length);
                    while (newPercent > percent)
                    {
                        ++percent;
                        ProgressUpdate();
                    }

                }
            }
            Text = string.Format("Port {0} (ReadOnly)", mLocalPort);
        }
コード例 #3
0
ファイル: RiftStream.cs プロジェクト: vangan123/rift-sunrise
        public RiftPacket Read(DateTime pTransmitted)
        {
            long packetLength;
            int sizeOfPacketLength;
            switch (mProtocolState)
            {
                case EProtocolState.Normal:
                    {
                        if (ReadEncodedLong(mUnprocessedBuffer, 0, mUnprocessedLength, out packetLength, out sizeOfPacketLength) &&
                            (sizeOfPacketLength + packetLength) <= mUnprocessedLength)
                        {
                            Buffer.BlockCopy(mUnprocessedBuffer, 0, mProcessedBuffer, mProcessedLength, sizeOfPacketLength + (int)packetLength);
                            mUnprocessedLength -= (sizeOfPacketLength + (int)packetLength);
                            mProcessedLength += (sizeOfPacketLength + (int)packetLength);
                            if (mUnprocessedLength > 0) Buffer.BlockCopy(mUnprocessedBuffer, sizeOfPacketLength + (int)packetLength, mUnprocessedBuffer, 0, mUnprocessedLength);
                        }
                        break;
                    }
                case EProtocolState.Compressed:
                    {
                        for (int index = 0; index < mUnprocessedLength; ++index)
                        {
                            if (index >= 3 &&
                                mUnprocessedBuffer[index] == 0xFF &&
                                mUnprocessedBuffer[index - 1] == 0xFF &&
                                mUnprocessedBuffer[index - 2] == 0x00 &&
                                mUnprocessedBuffer[index - 3] == 0x00)
                            {
                                mInflaterStream.SetLength(0);
                                mInflater.Write(mUnprocessedBuffer, 0, index + 1);
                                mInflater.Flush();
                                mInflaterStream.Position = 0;
                                mProcessedLength += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength);
                                mUnprocessedLength -= (index + 1);
                                if (mUnprocessedLength > 0) Buffer.BlockCopy(mUnprocessedBuffer, index + 1, mUnprocessedBuffer, 0, mUnprocessedLength);
                                break;
                            }
                        }
                        break;
                    }
                case EProtocolState.EncryptedAndCompressed:
                    {
                        for (int index = 0; index < mUnprocessedLength; ++index)
                        {
                            if (mDecryptLength >= mDecryptBuffer.Length || index >= mUnprocessedBuffer.Length)
                            {
                                System.Diagnostics.Debug.Write("Bad");
                            }
                            mDecryptBuffer[mDecryptLength] = DecryptByte(mUnprocessedBuffer[index]);
                            ++mDecryptLength;
                            if (mDecryptLength >= 4 &&
                                mDecryptBuffer[mDecryptLength - 1] == 0xFF &&
                                mDecryptBuffer[mDecryptLength - 2] == 0xFF &&
                                mDecryptBuffer[mDecryptLength - 3] == 0x00 &&
                                mDecryptBuffer[mDecryptLength - 4] == 0x00)
                            {
                                mInflaterStream.SetLength(0);
                                mInflater.Write(mDecryptBuffer, 0, mDecryptLength);
                                mInflater.Flush();
                                mInflaterStream.Position = 0;
                                mProcessedLength += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength);
                                mDecryptLength = 0;
                            }
                        }
                        mUnprocessedLength = 0;
                        break;
                    }
                default: break;
            }

            if (!ReadEncodedLong(mProcessedBuffer, 0, mProcessedLength, out packetLength, out sizeOfPacketLength)) return null;
            if (mProcessedLength < (sizeOfPacketLength + packetLength)) return null;
            byte[] packetBuffer = new byte[packetLength];
            Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength, packetBuffer, 0, (int)packetLength);
            mProcessedLength -= (sizeOfPacketLength + (int)packetLength);
            if (mProcessedLength > 0) Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength + (int)packetLength, mProcessedBuffer, 0, mProcessedLength);
            //PacketDescriptions.PacketDescription description = PacketDescriptions.Instance.Descriptions.Find(d => d.Outbound == mOutbound && d.Opcode == opcode);
            RiftPacketReader reader = new RiftPacketReader(pTransmitted, mOutbound, packetBuffer, 0, packetBuffer.Length);
            RiftPacket packet;
            int sizeOfPacket;
            if (!reader.ReadPacket(out packet, out sizeOfPacket)) return null;
            packet.Raw = packetBuffer;
            return packet;
        }