Exemple #1
0
        public bool Send(SendMethod method)
        {
            if (msg == null)
            {
                msg = new NetworkMessage(Client, 4048);
            }

            switch (method)
            {
            case SendMethod.Proxy:
                lock (msgLock)
                {
                    msg.Reset();
                    ToNetworkMessage(msg);

                    if (msg.Length > 8)
                    {
                        msg.InsetLogicalPacketHeader();
                        msg.PrepareToSend();

                        if (Destination == PacketDestination.Client)
                        {
                            Client.IO.Proxy.SendToClient(msg.Data);
                        }
                        else if (Destination == PacketDestination.Server)
                        {
                            Client.IO.Proxy.SendToServer(msg.Data);
                        }

                        return(true);
                    }
                }
                break;

            case SendMethod.HookProxy:
                lock (msgLock)
                {
                    msg.Reset();
                    ToNetworkMessage(msg);

                    if (msg.Length > 8)
                    {
                        msg.InsetLogicalPacketHeader();
                        msg.PrepareToSend();

                        Pipes.HookSendToServerPacket.Send(Client, msg.Data);

                        return(true);
                    }
                }
                break;

            case SendMethod.Memory:
                lock (msgLock)
                {
                    msg.Reset();
                    ToNetworkMessage(msg);
                    if (Destination == PacketDestination.Server)
                    {
                        if (msg.Length > 8)
                        {
                            msg.InsetLogicalPacketHeader();
                            msg.PrepareToSend();

                            return(SendPacketToServerByMemory(Client, msg.Data));
                        }
                    }
                    else if (Destination == PacketDestination.Client)
                    {
                        byte[] data = new byte[msg.Data.Length - 8];
                        Array.Copy(msg.Data, 8, data, 0, data.Length);
                        SendPacketToClientByMemory(Client, data);
                    }
                }
                break;
            }

            return(false);
        }
Exemple #2
0
 public bool ParseServerPacket(Client client, byte[] packet)
 {
     NetworkMessage inMsg = new NetworkMessage(client, packet);
     NetworkMessage outMsg = new NetworkMessage(client);
     while (inMsg.Position < packet.Length)
     {
         if (!ParsePacketFromServer(client, inMsg, outMsg))
             return false;
         outMsg.Reset();
     }
     return true;
 }
