Beispiel #1
0
        public static Int32 GetChecksum(HatCharacter chr)
        {
            Int32 sum = 0;

            /*AddValue( sum, chr.MonsterKills );
             * AddValue( sum, chr.PlayerKills );
             * AddValue( sum, chr.TotalKills );
             * AddValue( sum, chr.DeathCount );
             * AddValue( sum, (int)chr.Money );
             * AddValue( sum, chr.MonsterKills );
             * AddValue( sum, chr.Body );
             * AddValue( sum, chr.React );
             * AddValue( sum, chr.Mind );
             * AddValue( sum, chr.Spirit );
             * AddValue( sum, chr.Spells );
             * AddValue( sum, chr.ActiveSpell );
             * AddValue( sum, chr.FireExp );
             * AddValue( sum, chr.WaterExp );
             * AddValue( sum, chr.AirExp );
             * AddValue( sum, chr.EarthEx );
             *
             * sum += ( ( chr.AstralEx & 0x000000ff ) >> 0 ) << 1;
             * sum += ( ( chr.AstralEx & 0x0000ff00 ) >> 8 ) << 1;
             * sum += ( ( chr.AstralEx & 0x00ff0000 ) >> 16 );*/

            return(sum);
        }
Beispiel #2
0
        public static Int32 GetChecksum(HatCharacter chr)
        {
            Int32 sum = 0;
            /*AddValue( sum, chr.MonsterKills );
            AddValue( sum, chr.PlayerKills );
            AddValue( sum, chr.TotalKills );
            AddValue( sum, chr.DeathCount );
            AddValue( sum, (int)chr.Money );
            AddValue( sum, chr.MonsterKills );
            AddValue( sum, chr.Body );
            AddValue( sum, chr.React );
            AddValue( sum, chr.Mind );
            AddValue( sum, chr.Spirit );
            AddValue( sum, chr.Spells );
            AddValue( sum, chr.ActiveSpell );
            AddValue( sum, chr.FireExp );
            AddValue( sum, chr.WaterExp );
            AddValue( sum, chr.AirExp );
            AddValue( sum, chr.EarthEx );

            sum += ( ( chr.AstralEx & 0x000000ff ) >> 0 ) << 1;
            sum += ( ( chr.AstralEx & 0x0000ff00 ) >> 8 ) << 1;
            sum += ( ( chr.AstralEx & 0x00ff0000 ) >> 16 );*/

            return sum;
        }
        private byte[] serverEntrance(HatCharacter chr)
        {
            throw new NotImplementedException();

            using (var mem = new MemoryStream()) {
                int sectionSum = 0;
                var bw         = new BinaryWriter(mem);

                bw.Write(0x04507989);

                ///making 0xAAAAAAAA section
                Stream csec = new MemoryStream();
                {
                    csec.SetLength(0x34);
                    var wr = new BinaryWriter(csec);

                    ///write character identify
                    wr.Write(chr.IDs[0]);
                    wr.Write(chr.IDs[1]);
                    wr.Write(chr.HatID);

                    ///writing character name

                    wr.Write(chr.Nickname.ToCharArray());
                    if (String.IsNullOrEmpty(chr.Clan) == false)
                    {
                        wr.Write('|');
                        wr.Write(chr.Clan.ToCharArray());
                    }
                    wr.Write((byte)0x00);

                    wr.BaseStream.Seek(0x2c, SeekOrigin.Begin);

                    ///writing character info
                    wr.Write(chr.Sex);
                    wr.Write(chr.Pic);
                    wr.Write(chr.Unknown1);
                    wr.Write(chr.Unknown2);
                    wr.Write(chr.Unknown3);

                    sectionSum = ChecksumHelper.GetStreamChecksum(mem);
                }
                ///writing 0xAAAAAAAA section encrypted
                int key = 0x0;
                csec = CryptHelper.CharacterStreamCrypt(csec, key);
                var br = new BinaryReader(csec);

                bw.Write(0xAAAAAAAA);
                bw.Write(csec.Length);
                bw.Write(key << 16);
                bw.Write(sectionSum);
                bw.Write(br.ReadBytes((int)csec.Length));

                csec.Dispose();
            }

            return(new byte[0]);
        }
        private byte[] serverEntrance(HatCharacter chr)
        {
            throw new NotImplementedException();

            using (var mem = new MemoryStream()) {
                int sectionSum = 0;
                var bw = new BinaryWriter(mem);

                bw.Write(0x04507989);

                ///making 0xAAAAAAAA section
                Stream csec = new MemoryStream();
                {
                    csec.SetLength(0x34);
                    var wr = new BinaryWriter(csec);

                    ///write character identify
                    wr.Write(chr.IDs[0]);
                    wr.Write(chr.IDs[1]);
                    wr.Write(chr.HatID);

                    ///writing character name

                    wr.Write(chr.Nickname.ToCharArray());
                    if (String.IsNullOrEmpty(chr.Clan) == false) {
                        wr.Write('|');
                        wr.Write(chr.Clan.ToCharArray());
                    }
                    wr.Write((byte) 0x00);

                    wr.BaseStream.Seek(0x2c, SeekOrigin.Begin);

                    ///writing character info
                    wr.Write(chr.Sex);
                    wr.Write(chr.Pic);
                    wr.Write(chr.Unknown1);
                    wr.Write(chr.Unknown2);
                    wr.Write(chr.Unknown3);

                    sectionSum = ChecksumHelper.GetStreamChecksum(mem);
                }
                ///writing 0xAAAAAAAA section encrypted
                int key = 0x0;
                csec = CryptHelper.CharacterStreamCrypt(csec, key);
                var br = new BinaryReader(csec);

                bw.Write(0xAAAAAAAA);
                bw.Write(csec.Length);
                bw.Write(key << 16);
                bw.Write(sectionSum);
                bw.Write(br.ReadBytes((int) csec.Length));

                csec.Dispose();
            }

            return new byte[0];
        }
        private void serverInfoListener(object parameters)
        {
            GameServer srv = null;

            object[] param = null;
            Socket handler = null;
            byte[] buf = null;
            try {
                param = (object[]) parameters;
                handler = (Socket) param[0];
                buf = (byte[]) param[1];
            } catch (Exception ex) {
                LogEvent(EventType.ERROR, ex, "server handler has incorrect parameters");
                if (handler != null) {
                    handler.Close(5);
                }
                return;
            }

            uint packetLength, unknown1;
            while (true) {
                using (var mem = new MemoryStream(buf)) {
                    mem.Seek(0, SeekOrigin.Begin);
                    var binRead = new BinaryReader(mem);

                    packetLength = binRead.ReadUInt32();
                    unknown1 = binRead.ReadUInt32();

                    var decoded = new byte[packetLength];

                    Buffer.BlockCopy(buf,
                                     (int) binRead.BaseStream.Position,
                                     decoded, 0, (int) packetLength);
                    Console.WriteLine("recieved packet");
                    decoded = NetworkHelper.PacketDecoding(decoded);
                    NetworkHelper.DumpArray(Console.OpenStandardOutput(), decoded);

                    using (var mstr = new MemoryStream(decoded)) {
                        var br = new BinaryReader(mstr);
                        byte packetID = br.ReadByte();

                        switch (packetID) {
                                /// bad code warning!
                                /// section below contains processing of 2 in series
                            case 0xD1: {
                                //ident server
                                br.BaseStream.Seek(5, SeekOrigin.Begin);
                                byte length = br.ReadByte();
                                br.BaseStream.Seek(1, SeekOrigin.Current);
                                string addr = Encoding.Default.GetString(br.ReadBytes(length));
                                string[] arr = addr.Split(':');
                                var buffer = new byte[0x8e];
                                EndPoint ep = new IPEndPoint(IPAddress.Parse(arr[0]), Int32.Parse(arr[1]));

                                srv = new GameServer();
                                srv.EndPoint = ep;
                                srv.Code = ep.ToString();

                                handler.Send(PrepareMessageToSend(serverWelcome()));

                                break;
                            }
                            case 0xd2: {
                                if (srv == null) {
                                    break;
                                }
                                byte pID = br.ReadByte();

                                byte pcount = br.ReadByte();
                                byte difficulty = br.ReadByte();
                                byte srvType = br.ReadByte();
                                byte mapSize = br.ReadByte();

                                if (pcount == 0xff && difficulty == 0xff && srvType == 0xff && mapSize == 0xff) {
                                    lock (registeredServers) {
                                        handler.Close(5);
                                        registeredServers.Remove(srv);
                                        srv = null;
                                        return;
                                        break;
                                    }
                                }

                                byte ln = br.ReadByte();

                                br.BaseStream.Seek(1, SeekOrigin.Current);
                                string mapName = Encoding.Default.GetString(br.ReadBytes(ln));

                                int idx = -1;
                                if (registeredServers.Contains(srv)) {
                                    idx = registeredServers.IndexOf(srv);
                                }
                                srv.PlayersCount = pcount;
                                srv.ServerType = (ServerType) srvType;
                                srv.Map = new GameMap();
                                srv.Map.Difficulty = (Difficulty) difficulty;
                                srv.Map.Name = mapName;
                                srv.Map.Height = srv.Map.Width = mapSize;

                                if (idx == -1) {
                                    registeredServers.Add(srv);
                                }
                                else {
                                    registeredServers[idx] = srv;
                                }
                                handler.Send(PrepareMessageToSend(null));
                                break;
                            }
                            case 0xd4: // arena results
                            {
                                LogEvent(EventType.DEBUG, "arena results not supported");
                                handler.Send(PrepareMessageToSend(null));

                                break;
                            }
                            case 0xE0: {
                                // chr_recv update character

                                ///structure:
                                /// 0x00 - packet type
                                /// 0x01 - size
                                /// 0x02 - charID 1
                                /// 0x06 - charID 2
                                /// 0x0A - log_size
                                /// 0x0B - chr_size
                                /// 0x12 - characterData
                                /// 0x12 + chrSize - log_name

                                byte size = br.ReadByte();
                                if (size == 1) {
                                    break;
                                }
                                Int32 characterID1 = br.ReadInt32();
                                Int32 characterID2 = br.ReadInt32();
                                Int32 logSize = br.ReadInt32();

                                byte chr_size = br.ReadByte();

                                byte[] chrData = br.ReadBytes(chr_size);
                                string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize));

                                var chr = new HatCharacter(); // stub

                                if (chr == null) {
                                    chr = new HatCharacter();

                                    chr.IDs[0] = characterID1;
                                    chr.IDs[1] = characterID2;

                                    chr.CharacterData = chrData;
                                }
                                else {
                                    chr.CharacterData = chrData;
                                }

                                //saving

                                break;
                            }
                            case 0xcf: // chr_recv return character
                            {
                                ///structure:
                                /// 0x00 - packet type
                                /// 0x01 - size
                                /// 0x02 - charID 1
                                /// 0x06 - charID 2
                                /// 0x0A - log_size
                                /// 0x0B - chr_size
                                /// 0x12 - characterData
                                /// 0x12 + chrSize - log_name

                                byte size = br.ReadByte();
                                Int32 characterID1 = br.ReadInt32();
                                Int32 characterID2 = br.ReadInt32();
                                Int32 logSize = br.ReadInt32();

                                byte chr_size = br.ReadByte();

                                byte[] chrData = br.ReadBytes(chr_size);
                                string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize));

                                var chr = new HatCharacter();

                                if (chr == null) {
                                    chr = new HatCharacter();

                                    chr.IDs[0] = characterID1;
                                    chr.IDs[1] = characterID2;

                                    chr.CharacterData = chrData;
                                }
                                else {
                                    chr.CharacterData = chrData;
                                }

                                //save

                                handler.Send(PrepareMessageToSend(simpleServerEntrance(loginIP)));

                                break;
                            }
                            case 0xd8: // accept character
                            case 0xd9: // reject character
                            case 0xE1: // server reconnect
                            case 0x64:
                            default: //keep alive
                                Console.WriteLine("default response send");

                                handler.Send(PrepareMessageToSend(null));
                                break;
                        }
                    }
                }
                try {
                    handler.Receive(buf);
                } catch {
                    return;
                }
            }
        }
