Exemplo n.º 1
0
        private void HandleNetwork()
        {
            while (true)
            {
                if (ShuttingDown)
                {
                    return;
                }

                for (int i = 0; i < Clients.Count; i++)
                {
                    //TODO: Kick client due to keep alive timeouts.
                    while (Clients[i].Client.NetworkManager.DataAvailable)
                    {
                        try
                        {
                            /* S <- P <- C
                             * Proxying data from client to server.
                             */

                            var rawPacket       = (byte[])null;                                                                    // raw encrypted packet
                            var decryptedPacket = (byte[])null;
                            var packet          = Clients[i].Client.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from client

                            if (packet != null)
                            {
                                HandlePacket(Clients[i], packet);
                                if (rawPacket != null)
                                {
                                    Clients[i].Server.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to server
                                    PacketDumper.LogPacket(packet, PacketDirection.Server, decryptedPacket);
                                    PacketLog.LogData(packet, PacketDirection.Server);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            ExceptionLog.LogData(ex);
                            Clients.RemoveAt(i);
                            goto ResetLoop;
                        }
                    }

                    if (Clients[i].Server == null)
                    {
                        continue;
                    }

                    while (Clients[i].Server.NetworkManager.DataAvailable)
                    {
                        try
                        {
                            /* S -> P -> C
                             * Proxying data from server to client.
                             */

                            var rawPacket       = (byte[])null;
                            var decryptedPacket = (byte[])null;
                            var packet          = Clients[i].Server.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from server

                            if (packet != null)
                            {
                                HandlePacket(Clients[i], packet);
                                if (rawPacket != null)
                                {
                                    Clients[i].Client.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to client
                                    PacketDumper.LogPacket(packet, PacketDirection.Client, decryptedPacket);
                                    PacketLog.LogData(packet, PacketDirection.Client);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            ExceptionLog.LogData(ex);
                            Clients.RemoveAt(i);
                            goto ResetLoop;
                        }
                    }

                    continue;
ResetLoop:
                    break;
                }
                Thread.Sleep(1);
            }
        }
Exemplo n.º 2
0
        public IPacket ReadPacket(out byte[] rawPacket, out byte[] decryptedPacket)
        {
            /* Receive data from the socket, saves it a buffer,
             * then reads packet from the buffer.
             */

            var timeout = DateTime.Now.AddMilliseconds(500); // 500ms

            while (DataAvailable && DateTime.Now < timeout)
            {
                CoCStream.ReadToBuffer(); // reads data saves it a buffer

                //var packetBuffer = new PacketBuffer(CoCStream.ReadBuffer.ToArray());
                var enPacketReader = new PacketReader(CoCStream.ReadBuffer);

                // read header
                var packetID      = enPacketReader.ReadUInt16();
                var packetLength  = enPacketReader.ReadInt24();
                var packetVersion = enPacketReader.ReadUInt16();

                // read body
                if (packetLength > enPacketReader.BaseStream.Length) // check if data is enough data is avaliable in the buffer
                {
                    continue;
                }

                var encryptedData = GetPacketBody(packetLength);
                var decryptedData = (byte[])encryptedData.Clone(); // cloning just cause we want the encrypted data

                CoCCrypto.Decrypt(decryptedData);

                var dePacketReader = new PacketReader(new MemoryStream(decryptedData));

                var packet = CreatePacketInstance(packetID);
                if (packet is UnknownPacket)
                {
                    packet = new UnknownPacket
                    {
                        ID      = packetID,
                        Length  = packetLength,
                        Version = packetVersion
                    };
                    ((UnknownPacket)packet).EncryptedData = encryptedData;
                }

                decryptedPacket = decryptedData;
                rawPacket       = ExtractRawPacket(packetLength);
                //CoCStream.ReadBuffer = new MemoryStream(4096);
                //CoCStream.Write(packetBuffer.Buffer, 0, packetBuffer.Buffer.Length);
                try
                {
                    packet.ReadPacket(dePacketReader);
                }
                catch (Exception ex)
                {
                    if (ExceptionLog != null)
                    {
                        ExceptionLog.LogData(ex);
                    }
                }
                return(packet);
            }
            decryptedPacket = null;
            rawPacket       = null;
            return(null);
        }