Exemple #3
0
        private void ServerReadCallBack(IAsyncResult ar)
        {
            byte[] serverData = null;
            try
            {
                int read = serverStream.EndRead(ar);

                if (read < 2)
                {
                    Restart();
                    return;
                }

                lastInteraction = DateTime.Now;
                int pSize = (int)BitConverter.ToUInt16(serverRecvMsg.GetBuffer(), 0) + 2;

                while (read < pSize)
                {
                    if (serverStream.CanRead)
                    {
                        read += serverStream.Read(serverRecvMsg.GetBuffer(), read, pSize - read);
                    }
                    else
                    {
                        throw new Exception("Connection broken.");
                    }
                }

                serverRecvMsg.Length = pSize;

                switch (protocol)
                {
                case Protocol.Login:
                    ParseCharacterList();
                    break;

                case Protocol.World:
                    OnReceivedDataFromServer(serverRecvMsg.Data);
                    serverData = serverRecvMsg.Data;
                    if (serverRecvMsg.CheckAdler32() && serverRecvMsg.XteaDecrypt(xteaKey))
                    {
                        serverRecvMsg.Position = serverRecvMsg.GetPacketHeaderSize();
                        int msgSize = (int)serverRecvMsg.GetUInt16() + serverRecvMsg.GetPacketHeaderSize() + 2;
                        clientSendMsg.Reset();

                        while (serverRecvMsg.Position < msgSize)
                        {
                            int  position = serverRecvMsg.Position;
                            byte type     = serverRecvMsg.PeekByte();
                            lastReceivedPacketTypes.Push(type);
                            if (!ParsePacketFromServer(client, serverRecvMsg, clientSendMsg))
                            {
                                byte[] unknown = serverRecvMsg.GetBytes(serverRecvMsg.Length - serverRecvMsg.Position);

                                OnSplitPacketFromServer(unknown[0], unknown);

                                WriteDebug("Unknown incoming packet, type: " + type.ToString("X") + ", data: " + unknown.ToHexString());
                                clientSendMsg.AddBytes(unknown);
                                break;
                            }

                            byte[] data = new byte[serverRecvMsg.Position - position];
                            Array.Copy(serverRecvMsg.GetBuffer(), position, data, 0, data.Length);

                            OnSplitPacketFromServer(data[0], data);
                        }

                        if (AllowIncomingModification &&
                            clientSendMsg.Length > clientSendMsg.GetPacketHeaderSize() + 2)
                        {
                            clientSendMsg.InsetLogicalPacketHeader();
                            clientSendMsg.PrepareToSend(xteaKey);

                            SendToClient(clientSendMsg.Data);
                        }
                        else
                        {
                            SendToClient(serverData);
                        }
                    }
                    else
                    {
                        SendToClient(serverData);
                    }

                    serverStream.BeginRead(serverRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ServerReadCallBack), null);
                    break;

                case Protocol.None:
                    SendToClient(serverRecvMsg.Data);
                    break;
                }
            }
            catch (System.IO.IOException) { }
            catch (ObjectDisposedException) { }
            catch (Exception ex)
            {
                WriteDebug(ex.ToString());

                if (serverData != null)
                {
                    SendToClient(serverData);
                    serverStream.BeginRead(serverRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ServerReadCallBack), null);
                }
                //Restart();
            }
        }
        public void ProcessFromServer(byte[] buffer)
        {
            int length = (int)BitConverter.ToUInt16(buffer, 0) + 2;

            if (length > buffer.Length)
            {
                // Packet is split into multiple chunks
                if (partialPacketSize == 0)
                {
                    // This is the first chunk
                    fullPacketSize = length;
                    Array.Copy(buffer, serverRecvMsg.GetBuffer(), buffer.Length);
                    partialPacketSize = buffer.Length;
                    return;
                }
                else
                {
                    // This is a subsequent chunk
                    Array.Copy(buffer, 0, serverRecvMsg.GetBuffer(), partialPacketSize, buffer.Length);
                    partialPacketSize += buffer.Length;

                    if (partialPacketSize < fullPacketSize)
                    {
                        // Packet is still incomplete
                        return;
                    }
                    else
                    {
                        // Packet is complete
                        serverRecvMsg.Length = fullPacketSize;
                    }
                }
            }
            else
            {
                fullPacketSize    = 0;
                partialPacketSize = 0;
                Array.Copy(buffer, serverRecvMsg.GetBuffer(), length);
                serverRecvMsg.Length = length;
            }

            OnReceivedDataFromServer(serverRecvMsg.Data);

            switch (protocol)
            {
            case Protocol.Login:
                break;

            case Protocol.World:
                bool adlerOkay   = serverRecvMsg.CheckAdler32();
                bool decryptOkay = serverRecvMsg.XteaDecrypt(client.IO.XteaKey);
                if (adlerOkay && decryptOkay)
                {
                    serverRecvMsg.Position = 6;
                    int msgSize = (int)serverRecvMsg.GetUInt16() + 8;
                    clientSendMsg.Reset();

                    while (serverRecvMsg.Position < msgSize)
                    {
                        int  position = serverRecvMsg.Position;
                        bool parsed   = false;

                        try
                        {
                            parsed = ParsePacketFromServer(client, serverRecvMsg, clientSendMsg);
                        }
                        catch (Exception ex)
                        {
                            WriteDebug(ex.Message + "\nStackTrace: " + ex.StackTrace);
                        }

                        if (!parsed)
                        {
                            if (serverRecvMsg.Length - serverRecvMsg.Position > 0 &&
                                serverRecvMsg.Length < serverRecvMsg.GetBuffer().Length)
                            {
                                byte[] unknown = serverRecvMsg.GetBytes(serverRecvMsg.Length - serverRecvMsg.Position);
                                OnSplitPacketFromServer(unknown[0], unknown);
                            }
                            break;
                        }

                        if (serverRecvMsg.Position - position > 0)
                        {
                            byte[] data = new byte[serverRecvMsg.Position - position];
                            Array.Copy(serverRecvMsg.GetBuffer(), position, data, 0, data.Length);

                            OnSplitPacketFromServer(data[0], data);
                        }
                    }
                }
                break;

            case Protocol.None:
                break;
            }
        }