Beispiel #6
0
        private object ClientPacketParse(byte[] decoded, Socket handler)
        {
            object ret = null;

            using (MemoryStream mem = new MemoryStream(decoded)) {
                BinaryReader br       = new BinaryReader(mem);
                byte         packetID = br.ReadByte();

                switch (packetID)
                {
                case 0xc9:     //login
                {
                    LoginPacket lp = new LoginPacket();

                    byte loginlen = br.ReadByte();
                    lp.GameType = (GameType)br.ReadInt16();
                    byte loginOffset       = br.ReadByte();
                    byte credentialsLength = br.ReadByte();

                    mem.Seek(loginOffset, SeekOrigin.Begin);

                    lp.login    = Encoding.Default.GetString(br.ReadBytes(loginlen));
                    lp.password = Encoding.Default.GetString(br.ReadBytes(credentialsLength - loginlen));

                    Console.WriteLine("user logging in");
                    Console.WriteLine("GameType: {0}", lp.GameType);
                    Console.WriteLine("Login: {0}", lp.login);
                    Console.WriteLine("Password: {0}\n", lp.password);
                    return(lp);
                }

                case 0x4e:     //check nickname
                {
                    br.BaseStream.Seek(5, SeekOrigin.Begin);
                    byte length = br.ReadByte();
                    br.BaseStream.Seek(1, SeekOrigin.Current);
                    string nickname = Encoding.Default.GetString(br.ReadBytes(length));
                    return(check_nickname(nickname));
                }

                case 0xC8: {
                    return(Client_operation.M_GET_SERVER_LIST);
                }

                case 0xD1: {
                    return(ParseState.SERVER_CONNECTED);
                }

                case 0xCB: {
                    // new character to server

                    //                BODY  MIND  SKILL COLOR
                    //                 |     |      |     |
                    // ?? SIZE ID1 ID2 ?? ?? ?? ?? ?? ?? ?? ?? NICK SRV_IP
                    //  |                 |     |     |      |
                    // SIG              REACT SPIRIT PIC  NICK_SIZE
                    // 1   +4   +4  +4 +1 +1 +1 +1 +1 +1 +1 +1

                    Int32  size     = br.ReadInt32();
                    Int32  id1      = br.ReadInt32();
                    Int32  id2      = br.ReadInt32();
                    byte   body     = br.ReadByte();
                    byte   react    = br.ReadByte();
                    byte   mind     = br.ReadByte();
                    byte   spirit   = br.ReadByte();
                    byte   skill    = br.ReadByte();
                    byte   picture  = br.ReadByte();
                    byte   color    = br.ReadByte();
                    byte   nickSize = br.ReadByte();
                    string nickName = Encoding.Default.GetString(br.ReadBytes(nickSize));
                    string clanName = "";
                    string srvIP    = Encoding.Default.GetString(br.ReadBytes(size - (int)br.BaseStream.Position));

                    string[] nick = nickName.Split('|');
                    nickName = nick[0];

                    var chr = new HatCharacter();
                    chr.IDs[0]     = id1;
                    chr.IDs[1]     = id2;
                    chr.Clan       = clanName;
                    chr.Color      = color;
                    chr.Mind       = mind;
                    chr.Nickname   = nickName;
                    chr.ParentUser = (HatUser)Thread.GetData(Thread.GetNamedDataSlot("currentUser"));

                    bool hasPic = Array.Exists(Consts.Pics, pic => pic == picture);

                    if (hasPic)
                    {
                        chr.Pic = picture;
                    }
                    else
                    {
                        chr.Pic = Consts.Pics[0];
                    }

                    chr.React  = react;
                    chr.Skill  = skill;
                    chr.Spirit = spirit;

                    chr.SrvIP = srvIP;

                    //save character
                    throw new NotImplementedException();
                    break;
                }

                case 0xCA: {
                    //get character
                    Int32 id1, id2;

                    id1 = br.ReadInt32();
                    id2 = br.ReadInt32();


                    break;
                }

                default:
                    ret = ParseState.UNKNOWN_PACKET;

                    break;
                }
            }

            return(ret);
        }
        private void serverInfoListener(object parameters)
        {
            GameServer srv = null;

            object[] param   = null;
            Socket   handler = null;

            byte[] buf = null;
            try {
                param   = (object[])parameters;
                handler = (Socket)param[0];
                buf     = (byte[])param[1];
            } catch (Exception ex) {
                LogEvent(EventType.ERROR, ex, "server handler has incorrect parameters");
                if (handler != null)
                {
                    handler.Close(5);
                }
                return;
            }

            uint packetLength, unknown1;

            while (true)
            {
                using (var mem = new MemoryStream(buf)) {
                    mem.Seek(0, SeekOrigin.Begin);
                    var binRead = new BinaryReader(mem);

                    packetLength = binRead.ReadUInt32();
                    unknown1     = binRead.ReadUInt32();

                    var decoded = new byte[packetLength];

                    Buffer.BlockCopy(buf,
                                     (int)binRead.BaseStream.Position,
                                     decoded, 0, (int)packetLength);
                    Console.WriteLine("recieved packet");
                    decoded = NetworkHelper.PacketDecoding(decoded);
                    NetworkHelper.DumpArray(Console.OpenStandardOutput(), decoded);

                    using (var mstr = new MemoryStream(decoded)) {
                        var  br       = new BinaryReader(mstr);
                        byte packetID = br.ReadByte();

                        switch (packetID)
                        {
                        /// bad code warning!
                        /// section below contains processing of 2 in series
                        case 0xD1: {
                            //ident server
                            br.BaseStream.Seek(5, SeekOrigin.Begin);
                            byte length = br.ReadByte();
                            br.BaseStream.Seek(1, SeekOrigin.Current);
                            string   addr   = Encoding.Default.GetString(br.ReadBytes(length));
                            string[] arr    = addr.Split(':');
                            var      buffer = new byte[0x8e];
                            EndPoint ep     = new IPEndPoint(IPAddress.Parse(arr[0]), Int32.Parse(arr[1]));

                            srv          = new GameServer();
                            srv.EndPoint = ep;
                            srv.Code     = ep.ToString();

                            handler.Send(PrepareMessageToSend(serverWelcome()));

                            break;
                        }

                        case 0xd2: {
                            if (srv == null)
                            {
                                break;
                            }
                            byte pID = br.ReadByte();

                            byte pcount     = br.ReadByte();
                            byte difficulty = br.ReadByte();
                            byte srvType    = br.ReadByte();
                            byte mapSize    = br.ReadByte();

                            if (pcount == 0xff && difficulty == 0xff && srvType == 0xff && mapSize == 0xff)
                            {
                                lock (registeredServers) {
                                    handler.Close(5);
                                    registeredServers.Remove(srv);
                                    srv = null;
                                    return;

                                    break;
                                }
                            }

                            byte ln = br.ReadByte();

                            br.BaseStream.Seek(1, SeekOrigin.Current);
                            string mapName = Encoding.Default.GetString(br.ReadBytes(ln));

                            int idx = -1;
                            if (registeredServers.Contains(srv))
                            {
                                idx = registeredServers.IndexOf(srv);
                            }
                            srv.PlayersCount   = pcount;
                            srv.ServerType     = (ServerType)srvType;
                            srv.Map            = new GameMap();
                            srv.Map.Difficulty = (Difficulty)difficulty;
                            srv.Map.Name       = mapName;
                            srv.Map.Height     = srv.Map.Width = mapSize;

                            if (idx == -1)
                            {
                                registeredServers.Add(srv);
                            }
                            else
                            {
                                registeredServers[idx] = srv;
                            }
                            handler.Send(PrepareMessageToSend(null));
                            break;
                        }

                        case 0xd4:     // arena results
                        {
                            LogEvent(EventType.DEBUG, "arena results not supported");
                            handler.Send(PrepareMessageToSend(null));

                            break;
                        }

                        case 0xE0: {
                            // chr_recv update character

                            ///structure:
                            /// 0x00 - packet type
                            /// 0x01 - size
                            /// 0x02 - charID 1
                            /// 0x06 - charID 2
                            /// 0x0A - log_size
                            /// 0x0B - chr_size
                            /// 0x12 - characterData
                            /// 0x12 + chrSize - log_name

                            byte size = br.ReadByte();
                            if (size == 1)
                            {
                                break;
                            }
                            Int32 characterID1 = br.ReadInt32();
                            Int32 characterID2 = br.ReadInt32();
                            Int32 logSize      = br.ReadInt32();

                            byte chr_size = br.ReadByte();

                            byte[] chrData = br.ReadBytes(chr_size);
                            string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize));

                            var chr = new HatCharacter();     // stub

                            if (chr == null)
                            {
                                chr = new HatCharacter();

                                chr.IDs[0] = characterID1;
                                chr.IDs[1] = characterID2;

                                chr.CharacterData = chrData;
                            }
                            else
                            {
                                chr.CharacterData = chrData;
                            }

                            //saving

                            break;
                        }

                        case 0xcf:     // chr_recv return character
                        {
                            ///structure:
                            /// 0x00 - packet type
                            /// 0x01 - size
                            /// 0x02 - charID 1
                            /// 0x06 - charID 2
                            /// 0x0A - log_size
                            /// 0x0B - chr_size
                            /// 0x12 - characterData
                            /// 0x12 + chrSize - log_name

                            byte  size         = br.ReadByte();
                            Int32 characterID1 = br.ReadInt32();
                            Int32 characterID2 = br.ReadInt32();
                            Int32 logSize      = br.ReadInt32();

                            byte chr_size = br.ReadByte();

                            byte[] chrData = br.ReadBytes(chr_size);
                            string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize));

                            var chr = new HatCharacter();

                            if (chr == null)
                            {
                                chr = new HatCharacter();

                                chr.IDs[0] = characterID1;
                                chr.IDs[1] = characterID2;

                                chr.CharacterData = chrData;
                            }
                            else
                            {
                                chr.CharacterData = chrData;
                            }

                            //save

                            handler.Send(PrepareMessageToSend(simpleServerEntrance(loginIP)));

                            break;
                        }

                        case 0xd8:   // accept character
                        case 0xd9:   // reject character
                        case 0xE1:   // server reconnect
                        case 0x64:
                        default:     //keep alive
                            Console.WriteLine("default response send");

                            handler.Send(PrepareMessageToSend(null));
                            break;
                        }
                    }
                }
                try {
                    handler.Receive(buf);
                } catch {
                    return;
                }
            }
        }