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; } }