示例#1
0
文件: Client.cs 项目: toddw123/KRelay
        private void Send(Packet packet, bool client)
        {
            lock (client ? _clientLock : _serverLock)
            {
                bool success = PluginUtils.ProtectedInvoke(() =>
                {
                    MemoryStream ms = new MemoryStream();
                    using (PacketWriter w = new PacketWriter(ms))
                    {
                        w.Write((int)0);
                        w.Write(packet.Id);
                        packet.Write(w);
                    }

                    byte[] data = ms.ToArray();
                    PacketWriter.BlockCopyInt32(data, data.Length);

                    if (client)
                    {
                        _clientSendState.Cipher(data);
                        _clientStream.Write(data, 0, data.Length);
                    }
                    else
                    {
                        _serverSendState.Cipher(data);
                        _serverStream.Write(data, 0, data.Length);
                    }
                }, "PacketSend (packet = " + packet?.Type + ")", typeof(IOException));

                if (!success)
                {
                    Dispose();
                }
            }
        }
示例#2
0
文件: Client.cs 项目: abrn/exalt-root
    // Token: 0x06000231 RID: 561 RVA: 0x0000FC54 File Offset: 0x0000DE54
    private void RemoteRead(IAsyncResult ar)
    {
        bool          flag          = (bool)ar.AsyncState;
        PacketBuffer  packetBuffer  = flag ? this._clientBuffer : this._serverBuffer;
        NetworkStream networkStream = flag ? this._clientStream : this._serverStream;
        bool          flag2;
        RC4Cipher     rc4Cipher = (flag2 = (networkStream == this._clientStream)) ? this._clientReceiveState : this._serverReceiveState;

        try
        {
            if (networkStream.CanRead)
            {
                int num = networkStream.EndRead(ar);
                packetBuffer.Advance(num);
                if (num == 0)
                {
                    this.Dispose(null);
                }
                else if (packetBuffer.Index == 4)
                {
                    packetBuffer.Resize(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(packetBuffer.Bytes, 0)));
                    this.BeginRead(packetBuffer.Index, packetBuffer.BytesRemaining(), flag2);
                }
                else if (packetBuffer.BytesRemaining() > 0)
                {
                    this.BeginRead(packetBuffer.Index, packetBuffer.BytesRemaining(), flag2);
                }
                else
                {
                    rc4Cipher.Cipher(packetBuffer.Bytes);
                    Packet packet     = Packet.Create(packetBuffer.Bytes);
                    object handleLock = this._handleLock;
                    lock (handleLock)
                    {
                        this.HandlePacket(packet);
                    }
                    if (packet.Send)
                    {
                        this.Send(packet, !flag2);
                    }
                    packetBuffer.Reset();
                    this.BeginRead(0, 4, flag2);
                }
            }
        }
        catch (Exception reason)
        {
            this.Dispose(reason);
        }
    }
示例#3
0
        private void Send(Packet packet, bool client)
        {
            if (packet.Send == false && packet.Type != PacketType.HELLO)
            {
                return;
            }
            lock (client ? _clientLock : _serverLock)
            {
                bool success = false;
                try
                {
                    MemoryStream ms = new MemoryStream();
                    using (PacketWriter w = new PacketWriter(ms))
                    {
                        w.Write((int)0);
                        w.Write(packet.Id);
                        packet.Write(w);
                    }

                    byte[] data = ms.ToArray();
                    PacketWriter.BlockCopyInt32(data, data.Length);

                    if (client)
                    {
                        _clientSendState.Cipher(data);
                        _clientStream.Write(data, 0, data.Length);
                    }
                    else
                    {
                        _serverSendState.Cipher(data);
                        _serverStream.Write(data, 0, data.Length);
                    }
                    success = true;
                }
                catch { }

                if (!success)
                {
                    Dispose();
                }
            }
        }
示例#4
0
        private void RemoteRead(IAsyncResult ar)
        {
            NetworkStream stream   = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item1;
            PacketBuffer  buffer   = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item2;
            bool          isClient = stream == _clientStream;
            RC4Cipher     cipher   = isClient ? _clientReceiveState : _serverReceiveState;

            bool success = PluginUtils.ProtectedInvoke(() =>
            {
                if (!stream.CanRead)
                {
                    return;
                }
                int read;
                try
                {
                    read = stream.EndRead(ar);
                }
                catch { return; }

                buffer.Advance(read);

                if (read == 0)
                {
                    Dispose();
                    return;
                }
                else if (buffer.Index == 4)
                {   // We have the first four bytes, resize the client buffer
                    buffer.Resize(IPAddress.NetworkToHostOrder(
                                      BitConverter.ToInt32(buffer.Bytes, 0)));
                    BeginRead(buffer.Index, buffer.BytesRemaining(), isClient);
                }
                else if (buffer.BytesRemaining() > 0)
                {   // Awaiting the rest of the packet
                    BeginRead(buffer.Index, buffer.BytesRemaining(), isClient);
                }
                else
                {   // We have the full packet
                    cipher.Cipher(buffer.Bytes);
                    byte[] temp = (byte[])buffer.Bytes.Clone();
                    if (_proxy.IsHooked((PacketType)buffer.Bytes[4]))
                    {
                        temp = null;                                               //If a packet isn't hooked then just send the raw data (no packet processing). Helps with broken/missing packet types.
                    }
                    Packet packet = Packet.Create(buffer.Bytes);

                    if (isClient)
                    {
                        _proxy.FireClientPacket(this, packet);
                    }
                    else
                    {
                        _proxy.FireServerPacket(this, packet);
                    }

                    if (packet.Send)
                    {
                        Send(packet, !isClient, temp);
                    }

                    buffer.Reset();
                    BeginRead(0, 4, isClient);
                }
            }, "RemoteRead (isClient = " + isClient + ")", typeof(IOException));

            if (!success)
            {
                Dispose();
            }
        }
