Example #1
0
        public void ProcessFromClient(byte[] buffer)
        {
            int length = buffer.Length;

            Array.Copy(buffer, clientRecvMsg.GetBuffer(), length);
            clientRecvMsg.Length = length;

            OnReceivedDataFromClient(clientRecvMsg.Data);

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

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


                    int position = clientRecvMsg.Position;

                    if (!ParsePacketFromClient(client, clientRecvMsg, serverSendMsg))
                    {
                        //unknown packet
                        byte[] unknown = clientRecvMsg.GetBytes(clientRecvMsg.Length - clientRecvMsg.Position);

                        OnSplitPacketFromClient(unknown[0], unknown);
                    }

                    byte[] data = new byte[clientRecvMsg.Position - position];
                    Array.Copy(clientRecvMsg.GetBuffer(), position, data, 0, data.Length);
                    OnSplitPacketFromClient(data[0], data);
                }
                break;
            }
        }
Example #2
0
        private void ClientReadCallBack(IAsyncResult ar)
        {
            byte[] clientData = null;
            try
            {
                int read = clientStream.EndRead(ar);

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

                int pSize = (int)BitConverter.ToUInt16(clientRecvMsg.GetBuffer(), 0) + 2;

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

                clientRecvMsg.Length = pSize;

                switch (protocol)
                {
                case Protocol.None:
                    ParseFirstClientMsg();
                    break;

                case Protocol.World:
                    OnReceivedDataFromClient(clientRecvMsg.Data);

                    clientData = clientRecvMsg.Data;

                    if (clientRecvMsg.CheckAdler32() && clientRecvMsg.XteaDecrypt(xteaKey))
                    {
                        clientRecvMsg.Position = clientRecvMsg.GetPacketHeaderSize();
                        int msgLength = (int)clientRecvMsg.GetUInt16() + 8;
                        serverSendMsg.Reset();


                        int position = clientRecvMsg.Position;

                        if (!ParsePacketFromClient(client, clientRecvMsg, serverSendMsg))
                        {
                            //unknown packet
                            byte[] unknown = clientRecvMsg.GetBytes(clientRecvMsg.Length - clientRecvMsg.Position);

                            OnSplitPacketFromClient(unknown[0], unknown);

                            WriteDebug("Unknown outgoing packet: " + unknown.ToHexString());
                            serverSendMsg.AddBytes(unknown);
                        }

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

                        if (AllowOutgoingModification &&
                            serverSendMsg.Length > serverSendMsg.GetPacketHeaderSize() + 2)
                        {
                            serverSendMsg.InsetLogicalPacketHeader();
                            serverSendMsg.PrepareToSend(xteaKey);

                            SendToServer(serverSendMsg.Data);
                        }
                        else
                        {
                            SendToServer(clientData);
                        }
                    }
                    else
                    {
                        SendToServer(clientData);
                    }
                    clientStream.BeginRead(clientRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ClientReadCallBack), null);
                    break;

                case Protocol.Login:
                    break;
                }
            }
            catch (ObjectDisposedException) { /*We don't have to log this exception. */ }
            catch (System.IO.IOException ex) { WriteDebug(ex.ToString()); }
            catch (Exception ex)
            {
                WriteDebug(ex.ToString());
                if (clientData != null)
                {
                    SendToServer(clientData);
                }
            }
        }
