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