Beispiel #1
0
        public static byte[] Encrypt(byte[] toEncrypt, byte[] key, int keyOffset)
        {
            if (key.Length <= 0 || toEncrypt.Length <= 0)
            {
                return(new byte[0]);
            }

            byte[] Out = new byte[toEncrypt.Length];
            //simple xor with key
            for (int i = 0; i < toEncrypt.Length; i++)
            {
                //Out[i] = (byte)(toEncrypt[i] ^ key[i % (key.Length / keyElementLenght)]);
                Out[i] = (byte)(toEncrypt[i] ^ key[keyOffset]);
            }
            //now xor with one char beafore
            for (int i = toEncrypt.Length - 2; i > 0; i--)
            {
                Out[i] = (byte)(Out[i] ^ Out[i + 1]);
            }
            if (Program.DEBUG_Encrypt)
            {
                string tmp = LoginServer.ByteArrayToHex(Out);
                Output.WriteLine("ENCODE WITH KEY: " + keyOffset.ToString() + " ENCODED: " + tmp);
            }
            return(Out);
        }
        private static void Init(Connection pConn, byte[] data)
        {
            UInt16 realL = BitConverter.ToUInt16(data, 0);

            if (Program.DEBUG_recv_stage1 || Program.DEBUG_recv)
            {
                Output.WriteLine("Init packet recv");
            }
            if (pConn.client.Status != Client.STATUS.Connected)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Init - STATUS != CONNECTED, close connection");
                }
                pConn.Close();
                return;
            }
            if (realL != 7424)//to get real length need to swap bytes
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Init - Wrong packet size, close connection");
                }
                pConn.Close();
                return;
            }
            if (data[Program.receivePrefixLength + 0] != 0x01 || data[Program.receivePrefixLength + 4] != 0x00 || data[Program.receivePrefixLength + 9] != 0x54 || data[Program.receivePrefixLength + 14] != 0x01)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Init - Wrong packet data, close connection");
                }
                pConn.Close();
                return;
            }
            int sKeyTmp = Program.rnd.Next(pConn.client.PrivateKey.Length);// random send key

            if (sKeyTmp >= pConn.client.PrivateKey.Length)
            {
                sKeyTmp = 0;
            }
            int rKeyTmp = Program.rnd.Next(pConn.client.PrivateKey.Length);//random recv key

            if (rKeyTmp >= pConn.client.PrivateKey.Length)
            {
                rKeyTmp = 0;
            }
            pConn.Send(new SendPacketHandlers.SendKey1(Program.mainKey, sKeyTmp, rKeyTmp));
            pConn.client.SendKeyOffset = sKeyTmp;
            pConn.client.RecvKeyOffset = rKeyTmp;
            pConn.client.PrivateKey    = Program.mainKey;
            if (Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::Init KEY: " + LoginServer.ByteArrayToHex(pConn.client.PrivateKey) + " SEND KEY OFFSET: " + sKeyTmp.ToString() + " RECV KEY OFFSET: " + rKeyTmp.ToString());
            }
            pConn.client.Status = Client.STATUS.Login;
            return;
        }
        //Create new user account
        public static void NewLogin(Connection pConn, byte[] data)
        {
            int newID = -1;

            if (pConn.client.Status != Client.STATUS.Login)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::NewLogin - Error recv NewLogin beafore Init, close connection");
                }
                pConn.Close();
                return;
            }
            if (Program.DEBUG_recv_stage1 || Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::NewLogin Recv new login packet");
            }
            byte pwLength = data[Program.receivePrefixLength];

            if (pwLength < 3) //if (pwLength != 8)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::NewLogin NewLogin fail");
                }
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED));
                return;
            }
            byte[] tmpPW = new byte[pwLength];
            Array.Copy(data, Program.receivePrefixLength + 1, tmpPW, 0, pwLength);
            byte idLength = data[Program.receivePrefixLength + pwLength + 1];

            if (idLength < 3 || idLength > 8)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::NewLogin Login fail [1]");
                }
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED));
                return;
            }
            byte[] tmpID = new byte[idLength];
            Array.Copy(data, Program.receivePrefixLength + pwLength + 2, tmpID, 0, idLength);
            byte[] cryptID = Crypt.Aes.AES_Encrypt(tmpID, Encoding.ASCII.GetBytes(Program.aesKey), Encoding.ASCII.GetBytes(Program.aesSalt));
            byte[] cryptPW = Crypt.Aes.AES_Encrypt(tmpPW, Encoding.ASCII.GetBytes(Program.aesKey), Encoding.ASCII.GetBytes(Program.aesSalt));
            if (Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::NewLogin Recv Login: "******" PW: " + Encoding.ASCII.GetString(tmpPW));
            }
            if (Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::NewLogin Recv Crypted Login: "******" PW: " + LoginServer.ByteArrayToHex(cryptPW));
            }
            newID = Database.DB_Acces.NewLogin(cryptID, cryptPW);
            if (newID == -3)
            {
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.UNDEFINED));
                return;
            }
            else if (newID == -2)//login currently exist can't make new one
            {
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED));
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::NewLogin User already exists!");
                }
            }
            else//selected Login succesfull created. say client to reconnect and login with newly created login
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::NewLogin Succesfully inserted new User");
                }
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.CONNECT_AGAIN));
                pConn.Close();
            }
        }
        public static void Login(Connection pConn, byte[] data)
        {
            byte[] tmpPW;
            byte[] tmpID;
            byte[] cryptID;
            byte[] cryptPW;
            byte   idLength;
            byte   pwLength;
            int    userID = -1;

            if (pConn.client.Status != Client.STATUS.Login)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Login - Error recv login beafore Init, close connection");
                }
                pConn.Close();
                return;
            }
            if (Program.DEBUG_recv_stage1 || Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::Login Recv login packet");
            }
            pwLength = data[Program.receivePrefixLength];
            if (pwLength < 3) //if (pwLength != 8)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Login Login fail");
                }
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED));
                pConn.client.NumberOfLoginTrys++;
                if (pConn.client.NumberOfLoginTrys > 3)
                {
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login Too many fail trys, close connection");
                    }
                    pConn.Close();
                }
                return;
            }
            tmpPW = new byte[pwLength];
            Array.Copy(data, Program.receivePrefixLength + 1, tmpPW, 0, pwLength);
            idLength = data[Program.receivePrefixLength + pwLength + 1];
            if (idLength < 3 || idLength > 8)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Login Login fail [1]");
                }
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.NOT_ALLOWED));
                pConn.client.NumberOfLoginTrys++;
                if (pConn.client.NumberOfLoginTrys > 3)
                {
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login Too many fail trys, close connection");
                    }
                    pConn.Close();
                }
                return;
            }
            tmpID = new byte[idLength];
            Array.Copy(data, Program.receivePrefixLength + pwLength + 2, tmpID, 0, idLength);
            cryptID = Crypt.Aes.AES_Encrypt(tmpID, Encoding.ASCII.GetBytes(Program.aesKey), Encoding.ASCII.GetBytes(Program.aesSalt));
            cryptPW = Crypt.Aes.AES_Encrypt(tmpPW, Encoding.ASCII.GetBytes(Program.aesKey), Encoding.ASCII.GetBytes(Program.aesSalt));
            if (Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::Login Recv Login: "******" PW: " + Encoding.ASCII.GetString(tmpPW));
            }
            if (Program.DEBUG_recv)
            {
                Output.WriteLine("RecvPacketHandlers::Login Recv Crypted Login: "******" PW: " + LoginServer.ByteArrayToHex(cryptPW));
            }
            userID = Database.DB_Acces.Login(cryptID, cryptPW);
            if (userID < 0)
            {
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Login Login fail [2] Error: " + userID.ToString());
                }
                pConn.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.WRONGID));
                pConn.client.NumberOfLoginTrys++;
                if (pConn.client.NumberOfLoginTrys > 3)
                {
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login Too many fail trys, close connection");
                    }
                    pConn.Close();
                }
            }
            else
            {// LOGIN IS OK
                if (Program.DEBUG_recv)
                {
                    Output.WriteLine("RecvPacketHandlers::Login Login is OK  UserID: " + userID.ToString());
                }
                if (Users.Exists(userID))//User currently loged in...
                {
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login User already LOGED IN!");
                    }
                    Connection tmpCon;
                    Users.Remove(userID, out tmpCon);
                    if (tmpCon != null)
                    {
                        tmpCon.Send(new SendPacketHandlers.LoginError(SendPacketHandlers.LOGIN_ERROR.CURRENTLY_LOGGED));
                        tmpCon.Close();
                    }
                }
                if (InGameUsers.Exists(userID))
                {
                    //send to correct GameServer info about user log in -> game server will close corensponding connection
                    //next we should recv from game server info about closed connection and then we remove userID from InGameUsers list
                    //but for now we allow user to continue
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login UserID: " + userID.ToString() + " already IN GAME!");
                    }
                }
                pConn.client.UserID = userID;
                if (!Users.Add(userID, pConn))// add this new succesfull login to the loged user list
                {
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login Error trying add new user");
                    }
                    pConn.Close();
                }
                List <Database.Player> lPlayers = Database.DB_Acces.PlayerList(userID);
                pConn.client.AddPlayer(lPlayers);
                pConn.Send(new SendPacketHandlers.BeginPlayerList(userID));
                foreach (Database.Player row in lPlayers)
                {
                    if (Program.DEBUG_recv)
                    {
                        Output.WriteLine("RecvPacketHandlers::Login Found in DB player character name: " + row.PlayerName);
                    }
                    MemoryStream stream       = new MemoryStream();
                    BinaryWriter streamWriter = new BinaryWriter(stream);
                    streamWriter.Write((int)row.PlayerPID);
                    streamWriter.Write((string)row.PlayerName);
                    streamWriter.Write((int)row.Strength);
                    streamWriter.Write((int)row.Health);
                    streamWriter.Write((int)row.Intel);
                    streamWriter.Write((int)row.Wisdom);
                    streamWriter.Write((int)row.Agility);
                    streamWriter.Write((int)row.PosX);
                    streamWriter.Write((int)row.PosY);
                    streamWriter.Write((int)row.PosZ);
                    streamWriter.Write((int)row.Race);
                    streamWriter.Write((int)row.Job);
                    streamWriter.Write((int)row.Level);
                    streamWriter.Write((int)row.FaceType);
                    streamWriter.Write((int)row.HairType);
                    streamWriter.Write((int)row.Experience);
                    streamWriter.Write((int)row.ActHealth);
                    streamWriter.Write((int)row.ActMana);
                    streamWriter.Write((int)row.ActRage);
                    streamWriter.Write((int)row.HeadArmor);
                    streamWriter.Write((int)row.GlovesArmor);
                    streamWriter.Write((int)row.ChestArmor);
                    streamWriter.Write((int)row.ShortsArmor);
                    streamWriter.Write((int)row.BootsArmor);
                    streamWriter.Write((int)row.LeftHand);
                    streamWriter.Write((int)row.RightHand);
                    pConn.Send(new SendPacketHandlers.Player(stream.ToArray()));
                }
                pConn.Send(new SendPacketHandlers.EndPlayerList());
                pConn.client.Status = Client.STATUS.CharSelect;
            }
        }