Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        /*
         * 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;
            }
        }
Ejemplo n.º 4
0
        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;
            }
        }