示例#5
0
        private void RemoteRead(IAsyncResult ar)
        {
            NetworkStream stream   = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item1;
            PacketBuffer  buffer   = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item2;
            bool          isClient = stream == _clientStream;
            RC4Cipher     cipher   = isClient ? _clientReceiveState : _serverReceiveState;

            bool success = PluginUtils.ProtectedInvoke(() =>
            {
                if (!stream.CanRead)
                {
                    return;
                }
                int read;
                try
                {
                    read = stream.EndRead(ar);
                }
                catch { return; }

                buffer.Advance(read);

                if (read == 0)
                {
                    Dispose();
                    return;
                }
                else if (buffer.Index == 4)
                {   // We have the first four bytes, resize the client buffer
                    int len = IPAddress.NetworkToHostOrder(
                        BitConverter.ToInt32(buffer.Bytes, 0));
                    if (len == 1014001516) //known issue
                    {
                        throw new Exception("Invalid Buffer Size Problem: Try joining a non-proxy server then switching to the proxy server again. More info: https://www.mpgh.net/forum/showthread.php?t=1196439");
                    }

                    buffer.Resize(len);
                    BeginRead(buffer.Index, buffer.BytesRemaining(), isClient);
                }
                else if (buffer.BytesRemaining() > 0)
                {   // Awaiting the rest of the packet
                    BeginRead(buffer.Index, buffer.BytesRemaining(), isClient);
                }
                else
                {   // We have the full packet
                    cipher.Cipher(buffer.Bytes);
                    Packet packet = Packet.Create(buffer.Bytes);

                    if (isClient)
                    {
                        _proxy.FireClientPacket(this, packet);
                    }
                    else
                    {
                        _proxy.FireServerPacket(this, packet);
                    }

                    if (packet.Send)
                    {
                        Send(packet, !isClient);
                    }

                    buffer.Reset();
                    BeginRead(0, 4, isClient);
                }
            }, "RemoteRead (isClient = " + isClient + ")", typeof(IOException));

            if (!success)
            {
                Dispose();
            }
        }
示例#6
0
文件: Client.cs 项目: RS-HC/KRelay
        private void RemoteRead(IAsyncResult ar)
        {
            NetworkStream stream   = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item1;
            PacketBuffer  buffer   = (ar.AsyncState as Tuple <NetworkStream, PacketBuffer>).Item2;
            bool          isClient = stream == _clientStream;
            RC4Cipher     cipher   = isClient ? _clientReceiveState : _serverReceiveState;

            bool success = PluginUtils.ProtectedInvoke(() =>
            {
                if (!stream.CanRead)
                {
                    return;
                }
                int read;
                try
                {
                    read = stream.EndRead(ar);
                }
                catch { return; }

                buffer.Advance(read);

                if (read == 0)
                {
                    Dispose();
                    return;
                }
                else if (buffer.Index == 4)
                {
                    buffer.Resize(IPAddress.NetworkToHostOrder(
                                      BitConverter.ToInt32(buffer.Bytes, 0)));
                    BeginRead(buffer.Index, buffer.BytesRemaining(), isClient);
                }
                else if (buffer.BytesRemaining() > 0)
                {
                    BeginRead(buffer.Index, buffer.BytesRemaining(), isClient);
                }
                else
                {
                    cipher.Cipher(buffer.Bytes);
                    Packet packet = Packet.Create(buffer.Bytes);

                    if (isClient)
                    {
                        _proxy.FireClientPacket(this, packet);
                    }
                    else
                    {
                        _proxy.FireServerPacket(this, packet);
                    }

                    if (packet.Send)
                    {
                        Send(packet, !isClient);
                    }

                    buffer.Reset();
                    BeginRead(0, 4, isClient);
                }
            }, "RemoteRead (isClient = " + isClient + ")", typeof(IOException));

            if (!success)
            {
                Dispose();
            }
        }