예제 #1
0
        public void ReadDnsFile(string FilePath)
        {
            DnsNames.Clear();
            if (File.Exists(FilePath) && new FileInfo(FilePath).Length > 0)
            {
                PayloadReader pr = new PayloadReader(File.ReadAllBytes(FilePath));

                for (int i = 0; pr.Offset < pr.Length; i++)
                {
                    string name  = pr.ReadString();
                    uint   DnsId = pr.ReadUInteger();
                    DnsNames.Add(DnsId, new RootDnsInfo(name, DnsId));
                }
            }
        }
        public object Deserialize(byte[] data)
        {
            PayloadReader pr = new PayloadReader(data);
            ObjectTypes Id = (ObjectTypes)pr.ReadByte();

            switch (Id)
            {
                case ObjectTypes.Null: return null;
                case ObjectTypes.Other:
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Binder = new DeserializationBinder();
                    return bf.Deserialize(new MemoryStream(pr.ReadBytes(pr.Length - pr.Position)));
                }
                case ObjectTypes.Byte: return pr.ReadByte();
                case ObjectTypes.Short: return pr.ReadShort();
                case ObjectTypes.UShort: return pr.ReadUShort();
                case ObjectTypes.Int: return pr.ReadInteger();
                case ObjectTypes.UINT: return pr.ReadUInteger();
                case ObjectTypes.Long: return pr.ReadLong();
                case ObjectTypes.Bool: return pr.ReadByte() == 1;
                case ObjectTypes.String: return pr.ReadString();
                case ObjectTypes.SolidBrush: return new SolidBrush(Color.FromArgb(pr.ReadByte(), pr.ReadByte(), pr.ReadByte(), pr.ReadByte()));
                case ObjectTypes.Rectangle: return new Rectangle(pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger());
                case ObjectTypes.Size: return new Size(pr.ReadInteger(), pr.ReadInteger());
                case ObjectTypes.ByteArray: return pr.ReadBytes(pr.ReadInteger());
                case ObjectTypes.Bitmap:
                {
                    using (MemoryStream stream = new MemoryStream(pr.Buffer, pr.Position, pr.Length - pr.Position))
                    {
                        long oldPos = stream.Position;
                        Bitmap bmp = (Bitmap)Bitmap.FromStream(stream);
                        pr.Position += (int)(stream.Position - oldPos);
                        return bmp;
                    }
                }
                default: throw new Exception("Error deserializing");
            }
        }
예제 #3
0
        public void OnLogin(ClientSession cs, InPacket ip)
        {
            PayloadReader pReader = new PayloadReader(ip.Payload);

            Database db = new Database();

            pReader.Skip(7);
            byte IDLength = pReader.ReadByte();

            UID = pReader.ReadString(IDLength);

            pReader.Skip(3);

            byte PWLength = pReader.ReadByte();

            UPW = pReader.ReadString(PWLength);

            if (db.OpenDB())
            {
                try
                {
                    MySqlDataReader sReader = db.Query("SELECT * FROM users WHERE LOGIN = @0 AND PASS = @1", UID, UPW);
                    Log.SqlQuerys(db.dbcmd.CommandText);

                    if (!sReader.HasRows)
                    {
                        Log.Inform("Falha no login. Usuário: {0}", UID);

                        try
                        {
                            PayloadWriter pWriter = new PayloadWriter();

                            byte[] plContent = { 0x00, 0x00, 0x00, 0x14 };
                            pWriter.WriteData(plContent);

                            pWriter.WriteData(IDLength * 2);
                            pWriter.WriteUnicodeString(UID);

                            byte[] plContent1 = { 0x00, 0x00, 0x00, 0x00, 0x00 };
                            pWriter.WriteData(plContent1);

                            OutPacket oPacket = new OutPacket(pWriter.GetCompressedPayload(CenterOpcodes.ENU_VERIFY_ACCOUNT_ACK),
                                                              cs._CryptoHandler, cs._AuthHandler, cs.Prefix, ++cs.Count);

                            cs.Send(oPacket);
                        }
                        catch (Exception ex)
                        {
                            Log.Error(ex.Message);
                            while (true)
                            {
                                ;
                            }
                        }
                    }
                    else
                    {
                        // Successful login.
                        Log.Inform("Novo login. Usuário: {0}", UID);

                        // Send server list first.
                        Log.Inform("Enviando a lista de servidores.");
                        SendServerList(cs);
                        SendChannelNews(cs);
                        SendShop(cs);
                        SendClientContentOpen(cs);
                        SendSocketTableInfo(cs);
                        SendCashbackRatio(cs);

                        //Log.Inform("로그인 성공 메시지를 전송합니다.", ID);

                        PayloadWriter pWritter = new PayloadWriter();

                        byte[] plContent = { 0x00, 0x00, 0x00, 0x00 };
                        pWritter.WriteData(plContent);
                        pWritter.WriteData(IDLength * 2);
                        pWritter.WriteUnicodeString(UID);
                        pWritter.WriteData(PWLength);
                        pWritter.WriteData(UPW);

                        byte[] plContent2 = Util.StringToByteArray("00 00 00 00 14 00 8E A7 C5 01 00 00 00 00 00 00 02 4B 52 00 05 A3 BD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00");
                        pWritter.WriteData(plContent2);

                        pWritter.WriteData(cs.MyLoading.GuildMarkURL.Length * 2);
                        pWritter.WriteUnicodeString(cs.MyLoading.GuildMarkURL);

                        byte[] plContent3 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
                        pWritter.WriteData(plContent3);

                        int SHAi = cs.MyLoading.SHAFileList.Length;
                        pWritter.WriteData(SHAi);

                        for (int i = 0; i <= cs.MyLoading.SHAFileList.Length - 1; i++)
                        {
                            pWritter.WriteData(cs.MyLoading.SHAFileList[i].Length * 2);
                            pWritter.WriteUnicodeString(cs.MyLoading.SHAFileList[i]);
                            pWritter.WriteData(true);
                        }

                        byte[] plContent4 = Util.StringToByteArray("00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 00 64 01 00 00 00 00 00 00 00 64 02 00 00 00 00 00 00 00 64 01 BF 80 00 00 FC 04 97 FF 00 00 00 00 00 00 00 00 00 00 00 00");
                        pWritter.WriteData(plContent4);

                        OutPacket oPacket = new OutPacket(pWritter.GetCompressedPayload(CenterOpcodes.ENU_VERIFY_ACCOUNT_ACK),
                                                          cs._CryptoHandler, cs._AuthHandler, cs.Prefix, ++cs.Count);

                        cs.Send(oPacket);
                    }

                    sReader.Close();
                    db.dbconn.Close();
                }
                catch (MySql.Data.MySqlClient.MySqlException ex)
                {
                    Log.Sql(ex.Message);
                    while (true)
                    {
                        ;
                    }
                }
            }
        }
