コード例 #1
0
ファイル: Pkt31NetworkLog.cs プロジェクト: CarlosX/Kamilla
        protected unsafe override void InternalWritePacket2(WowPacket packet)
        {
            var data = packet.Data;
            byte[] bytes;

            if (this.SnifferId == PktSnifferId.Kamilla)
            {
                bytes = new byte[OutChunkHeaderKamilla.Size];
                fixed (byte* bytesPtr = bytes)
                {
                    var header = (OutChunkHeaderKamilla*)bytesPtr;
                    header->m_header.ConnectionId = packet.ConnectionId;
                    header->m_header.DataLength = data.Length + 4;
                    header->m_header.Direction = packet.Direction;
                    header->m_header.OptionalDataLength = 1;
                    header->m_header.TickCount = packet.ArrivalTicks;
                    header->m_flags = (byte)packet.Flags;
                    header->m_opcode = packet.Opcode;
                }
            }
            else
            {
                bytes = new byte[OutChunkHeader.Size];
                fixed (byte* bytesPtr = bytes)
                {
                    var header = (OutChunkHeader*)bytesPtr;
                    header->m_header.ConnectionId = packet.ConnectionId;
                    header->m_header.DataLength = data.Length + 4;
                    header->m_header.Direction = packet.Direction;
                    header->m_header.OptionalDataLength = 0;
                    header->m_header.TickCount = packet.ArrivalTicks;
                    header->m_opcode = packet.Opcode;
                }
            }

            m_stream.WriteBytes(bytes);
            m_stream.WriteBytes(data);
        }
コード例 #2
0
ファイル: Pkt31NetworkLog.cs プロジェクト: CarlosX/Kamilla
        protected unsafe override void InternalRead(Action<int> reportProgressDelegate)
        {
            int headerSize = ChunkHeader.Size;
            var headerBytes = new byte[headerSize];
            var startTicks = this.StartTicks;

            fixed (byte* ptr = headerBytes)
            {
                int progress = 0;
                var header = (ChunkHeader*)ptr;

                while (!m_stream.IsRead)
                {
                    if (m_stream.Read(headerBytes, 0, headerSize) != headerSize)
                        throw new EndOfStreamException();

                    var flags = PacketFlags.None;

                    if (m_snifferId == PktSnifferId.Kamilla && header->OptionalDataLength > 0)
                    {
                        flags = (PacketFlags)m_stream.ReadByte();
                        m_stream.Skip(header->OptionalDataLength - 1);
                    }
                    else
                        m_stream.Skip(header->OptionalDataLength);

                    var opcode = m_stream.ReadUInt32();
                    var data = m_stream.ReadBytes(header->DataLength - 4);

                    var wowFlags = (WowPacketFlags)(flags & ~PacketFlags.All);
                    if ((wowFlags & WowPacketFlags.HelloPacket) != 0)
                        opcode = SpecialWowOpcodes.HelloOpcode;

                    flags &= PacketFlags.All;

                    var packet = new WowPacket(data, header->Direction,
                        flags, wowFlags, this.StartTime.AddMilliseconds(header->TickCount - startTicks),
                        header->TickCount, opcode, header->ConnectionId);
                    this.InternalAddPacket(packet);
                    this.OnPacketAdded(packet);

                    if (reportProgressDelegate != null)
                    {
                        int newProgress = (int)(
                            (m_stream.Position - m_streamOriginalPosition) * 100
                            / (m_stream.Length - m_streamOriginalPosition));
                        if (newProgress != progress)
                        {
                            progress = newProgress;
                            reportProgressDelegate(progress);
                        }
                    }
                }
            }
        }
