public virtual void AuthAccount(ref byte[] message, ClientHandler client, EventHandler events) { var p = new Outgoing.AuthAccount(true); // Check username and password int userLength = message[0x0B]; int passLength = message[0x0A] - userLength; var user = System.Text.Encoding.ASCII.GetString(message, 0x0C, userLength); var pass = System.Text.Encoding.ASCII.GetString(message, 0x0C + userLength, passLength); var ip = client.RemoteEndPoint.ToString().Split(':')[0]; int auth = 0; bool online = false; var database = client.Metadata["database"] as IDatabaseContracts; var dbresult = database.FetchAccount(user); if (dbresult != null) { if (dbresult.Item1 == GenerateHash(pass)) { auth = dbresult.Item2; if (auth == 0) { p.Status = AccountStatus.Unverified; } else if (auth == 2) { p.Status = AccountStatus.Banned; } else { online = dbresult.Item3; if (online) { p.Status = AccountStatus.Online; } else { client.AccountID = dbresult.Item4; p.Status = AccountStatus.Normal; events.SuccessfulLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.Success, client.AccountID)); } } } else { p.Status = AccountStatus.Incorrect; events.FailedLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.WrongPassword)); } } else { p.Status = AccountStatus.Incorrect; events.FailedLogin(this, new LoginEventArgs(user, pass, ip, LoginResult.UnknownUsername)); } var b = p.ToByteArray(); client.Send(ref b, "AuthAccount"); if (auth == 1 && !online) { SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
public static void AuthAccount(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { //byte[] b; int passLength = packet.ReadByte(); int userLength = packet.ReadByte(); passLength -= userLength; var user = packet.ReadString(userLength); var pass = packet.ReadString(passLength); var ip = client.RemoteEndPoint.ToString().Split(':')[0]; int auth = 0; bool online = false; var database = client.Metadata["database"] as IDatabaseContracts; var dbresult = database.FetchAccount(user); builder.New(0x7d2); { // Check username and password if (dbresult != null) { if (dbresult.Item1 == GenerateHash(pass)) { auth = dbresult.Item2; if (auth == 0) { builder += (byte)AccountStatus.Unverified; } else if (auth == 2) { builder += (byte)AccountStatus.Banned; } else { online = dbresult.Item3; if (online) { builder += (byte)AccountStatus.Online; } else { client.AccountID = dbresult.Item4; builder += (byte)AccountStatus.Normal; events.SuccessfulLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.Success, client.AccountID)); } } } else { builder += (byte)AccountStatus.Incorrect; events.FailedLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.WrongPassword)); } } else { builder += (byte)AccountStatus.Incorrect; events.FailedLogin("login.700.AuthAccount", new LoginEventArgs(user, pass, ip, LoginResult.UnknownUsername)); } builder += 0x0022F756; builder += (short)0x6301; builder += new byte[14]; builder += "000102030405060708090A0B0C0D0E0F"; // Key used when accessing cash shop and guild board. builder += (short)0x0100; builder += new byte[12]; builder += (byte)0; // For each server, append byte server_id and byte character_count //b = builder.Data; } client.Send(builder, "AuthAccount"); if (auth == 1 && !online) { //var cash = "http://shop.cabalonline.com/login.aspx?v1="; //var cashdead = "http://shop.cabalonline.com/login.aspx?isdead=1&v1="; //var guild = "http://nguild.cabalonline.com/CabalGuild/SecureLogin.aspx?EncVal="; //builder.New(0x80); // Cash shop and guild board URL's. //{ // builder += (short)0xB4; // builder += (short)0xB2; // builder += cash.Length; // builder += cash; // builder += cashdead.Length; // builder += cashdead; // builder += 0; // builder += guild.Length; // builder += guild; // builder += 0; // //b = builder.Data; //} //client.Send(builder, "CashGuildURLs"); //builder.New(0x78); // Unknown packet //{ // builder += (byte)9; // builder += (short)0; // //b = builder.Data; //} //client.Send(builder, "UnknownPacket_0x78"); //builder.New(0x7D2); // Unknown packet //{ // builder += (short)0x7D2; // b = builder.Data; //} //client.Send(builder, "2002"); SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
/* * Unknown_7D6 Packet * ------------------------- * Client2Server Structure: * * ushort : magic code * ushort : size * int : padding * ushort : opcode * * int : unk1 * byte[] : encrypted data #array size depends on RSA keylength, see PublicKey packet * ------------------------- * Server2Client Structure: * * ushort : magic code * ushort : size * ushort : opcode * * int : unk1 #is set to 1 upon successful login; otherwise 0 * int : unk2 * byte : unk3 * int : status #account status * ------------------------- * If login was successful, server sends another Unknown_7D6 packet: * Server2Client Structure: * * ushort : magic code * ushort : size * ushort : opcode * * int : unk1 #is set to 1 upon successful login; otherwise 0 * int : unk2 * byte : unk3 * int : status #account status * int : unk4 * byte : unk5 * int : unk6 * long : unk7 * byte : unk8 * int : unk9 * byte : unk10 * int : unk11 * int : unk12 * int : unk13 * char[32] : auth key #possibly used for cash shop * short : unk14 * byte : server count * * foreach server * byte : server id * byte : character count * * byte[] : unk15 #array length is 248 */ #endregion public static void Unknown_7D6(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { packet.Skip(4); var rsa = client.Metadata["rsa"] as RSA; if (rsa == null) { Log.Error("Unable to decrypt RSA data!"); client.Disconnect(); client = null; return; } byte[] encrypted = packet.ReadBytes(rsa.KeyLength / 8); // keylength is in bits byte[] details = rsa.Decrypt(encrypted); byte[] tmpdata = new byte[16]; if (details == null) { Log.Error("Unable to decrypt RSA data!"); client.Disconnect(); client = null; return; } Array.Copy(details, tmpdata, 16); string name = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Array.Copy(details, 65, tmpdata, 0, 16); string pass = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Log.Notice("Login authentication: " + name); string ip = client.RemoteEndPoint.ToString().Split(':')[0]; var syncServer = client.Metadata["syncServer"] as SyncReceiver; var data = Authentication.FetchAccount(syncServer, name, pass); bool kick = false; if (data == null || data.id == -1) { builder.New(0x7D6); { builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.OutOfService; } events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.OutOfService)); client.Send(builder, "Unknown_7D6"); return; } builder.New(0x7D6); { switch (data.status) { case AuthStatus.Unverified: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Unverified; break; case AuthStatus.Banned: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Banned; break; case AuthStatus.IncorrectName: case AuthStatus.IncorrectPass: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Incorrect; var tmp = data.status == AuthStatus.IncorrectName ? LoginResult.UnknownUsername : LoginResult.WrongPassword; events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, tmp)); break; case AuthStatus.Verified: client.AccountID = data.id; Authentication.UpdateIPDate(syncServer, client.AccountID, ip, DateTime.Now); Authentication.UpdateOnline(syncServer, client.AccountID, true); builder += 1; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Normal; events.SuccessfulLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.Success, client.AccountID)); break; default: kick = true; break; } } client.Send(builder, "Unknown_7D6"); if (kick) { client.Disconnect(); } if (data.id > 0 && data.status == AuthStatus.Verified) { builder.New(0x7D6); { builder += 1; builder += 0x0900; builder += (byte)0; builder += (int)AccountStatus.Normal; builder += 0x4B6359; builder += (byte)1; builder += 0x67; builder += (long)0; builder += (byte)0; builder += 0x43A56B60; builder += (byte)0; builder += 1; builder += 0; builder += 0; builder += "0A47130EA1D04A4D99D58F094B7E88C3"; // AuthKey builder += (short)0; builder += (byte)1; // Char Num of all servers builder += (byte)1; // Server ID builder += (byte)1; // CharNum } client.Send(builder, "Unknown_7D6"); URLToClient(packet, builder, client, events); SystemMessg(packet, builder, client, events); SendChannels.SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannels.SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }
public static void Unknown_7D6(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events) { packet.Skip(4); var details = RSA.Decrypt(packet.ReadBytes(256)); var tmpdata = new byte[16]; Array.Copy(details, tmpdata, 16); var name = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Array.Copy(details, 65, tmpdata, 0, 16); var pass = Encoding.UTF8.GetString(tmpdata).Trim('\0'); Log.Notice("Login authentication with name: " + name); var ip = client.RemoteEndPoint.ToString().Split(':')[0]; var syncServer = client.Metadata["syncServer"] as SyncReceiver; var data = Authentication.FetchAccount(syncServer, name, pass); var kick = false; if (data == null || data.id == -1) { builder.New(0x7D6); { builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.OutOfService; } events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.OutOfService)); client.Send(builder, "Unknown_7D6"); return; } builder.New(0x7D6); { switch (data.status) { case AuthStatus.Unverified: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Unverified; break; case AuthStatus.Banned: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Banned; break; case AuthStatus.IncorrectName: case AuthStatus.IncorrectPass: builder += 0; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Incorrect; var tmp = data.status == AuthStatus.IncorrectName ? LoginResult.UnknownUsername : LoginResult.WrongPassword; events.FailedLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, tmp)); break; case AuthStatus.Verified: client.AccountID = data.id; Authentication.UpdateIPDate(syncServer, client.AccountID, ip, DateTime.Now); builder += 1; builder += 0; builder += (byte)0; builder += (int)AccountStatus.Normal; events.SuccessfulLogin("login.AuthAccount", new LoginEventArgs(name, pass, ip, LoginResult.Success, client.AccountID)); break; default: kick = true; break; } } client.Send(builder, "Unknown_7D6"); if (kick) { client.Disconnect(); } if (data.id > 0 && data.status == AuthStatus.Verified) { builder.New(0x7D6); { builder += 1; builder += 0x0700; builder += (byte)0; builder += (int)AccountStatus.Normal; builder += 0x2FD49F; builder += (byte)1; builder += 0x67; builder += (long)0; builder += (byte)0; builder += 0x55746A01; builder += (byte)0; builder += 1; builder += 0; builder += 0x02; builder += "A6318A0A7D294CE2A7019511FEDB7AD7"; // AuthKey builder += (short)0; builder += (byte)1; // Char Num of all servers builder += (byte)1; // Server ID builder += (byte)1; // CharNum } client.Send(builder, "Unknown_7D6"); URLToClient(packet, builder, client, events); SystemMessg(packet, builder, client, events); SendChannels.SendChannelList(client); var timer = new System.Timers.Timer(5000); timer.AutoReset = true; timer.Elapsed += (sender, e) => { SendChannels.SendChannelList(client); }; timer.Start(); client.Metadata["timer"] = timer; } }