예제 #4
0
        public IMessage DeCacheMessage(IMessage message, PayloadReader pr, ref bool isCached, ref IMessage CachedMessage, MessageHandler msgHandler)
        {
            lock (Messages)
            {
                uint Id = msgHandler.GetMessageId(message.GetType());
                isCached = pr.ReadBool();

                if (!Messages.TryGetValue(Id, out CachedMessage) && !isCached)
                {
                    CachedMessage = (IMessage)Activator.CreateInstance(message.GetType());
                    Messages.Add(Id, (IMessage)Activator.CreateInstance(message.GetType()));

                    FieldInfo[] _fields       = message.GetType().GetFields();
                    FieldInfo[] _cachedFields = CachedMessage.GetType().GetFields();

                    for (int i = 0; i < _fields.Length; i++)
                    {
                        //de-serialize objects
                        int oldPos = pr.Offset;
                        _fields[i].SetValue(message, pr.ReadObject());
                        pr.Offset = oldPos;
                        _fields[i].SetValue(Messages[Id], pr.ReadObject());
                    }
                    return(message);
                }

                FieldInfo[] fields      = message.GetType().GetFields();
                FieldInfo[] cacheFields = CachedMessage.GetType().GetFields();

                for (int i = 0; i < fields.Length; i++)
                {
                    MessageCacheType CacheType = (MessageCacheType)pr.ReadByte();
                    object           NewValue  = null;

                    switch (CacheType)
                    {
                    case MessageCacheType.Bool:
                    {
                        NewValue = pr.ReadBool();
                        break;
                    }

                    case MessageCacheType.Byte:
                    {
                        NewValue = pr.ReadByte();
                        break;
                    }

                    case MessageCacheType.ByteArray:
                    {
                        uint size = pr.ReadUInteger();
                        NewValue = pr.ReadBytes((int)size);
                        break;
                    }

                    case MessageCacheType.Decimal:
                    {
                        NewValue = pr.ReadDecimal();
                        break;
                    }

                    case MessageCacheType.Double:
                    {
                        NewValue = pr.ReadDouble();
                        break;
                    }

                    case MessageCacheType.Float:
                    {
                        NewValue = pr.ReadFloat();
                        break;
                    }

                    case MessageCacheType.Long:
                    {
                        NewValue = pr.ReadLong();
                        break;
                    }

                    case MessageCacheType.NULL:
                    {
                        NewValue = null;
                        break;
                    }

                    case MessageCacheType.OtherObject:
                    {
                        NewValue = pr.ReadObject();
                        break;
                    }

                    case MessageCacheType.Short:
                    {
                        NewValue = pr.ReadShort();
                        break;
                    }

                    case MessageCacheType.String:
                    {
                        NewValue = pr.ReadString();
                        break;
                    }

                    case MessageCacheType.Integer:
                    {
                        NewValue = pr.ReadInteger();
                        break;
                    }

                    case MessageCacheType.UInteger:
                    {
                        NewValue = pr.ReadUInteger();
                        break;
                    }

                    case MessageCacheType.ULong:
                    {
                        NewValue = pr.ReadULong();
                        break;
                    }

                    case MessageCacheType.UShort:
                    {
                        NewValue = pr.ReadUShort();
                        break;
                    }

                    case MessageCacheType.NotUpdated:
                    {
                        NewValue = cacheFields[i].GetValue(CachedMessage);
                        break;
                    }
                    }
                    fields[i].SetValue(message, NewValue);
                }
            }
            return(message);
        }