コード例 #3
0
ファイル: TrinityNetworkLog.cs プロジェクト: lan143/Kamilla
        protected override void InternalRead(Action<int> reportProgressDelegate)
        {
            var ConnectionIds = new Dictionary<int, byte>();
            var direction = TransferDirection.ToClient;
            uint opcode = SpecialWowOpcodes.UnknownOpcode;
            var time = DateTime.MinValue;
            uint ticks = 0;
            byte conn_id = 0;
            byte[] data = null;
            var flags = PacketFlags.None;
            var flags2 = WowPacketFlags.None;
            int progress = 0;

            BinaryReader br = new BinaryReader(m_streamReader.BaseStream);

            try
            {
                while (br.BaseStream.Position < br.BaseStream.Length)
                {
                    opcode = (uint)br.ReadInt32();
                    int data_size = br.ReadInt32();
                    time = br.ReadUInt32().AsUnixTime();
                    direction = (TransferDirection)br.ReadByte();
                    data = br.ReadBytes(data_size);

                    var pkt = new WowPacket(data, direction, flags, flags2, time, ticks, opcode, conn_id);
                    this.InternalAddPacket(pkt);
                    this.OnPacketAdded(pkt);

                    if (reportProgressDelegate != null)
                    {
                        int newProgress = (int)(br.BaseStream.Position * 100 / br.BaseStream.Length);
                        if (newProgress != progress)
                        {
                            progress = newProgress;
                            reportProgressDelegate(progress);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new FormatException("Error reading data on position " + br.BaseStream.Position + " (" + br.BaseStream.Length + ").", ex);
            }
            finally
            {
                this.CloseStream();
            }
        }
コード例 #4
0
ファイル: TrinityNetworkLog.cs プロジェクト: lan143/Kamilla
 protected override void InternalWritePacket2(WowPacket packet)
 {
     throw new NotSupportedException();
 }
コード例 #5
0
ファイル: MangosNetworkLog.cs プロジェクト: SkyFire/Kamilla
        protected override void InternalRead(Action<int> reportProgressDelegate)
        {
            var ConnectionIds = new Dictionary<int, byte>();

            int nLine = 0;
            string line;
            var direction = TransferDirection.ToClient;
            uint opcode = SpecialWowOpcodes.UnknownOpcode;
            var time = DateTime.MinValue;
            uint ticks = 0;
            byte conn_id = 0;
            byte[] data = null;
            bool waitingDate = true;
            bool readingData = false;
            string dataString = null;
            var flags = PacketFlags.None;
            var flags2 = WowPacketFlags.None;
            int progress = 0;
            try
            {
                while ((line = m_streamReader.ReadLine()) != null)
                {
                    ++nLine;

                    if (nLine == 1)
                    {
                        if (line.StartsWith("EXPECTED CLIENT BUILD ", StringComparison.InvariantCultureIgnoreCase))
                        {
                            m_version = GetClientBuildInfo(uint.Parse(line.Substring("EXPECTED CLIENT BUILD ".Length)));
                        }

                        continue;
                    }

                    if (line.Trim() == string.Empty)
                    {
                        readingData = false;

                        if (data != null)
                        {
                            string[] datas = dataString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            if (datas.Length != data.Length)
                                throw new FormatException(
                                    string.Format("Error in data chunk at line {0} ({1} vs {2} len)",
                                    nLine, datas.Length, data.Length)
                                    );
                            for (int i = 0; i < datas.Length; ++i)
                                data[i] = byte.Parse(datas[i], NumberStyles.AllowHexSpecifier);

                            var pkt = new WowPacket(data, direction, flags, flags2, time, ticks, opcode, conn_id);
                            this.InternalAddPacket(pkt);
                            this.OnPacketAdded(pkt);

                            if (reportProgressDelegate != null)
                            {
                                int newProgress = (int)(m_streamReader.BaseStream.Position * 100 / m_streamReader.BaseStream.Length);
                                if (newProgress != progress)
                                {
                                    progress = newProgress;
                                    reportProgressDelegate(progress);
                                }
                            }

                            dataString = null;
                            data = null;
                            flags = PacketFlags.None;
                            flags2 = WowPacketFlags.None;
                            ticks = 0;
                        }

                        waitingDate = true;
                    }
                    else if (waitingDate)
                    {
                        var parts = line.Split(new char[] { ' ' }, 4);
                        time = DateTime.Parse(parts[0] + ' ' + parts[1], CultureInfo.InvariantCulture);
                        waitingDate = false;
                        if (parts.Length >= 4)
                            ticks = uint.Parse(parts[2], NumberStyles.AllowHexSpecifier);

                        if (line.IndexOf("SERVER") != -1)
                            direction = TransferDirection.ToClient;
                        else if (line.IndexOf("CLIENT") != -1)
                            direction = TransferDirection.ToServer;
                    }
                    else if (readingData)
                    {
                        dataString += line;
                    }
                    else if (line.StartsWith("CLIENT"))
                    {
                        direction = TransferDirection.ToServer;
                    }
                    else if (line.StartsWith("SERVER"))
                    {
                        direction = TransferDirection.ToClient;
                    }
                    else if (line.StartsWith("SOCKET"))
                    {
                        int socket = int.Parse(line.Substring(line.IndexOf(':') + 1).Trim());
                        if (ConnectionIds.ContainsKey(socket))
                            conn_id = ConnectionIds[socket];
                        else
                        {
                            conn_id = (byte)(ConnectionIds.Count == 0 ? 1 : ConnectionIds.Last().Value + 1);
                            ConnectionIds.Add(socket, conn_id);
                        }
                    }
                    else if (line.StartsWith("LENGTH"))
                    {
                        int len = int.Parse(line.Substring(line.IndexOf(':') + 1).Trim());
                        data = new byte[len];
                    }
                    else if (line.StartsWith("OPCODE"))
                    {
                        string substr = line.Substring(line.IndexOf('(') + 1 + 2).TrimEnd(')');
                        opcode = ushort.Parse(substr, NumberStyles.AllowHexSpecifier);
                        if (opcode == 0x4F57)
                        {
                            flags2 |= WowPacketFlags.HelloPacket;
                            opcode = SpecialWowOpcodes.HelloOpcode;
                        }
                    }
                    else if (line.StartsWith("DATA"))
                    {
                        readingData = true;
                        dataString = string.Empty;
                    }
                    else if (line.Trim().Equals("NOT SEND", StringComparison.InvariantCultureIgnoreCase))
                    {
                        flags |= PacketFlags.Freezed;
                    }
                    else
                        throw new IOException();
                }
            }
            catch (Exception ex)
            {
                throw new FormatException("Error reading data on line " + nLine + ".", ex);
            }
            finally
            {
                this.CloseStream();
            }
        }
コード例 #6
0
ファイル: Pkt30NetworkLog.cs プロジェクト: CarlosX/Kamilla
        protected unsafe override void InternalRead(Action<int> reportProgressDelegate)
        {
            int headerSize = ChunkHeader.Size;
            var headerBytes = new byte[headerSize];
            var startTicks = this.StartTicks;
            bool firstPacket = true;

            fixed (byte* ptr = headerBytes)
            {
                int progress = 0;
                var header = (ChunkHeader*)ptr;

                while (m_stream.CanRead(1))
                {
                    if (m_stream.Read(headerBytes, 0, headerSize) != headerSize)
                        throw new EndOfStreamException();

                    var flags = PacketFlags.None;
                    int connId = 0;

                    if (m_snifferId == PktSnifferId.Kamilla)
                    {
                        int nOptBytes = header->OptionalDataLength;
                        if (--nOptBytes >= 0)
                        {
                            flags = (PacketFlags)m_stream.ReadByte();

                            if (--nOptBytes >= 0)
                            {
                                connId = m_stream.ReadByte();

                                if (nOptBytes > 0)
                                    m_stream.Skip(nOptBytes);
                            }
                        }
                    }
                    else
                        m_stream.Skip(header->OptionalDataLength);

                    var opcode = m_stream.ReadUInt32();
                    var data = m_stream.ReadBytes(header->DataLength - 4);

                    var wowFlags = (WowPacketFlags)(flags & ~PacketFlags.All);
                    if ((wowFlags & WowPacketFlags.HelloPacket) != 0)
                        opcode = SpecialWowOpcodes.HelloOpcode;

                    flags &= PacketFlags.All;

                    var packet = new WowPacket(data, header->Direction,
                        flags, wowFlags, header->UnixTime.AsUnixTime(),
                        header->TickCount, opcode, connId);
                    this.InternalAddPacket(packet);
                    this.OnPacketAdded(packet);

                    if (firstPacket)
                    {
                        if (this.StartTicks == 0)
                        {
                            this.StartTime = packet.ArrivalTime;
                            this.StartTicks = packet.ArrivalTicks;
                        }
                    }
                    firstPacket = false;

                    if (reportProgressDelegate != null)
                    {
                        int newProgress = (int)(
                            (m_stream.Position - m_streamOriginalPosition) * 100
                            / (m_stream.Length - m_streamOriginalPosition));
                        if (newProgress != progress)
                        {
                            progress = newProgress;
                            reportProgressDelegate(progress);
                        }
                    }
                }
            }
        }