Example #3
0
        private void loadToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Smart AutoLooter Files (*.salf)|*.salf";
            dialog.Title = "Open File";

            if (dialog.ShowDialog() == DialogResult.OK)
            {
                Tibia.Packets.NetworkMessage msg = new NetworkMessage(null, System.IO.File.ReadAllBytes(dialog.FileName));

                try
                {
                    ushort count = msg.GetUInt16();

                    for (int i = 0; i < count; i++)
                    {
                        LootItem lootItem = new LootItem(msg.GetUInt16(), msg.GetByte(), msg.GetString());
                        listBoxItems.Items.Add(lootItem);
                        _lootItems.Add(lootItem);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
Example #4
0
        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;
            }
        }
Example #5
0
        private void LoginServerReceived(IAsyncResult ar)
        {
            try
            {
                int dataLength = loginSocket.EndReceive(ar);
                if (dataLength > 0)
                {
                    byte[] tmp = new byte[dataLength];
                    Array.Copy(dataLoginServer, tmp, dataLength);
                    NetworkMessage msg = new NetworkMessage(tmp);
                    msg.PrepareToRead(xteaKey.ToUInt32Array());
                    msg.GetUInt16();
                    while (msg.Position < msg.Length)
                    {
                        byte cmd = msg.GetByte();
                        string message;
                        switch (cmd)
                        {
                            case 0x0A: //Error message
                                message = msg.GetString();
                                if (LoginServer_OnError != null)
                                    LoginServer_OnError(message);
                                break;
                            case 0x0B: //For your information
                                message = msg.GetString();
                                if (LoginServer_FYI != null)
                                    LoginServer_FYI(message);
                                break;
                            case 0x14: //MOTD
                                message = msg.GetString();
                                if (LoginServer_MOTD != null)
                                    LoginServer_MOTD(message);
                                break;
                            case 0x1E: //Patching exe/dat/spr messages
                            case 0x1F:
                            case 0x20:
                                if (LoginServer_Patching != null)
                                    LoginServer_Patching("A new client is available.");
                                return;
                            case 0x28: //Select another login server   
                                if (LoginServer_SelectAnother != null)
                                    LoginServer_SelectAnother("Select another login server.");
                                if (retry)
                                {
                                    if (loginServerIndex < maxLoginServers - 1)
                                    {
                                        loginServerIndex++;
                                        TryLoginServer();
                                    }
                                    else
                                    {
                                        if (LoginServer_CouldNotConnect != null)
                                            LoginServer_CouldNotConnect("Select another login server.");

                                        loginSocket.Disconnect(true);
                                        if (Socket_Disconnected != null)
                                            Socket_Disconnected("dataLength<=0");
                                    }
                                }
                                break;
                            case 0x64: //character list
                                int nChars = (int)msg.GetByte();
                                charList = new CharacterLoginInfo[nChars];

                                for (int i = 0; i < nChars; i++)
                                {
                                    charList[i].CharName = msg.GetString();
                                    charList[i].WorldName = msg.GetString();
                                    charList[i].WorldIP = msg.GetUInt32();
                                    charList[i].WorldIPString = IPBytesToString(BitConverter.GetBytes(charList[i].WorldIP), 0);
                                    charList[i].WorldPort = msg.GetUInt16();
                                }

                                if (LoginServer_CharList != null)
                                    LoginServer_CharList("Charlist received.");

                                loginSocket.Disconnect(true);
                                if (Socket_Disconnected != null)
                                    Socket_Disconnected("Charlist received.");
                                return;
                            default:
                                //Notify about an unknown message
                                if (LoginServer_UnknownMsg != null)
                                    LoginServer_UnknownMsg(msg.Data.ToHexString());

                                loginSocket.Disconnect(true);
                                if (Socket_Disconnected != null)
                                    Socket_Disconnected("Unknown Message.");
                                break;
                        }
                    }
                }
                else //we didn't receive anything
                {
                    if (LoginServer_ReceivedNothing != null)
                        LoginServer_ReceivedNothing("Nothing received on LoginServerIndex=" + loginServerIndex);
                    if (retry)
                    {
                        if (loginServerIndex < maxLoginServers - 1)
                        {
                            loginServerIndex++;
                            TryLoginServer();
                        }
                        else
                        {
                            if (LoginServer_CouldNotConnect != null)
                                LoginServer_CouldNotConnect("dataLength<=0");

                            loginSocket.Disconnect(true);
                            if (Socket_Disconnected != null)
                                Socket_Disconnected("dataLength<=0");
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }