public static void DecodeShit() { byte[] buff1 = { 0x1b, 0x0d, 0x0e, 0x39, 0x62, 0x2c, 0x1a, 0x5b, 0x25, 0x2b, 0x0d, 0x08, 0x0b, 0x34, 0x15, 0x25, 0x7b, 0x15, 0x0f, 0x2a, 0x35, 0x23, 0x1d, 0x22, 0x20, 0x65, 0x18, 0x2e, 0x05, 0x31, 0x54, 0x0f, 0x16, 0x10, 0x5d, 0x25, 0x2b, 0x3d }; byte[] buff2 = { 0xee, 0x00, 0x00, 0xe7, 0xe9, 0x72, 0xcb, 0x7c, 0x6f, 0x3a, 0x17, 0x54, 0xe1, 0xab, 0x6f, 0xdc, 0x81, 0xb3, 0x86, 0x56, 0x4d, 0xd7, 0x0a, 0xc3, 0xbb, 0xea, 0xc1, 0xdc, 0x75, 0x95, 0xbc, 0x44, 0x87, 0x57, 0x02, 0xd4, 0xac, 0xd4, 0xb8, 0x95, 0x43, 0x6c, 0xa7, 0x00, 0x3e, 0x84, 0xcf, 0x09, 0x5c, 0xb9, 0xfa, 0xc0, 0x8b, 0x20, 0x26, 0x69, 0xdf, 0x55, 0x50, 0xbf, 0x7e, 0x03, 0x9f, 0x3f, 0xad, 0xad, 0x32, 0x76, 0x07, 0xdb, 0xcc, 0xdc, 0xe3, 0x71, 0x7f, 0x9a, 0x0e, 0xd5, 0x93, 0x96, 0x4a, 0xc7, 0xb9, 0xc8, 0x6b, 0xf0, 0x5a, 0x25, 0xb6, 0xfc, 0x8a, 0x9d, 0xec, 0x8d, 0x10, 0x9a, 0xc7, 0x43, 0xfc, 0x2b, 0xfa, 0xa4, 0x09, 0xa4, 0xf8, 0x7e, 0x4d, 0xe0, 0x2c, 0x61, 0xbc, 0x2a, 0xc4, 0xe8, 0x33, 0x91, 0x16, 0xbe, 0x5d, 0x61, 0xc4, 0x86, 0xfe, 0xa5, 0xa9, 0x5c, 0x97, 0xa8, 0xd7, 0xfa, 0xc0, 0x93, 0xcb, 0xd1, 0x64, 0x3a, 0x15, 0x3e, 0x65, 0xb0, 0xc9, 0xf0, 0xfe, 0x2d, 0x63, 0xa7, 0x19, 0xbb, 0xf2, 0xdb, 0x7f, 0xba, 0xaf, 0x9a, 0xf3, 0x7b, 0xb7, 0xc2, 0x92, 0xb3, 0xe6, 0x41, 0x7a, 0xb7, 0x42, 0x3d, 0x36, 0x85, 0x77, 0xdc, 0xaf, 0xd8, 0x26, 0x1c, 0x72, 0x5d, 0x24, 0x15, 0x32, 0x78, 0x3f, 0x85, 0xff, 0xab, 0xb4, 0xec, 0xcb, 0xba, 0x10, 0xfd, 0xd3, 0xf8, 0xd5, 0xa4, 0x15, 0x7b, 0x44, 0x5b, 0x4e, 0x44, 0xa6, 0xb6, 0x2e, 0x07, 0x0d, 0xd7, 0x35, 0x22, 0x56, 0xc6, 0x26, 0x4f, 0x13, 0x70, 0x89, 0x0e, 0x44, 0x9d, 0xa2, 0xe4, 0x32, 0x2f, 0xae, 0x53, 0x5d, 0xfc, 0xa2, 0xca, 0xc5, 0x08, 0x33, 0xf4, 0xa8, 0xc6, 0x4a, 0xe5, 0xc9, 0x03, 0xb8, 0xac, 0x60, 0xe3, 0xcf, 0x1d, 0x2f, 0xb1, 0xb5, 0x5a, 0x73, 0x9f, 0x08, 0x81, 0x83, 0xda, 0xd3, 0xd8, 0xbf, 0x82, 0x70, 0xb0, 0x9b, 0x50, 0x95, 0x80, 0x59, 0x37, 0x88, 0x53, 0x8d, 0xbb, 0xd3, 0xae, 0x5b, 0xe6, 0xa2, 0xe8, 0x66, 0xde, 0x03, 0xa4, 0xcd, 0x40, 0x79, 0xab, 0x47, 0x68, 0x90, 0x62, 0xa1, 0x8c, 0x8a, 0x9c, 0xfe, 0xe6, 0x21, 0xef, 0xb4, 0xbe, 0xf8, 0x6d, 0x6a, 0x3c, 0x5c, 0xc7, 0xd6, 0xf8, 0xb6, 0x74, 0xb7, 0x2e, 0xee, 0xa1, 0xae, 0x98, 0xcf, 0x61, 0x83, 0xfe, 0xeb, 0x91, 0x90, 0x61, 0xa1, 0xd4, 0xad, 0x4b, 0x1b, 0x9a, 0x0a, 0xe4, 0xc6, 0x80, 0x86, 0x17, 0xed, 0x46, 0x06, 0xba, 0x55, 0xfe, 0x9c, 0x6d, 0x40, 0x19, 0x30, 0x8b, 0x16, 0x50, 0x5d, 0x0e, 0x8f, 0xbe, 0x1b, 0xba, 0x94, 0xe4, 0x49, 0x66, 0x8e, 0x53, 0x43, 0xd9, 0x9c, 0x82, 0x75, 0x66, 0x0c, 0x3a, 0x23, 0xb5, 0x8c, 0xd4, 0xaf, 0xca, 0x5d, 0x15, 0x4d, 0xf5, 0xba, 0xe3, 0x12, 0x73, 0x51, 0x01, 0xa0, 0xd5, 0xd0, 0x14, 0xb8, 0x27, 0x17, 0xff, 0x16, 0x0c, 0xfc, 0x64, 0xba, 0x9e, 0x11, 0xf1, 0xf8, 0x18, 0xcd, 0x67, 0xe7, 0x50, 0x77, 0xd1, 0xc3, 0x5a, 0x81, 0x67, 0x14, 0xdf, 0x56, 0xd0, 0x6c, 0xa6, 0x67, 0xe0, 0x71, 0x8e, 0xa3, 0xca, 0xb6, 0x5a, 0xae, 0x28, 0x26, 0xdf, 0x8c, 0x2f, 0xa9, 0xcb, 0x3b, 0x7b, 0xcc, 0xbb, 0x0f, 0x19, 0xa7, 0xe3, 0xc1, 0x8c, 0x13, 0x76, 0x9b, 0x45, 0xbe, 0x84, 0xd8, 0x00, 0xf9, 0x38, 0x25, 0x31, 0x51, 0xa3, 0x8b, 0x83, 0x27, 0x06, 0x6a, 0x6b, 0x06, 0xee, 0x29, 0x87, 0x54, 0x0e, 0xb7, 0x30, 0x2b, 0x1e, 0xc5, 0x97, 0xc0, 0xd6, 0x55, 0x29, 0x4e, 0x25, 0x31, 0xac, 0x15, 0x88, 0x57, 0x86, 0x66, 0x68, 0xbf, 0xcb, 0xb8, 0xbd, 0x65, 0x1e, 0xec, 0xda, 0x02, 0x0c, 0x94, 0xf5, 0x14, 0x50, 0x28, 0x70, 0x60, 0x67, 0xa0, 0x7f, 0xd9, 0xf4, 0x90, 0xeb, 0x42, 0xcd, 0xe5, 0x63, 0xac, 0x32, 0x4d, 0x02, 0xa3, 0x01, 0xc2, 0xa2, 0x13, 0x83, 0x77, 0xf8, 0x8e, 0xdc, 0xc4, 0x9e, 0xfd, 0x34, 0x1c, 0xb3, 0x4c, 0x7e, 0xc7, 0x01, 0xea, 0x1b, 0xeb, 0x8b, 0xdb, 0xae, 0x63, 0x42, 0x06, 0x5d, 0x07, 0x26, 0x8a, 0xc7, 0xf8, 0x8c, 0xea, 0x9c, 0x1f, 0xdd, 0xcf, 0x5d, 0xdb, 0xb6, 0x79, 0x98, 0xee, 0xa4, 0x4a, 0x40, 0x5e, 0x2b, 0x6c, 0x3b, 0x04, 0x2f, 0xf0, 0x2b, 0x18, 0xf8, 0xa8, 0xae, 0x5b, 0x7d, 0x5c, 0x01, 0x67, 0x5a, 0x34, 0xbd, 0x7a, 0x23, 0x95, 0x6e, 0x14, 0xe2, 0xae, 0xa1, 0xbd, 0x3a, 0x9d, 0x9b, 0x1e, 0x72, 0xdf, 0x1c, 0xa2, 0x59, 0x67, 0xf6, 0x89, 0x39, 0x86, 0x2a, 0xc8, 0x80, 0x35, 0xfb, 0x7e, 0x92, 0x22, 0x85, 0x3e, 0x58, 0xbd, 0xd5, 0x26, 0x26, 0xeb, 0x0e, 0x39, 0x50, 0xca, 0x7f, 0x09, 0xb5, 0x98, 0x0a, 0x40, 0x44, 0x9f, 0xaf, 0xbc, 0x79, 0x78, 0x89, 0x2f, 0x33, 0x1f, 0xe9, 0x2c, 0x4d, 0xa5, 0xcc, 0x5f, 0xb4, 0x59, 0xfc, 0x78, 0xcb, 0xc5, 0xc4, 0x1f, 0xd4, 0xcd, 0x5a, 0x04, 0xc3, 0x9a, 0x31, 0xcf, 0x5a, 0x41, 0xb6, 0x24, 0x46, 0xd0, 0xdf, 0x10, 0x73, 0xdc, 0x75, 0x87, 0x0d, 0x64, 0xe0, 0xa8, 0xf2, 0xd1, 0x3e, 0x6c, 0xa1, 0x90, 0x5f, 0x34, 0xd3, 0x15, 0x60, 0xaf, 0x3a, 0x8b, 0xd2, 0x8c, 0xf6, 0xe6, 0x4e, 0x52, 0xdc, 0x82, 0x29, 0x73, 0x0b, 0xca, 0x10, 0xfc, 0x31, 0x08, 0xb0, 0x03, 0xa9, 0xc9, 0xc3, 0x62, 0x80, 0xb9, 0x12, 0xe1, 0xea, 0x7c, 0xe7, 0x1e, 0x1c, 0xd1, 0x05, 0x20, 0xdf, 0x67, 0xa1, 0x20, 0x45, 0x73, 0x27, 0xc1, 0x72, 0x67, 0x7e, 0xfe, 0x21, 0x72, 0x26, 0x39, 0xe9, 0x51, 0xfa, 0xc3, 0x81, 0xd0, 0x87, 0x80, 0x49, 0xe9, 0xce, 0xb8, 0x32, 0xb7, 0xcc, 0x2b }; byte[] buff3 = { 0xeb, 0x00, 0x00, 0xc8, 0x60, 0x80, 0x03, 0x77, 0xe4, 0x4a, 0x2f, 0xf8, 0x22, 0xaa, 0xea, 0xf5, 0xec, 0x0a, 0x2d, 0x82, 0xab, 0xc8, 0x19, 0x2d, 0xa5, 0x5d, 0xaa, 0x92, 0x22, 0x0c, 0xc4, 0xff, 0x5e, 0x48, 0x62, 0x77, 0x5d, 0x14, 0x08, 0xf3, 0x40, 0x25, 0xe6, 0x34, 0x0d, 0xe5, 0x48, 0xc8, 0x39, 0x2e, 0x51, 0x69, 0x69, 0x52, 0xb7, 0xbe, 0xd5, 0x60, 0x2b, 0x7a, 0x2a, 0x82, 0x26, 0x54, 0xb8, 0xcd, 0x96, 0x6f, 0x39, 0x10, 0x04, 0x25, 0x41, 0x1c, 0x50, 0xa8, 0x3d, 0x40, 0x27, 0x28, 0x1a, 0xf8, 0x05, 0x36, 0x8f, 0x50, 0xec, 0x68, 0xe3, 0xec, 0x7d, 0x43, 0xdd, 0x95, 0x7e, 0x91, 0x2e, 0x6a, 0x87, 0x18, 0x7c, 0x8f, 0x07, 0x9e, 0x42, 0x72, 0xaf, 0x19, 0x3a, 0x83, 0xec, 0x55, 0x22, 0x72, 0xe0, 0xa7, 0xa9, 0xd3, 0xab, 0x8e, 0x54, 0x45, 0xda, 0x1c, 0x3e, 0x68, 0xaf, 0x74, 0x26, 0x86, 0xce, 0xdb, 0xe6, 0x24, 0x87, 0x08, 0x94, 0x72, 0x9e, 0x79, 0x21, 0x5b, 0x66, 0x02, 0x52, 0x2e, 0x6f, 0xd4, 0xda, 0x7a, 0x9d, 0x80, 0xb0, 0xd3, 0xbb, 0x23, 0x79, 0xd2, 0x1c, 0x7b, 0xbc, 0xc7, 0x94, 0xfa, 0xbc, 0xdc, 0xeb, 0x5e, 0x6b, 0x5e, 0x20, 0x70, 0x67, 0xeb, 0x2d, 0x06, 0xea, 0x90, 0x8f, 0xd3, 0x20, 0xc4, 0xcc, 0x76, 0x1b, 0x11, 0xdd, 0x50, 0x66, 0x4c, 0xee, 0x58, 0xc2, 0x4b, 0x96, 0x62, 0xed, 0xd8, 0x90, 0x4e, 0x00, 0xfd, 0xd3, 0xab, 0x98, 0xaa, 0xe5, 0xca, 0x73, 0xe6, 0x7a, 0x65, 0x33, 0x5c, 0xdf, 0x8d, 0x5e, 0xda, 0xfc, 0xc6, 0x5e, 0x39, 0x6b, 0xf8, 0xc6, 0x10, 0x33, 0x7d, 0x1f, 0x85, 0x82, 0x62, 0x3e, 0xc1, 0xc6, 0x7a, 0xdb, 0x58, 0x19, 0x1b, 0x90, 0xf2, 0xf1, 0xd1, 0xfa, 0xb0, 0x54, 0x62, 0x40, 0xe2, 0x1b, 0x4e, 0x97, 0x63, 0x1d, 0x22, 0x81, 0xb2, 0x6b, 0x9e, 0xe3, 0xe5, 0x01 }; string gkey1 = "Cs2iIq"; //"h3D7Lc"; string validate = "EX4D=vn="; // "gI\"E\\mI5"; string gname1 = "lotrbme"; Program.LogControl("Decoding.CP1..." + gkey1 + validate); Console.WriteLine(" "); byte[] bytesGKEY = new byte[gkey1.Length * sizeof(char)]; System.Buffer.BlockCopy(gkey1.ToCharArray(), 0, bytesGKEY, 0, bytesGKEY.Length); byte[] bytesVAL = new byte[validate.Length * sizeof(char)]; System.Buffer.BlockCopy(validate.ToCharArray(), 0, bytesVAL, 0, bytesVAL.Length); byte[] decodedbuff1 = GSEncoding.Decode(bytesGKEY, bytesVAL, buff3, buff3.Length); Program.LogControl("Decoding.CP2..."); Program.LogBlue(System.Text.Encoding.UTF8.GetString(decodedbuff1)); }
private bool ParseRequest(SocketState state, string message) { string[] data = message.Split(new char[] { '\x00' }, StringSplitOptions.RemoveEmptyEntries); if (data.Length != 4 || !data[0].Equals("battlefield2", StringComparison.InvariantCultureIgnoreCase) || ( !data[1].Equals("battlefield2", StringComparison.InvariantCultureIgnoreCase) && !data[1].Equals("gslive", StringComparison.InvariantCultureIgnoreCase) ) ) { return(false); } string gamename = data[1].ToLowerInvariant(); string validate = data[2].Substring(0, 8); string filter = FixFilter(data[2].Substring(8)); string[] fields = data[3].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); Log(Category, String.Format("Received client request: {0}:{1}", ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port)); IQueryable <GameServer> servers = _report.Servers.ToList().Select(x => x.Value).Where(x => x.Valid).AsQueryable(); if (!String.IsNullOrWhiteSpace(filter)) { try { //Console.WriteLine(filter); servers = servers.Where(filter); //Console.WriteLine(servers.Count()); } catch (Exception e) { LogError(Category, "Error parsing filter"); LogError(Category, filter); LogError(Category, e.ToString()); } } // http://aluigi.altervista.org/papers/gslist.cfg byte[] key; if (gamename == "battlefield2") { key = DataFunctions.StringToBytes("hW6m9a"); } else if (gamename == "arma2oapc") { key = DataFunctions.StringToBytes("sGKWik"); } else { key = DataFunctions.StringToBytes("Xn221z"); } byte[] unencryptedServerList = PackServerList(state, servers, fields); byte[] encryptedServerList = GSEncoding.Encode(key, DataFunctions.StringToBytes(validate), unencryptedServerList, unencryptedServerList.LongLength); SendToClient(state, encryptedServerList); return(true); }
private void ParseRequest(SocketState state, string message) { // \u0001\u0012\0\u0001\u0003\u0001\0\0\0whamdowfr\0whamdowfr\0.Ts,PRe`(groupid is null) AND (groupid > 0)\0\\hostname\\gamemode\\hostname\\hostport\\mapname\\password\\gamever\\numplayers\\maxplayers\\score_\\teamplay\\gametype\\gamevariant\\groupid\\numobservers\\maxobservers\\modname\\moddisplayname\\modversion\\devmode\0\0\0\0\u0004 // auto request // \03\0\u0001\u0003\u0001\0\0\0whammer40kdcam\0whammer40kdc\0tMU`s.kv\0\0\0\0\0\u0004 // chat rooms request // \0j\0\u0001\u0003\u0001\0\0\0whammer40kdc\0whammer40kdc\0}%D}s)<}\0\\hostname\\numwaiting\\maxwaiting\\numservers\\numplayersname\0\0\0\0 string[] data = message.Split(new char[] { '\x00' }, StringSplitOptions.RemoveEmptyEntries); //if (!data[2].Equals("whamdowfr", StringComparison.OrdinalIgnoreCase)) // return false; string validate = data[4]; string filter = null; bool isAutomatch = false; if (validate.Length > 8) { filter = validate.Substring(8); validate = validate.Substring(0, 8); } else { //Log(Category, "ROOMS REQUEST - "+ data[2]); isAutomatch = data[2].EndsWith("am"); if (!isAutomatch) { SendRooms(state, validate); return; } } LoadLobbies() .ContinueWith(task => { if (task.Status != TaskStatus.RanToCompletion) { Console.WriteLine(task.Exception); return; } var servers = task.Result; string[] fields = data[5].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); byte[] unencryptedServerList = PackServerList(state, servers, fields, isAutomatch); byte[] encryptedServerList = GSEncoding.Encode(/*ChatServer.Gamekey,*/ "pXL838".ToAssciiBytes(), DataFunctions.StringToBytes(validate), unencryptedServerList, unencryptedServerList.LongLength); SendToClient(state, encryptedServerList); }); }
private void SendRooms(SocketState state, string validate) { // d whamdowfr whamdowfr fkT>_2Cr \hostname\numwaiting\maxwaiting\numservers\numplayersname //var bytes = @"\fieldcount\8\groupid\hostname\numplayers\maxwaiting\numwaiting\numservers\password\other\309\Europe\0\50\0\0\0\.maxplayers.0\408\Pros\0\50\0\0\0\.maxplayers.0\254\West Coast 2\0\50\0\0\0\.maxplayers.0\255\West Coast 3\0\50\0\0\0\.maxplayers.0\256\East Coast 1\0\50\0\0\0\.maxplayers.0\257\East Coast 2\0\50\0\0\0\.maxplayers.0\253\West Coast 1\0\50\0\0\0\.maxplayers.0\258\East Coast 3\0\50\0\0\0\.maxplayers.0\407\Newbies\0\50\0\0\0\.maxplayers.0\final\".ToAssciiBytes(); //127 0 0 1 207 55 var bytes = new List <byte>(); // was ip IPEndPoint remoteEndPoint = ((IPEndPoint)state.Socket.RemoteEndPoint); bytes.AddRange(remoteEndPoint.Address.GetAddressBytes()); byte[] value2 = BitConverter.GetBytes((ushort)6500); bytes.AddRange(BitConverter.IsLittleEndian ? value2.Reverse() : value2); bytes.Add(5); // fields count bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("hostname")); bytes.Add(0); bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("numwaiting")); bytes.Add(0); bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("maxwaiting")); bytes.Add(0); bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("numservers")); bytes.Add(0); bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("numplayersname")); bytes.Add(0); bytes.Add(0); // if (rooms == null) // { for (int i = 1; i <= 10; i++) { bytes.Add(81); var b2 = BitConverter.GetBytes((long)i); bytes.Add(b2[3]); bytes.Add(b2[2]); bytes.Add(b2[1]); bytes.Add(b2[0]); bytes.Add(0); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes("Room " + i)); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes(ChatServer.IrcDaemon.GetChannelUsersCount("#GPG!" + i).ToString())); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes("1000")); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes("1")); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes("20")); bytes.Add(0); } /*} * else * { * for (int i = 0; i < rooms.Length; i++) * { * var room = rooms[i]; * * bytes.Add(81); * * var b2 = BitConverter.GetBytes((long)i); * * bytes.Add(b2[3]); * bytes.Add(b2[2]); * bytes.Add(b2[1]); * bytes.Add(b2[0]); * * bytes.Add(0); * bytes.Add(0); * * bytes.Add(255); * bytes.AddRange(DataFunctions.StringToBytes(room.Name)); * bytes.Add(0); * * bytes.Add(255); * bytes.AddRange(DataFunctions.StringToBytes(room.Users.Count().ToString())); * bytes.Add(0); * * bytes.Add(255); * bytes.AddRange(DataFunctions.StringToBytes("2")); * bytes.Add(0); * * bytes.Add(255); * bytes.AddRange(DataFunctions.StringToBytes("1")); * bytes.Add(0); * * bytes.Add(255); * bytes.AddRange(DataFunctions.StringToBytes("20")); * bytes.Add(0); * } * }*/ bytes.AddRange(new byte[] { 0, 255, 255, 255, 255 }); var array = bytes.ToArray(); // var array = DataFunctions.StringToBytes("\u007f \0 \0 \u0001 \u0019 d \u0001 \0 hostname \0 \0 Q \u007f \0 \0 \u0001 \u0019 d ÿ Room 1 \0 \0 ÿÿÿÿ"); // working with Room 1 //var array = DataFunctions.StringToBytes("\u007f\0\0\u0001\u0019d\u0001\0hostname\0\0Q\u007f\0\0\u0001\u0019dÿRoom 1\0\0ÿÿÿÿ"); byte[] enc = GSEncoding.Encode(ChatServer.Gamekey, DataFunctions.StringToBytes(validate), array, array.LongLength); SendToClient(state, enc); }
private void SendAutomatchRooms(SocketState state, string validate, ChannelInfo[] rooms) { var bytes = new List <byte>(); // was ip IPEndPoint remoteEndPoint = ((IPEndPoint)state.Socket.RemoteEndPoint); bytes.AddRange(remoteEndPoint.Address.GetAddressBytes()); byte[] value2 = BitConverter.GetBytes((ushort)6500); bytes.AddRange(BitConverter.IsLittleEndian ? value2.Reverse() : value2); bytes.Add(3); // fields count bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("hostname")); bytes.Add(0); bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("numwaiting")); bytes.Add(0); bytes.Add(0); bytes.AddRange(DataFunctions.StringToBytes("maxwaiting")); bytes.Add(0); bytes.Add(0); // #GSP!<gamename>!X<encoded public IP><encoded public port><encoded private IP><encoded private port>X // JOIN #GSP!whammer40kdc!MJD13lhaPM // X<encoded public IP>X|<profile ID> foreach (var room in rooms) { var encodedEndPoint = room.Name.Split('!')[2]; //var localip0 = server.Get<string>("localip0"); //var localip1 = server.Get<string>("localip1"); //var localport = ushort.Parse(server.Get<string>("localport") ?? "0"); var queryPort = (ushort)6112; //(ushort)server.Get<int>("QueryPort"); var iPAddress = "192.168.1.31"; //server.Get<string>("localip4") ?? server.Get<string>("IPAddress"); bytes.Add(81); bytes.AddRange(IPAddress.Parse(iPAddress).GetAddressBytes()); bytes.AddRange(BitConverter.IsLittleEndian ? BitConverter.GetBytes(queryPort).Reverse() : BitConverter.GetBytes(queryPort)); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes(room.Name)); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes(room.Users.Count().ToString())); bytes.Add(0); bytes.Add(255); bytes.AddRange(DataFunctions.StringToBytes("2")); bytes.Add(0); } bytes.AddRange(new byte[] { 0, 255, 255, 255, 255 }); var array = bytes.ToArray(); byte[] enc = GSEncoding.Encode(ChatServer.Gamekey, DataFunctions.StringToBytes(validate), array, array.LongLength); SendToClient(state, enc); }
private bool ParseRequest(SocketState state, string message) { // \u0001\u0012\0\u0001\u0003\u0001\0\0\0whamdowfr\0whamdowfr\0.Ts,PRe`(groupid is null) AND (groupid > 0)\0\\hostname\\gamemode\\hostname\\hostport\\mapname\\password\\gamever\\numplayers\\maxplayers\\score_\\teamplay\\gametype\\gamevariant\\groupid\\numobservers\\maxobservers\\modname\\moddisplayname\\modversion\\devmode\0\0\0\0\u0004 // auto request // \03\0\u0001\u0003\u0001\0\0\0whammer40kdcam\0whammer40kdc\0tMU`s.kv\0\0\0\0\0\u0004 // chat rooms request // \0j\0\u0001\u0003\u0001\0\0\0whammer40kdc\0whammer40kdc\0}%D}s)<}\0\\hostname\\numwaiting\\maxwaiting\\numservers\\numplayersname\0\0\0\0 string[] data = message.Split(new char[] { '\x00' }, StringSplitOptions.RemoveEmptyEntries); //if (!data[2].Equals("whamdowfr", StringComparison.OrdinalIgnoreCase)) // return false; string validate = data[4]; string filter = null; bool isAutomatch = false; if (validate.Length > 8) { filter = validate.Substring(8); validate = validate.Substring(0, 8); } else { //Log(Category, "ROOMS REQUEST - "+ data[2]); isAutomatch = data[2].EndsWith("am"); if (!isAutomatch) { SendRooms(state, validate); return(true); } } var servers = _report.Servers.Values.Where(x => x.Valid).AsQueryable(); string[] fields = data[5].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); // May be real chat rooms: /*for (int i = 1; i <= 10; i++) * { * SendToClient(state, $@"\{i}\Room {i}\1\200\0\0\password\other\final\".ToAssciiBytes()); * }*/ // From bf2 server /*string gamename = data[1].ToLowerInvariant(); * string validate = data[2].Substring(0, 8); * string filter = FixFilter(data[2].Substring(8)); * string[] fields = data[3].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);*/ //Log(Category, String.Format("Received client request: {0}:{1}", ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port)); // var server = JsonConvert.SerializeObject((object)_report.Servers.Values.FirstOrDefault() ?? ""); /*if (!String.IsNullOrWhiteSpace(filter)) * { * try * { * //Console.WriteLine(filter); * servers = servers.Where(filter); * //Console.WriteLine(servers.Count()); * } * catch (Exception e) * { * LogError(Category, "Error parsing filter"); * LogError(Category, filter); * LogError(Category, e.ToString()); * } * }*/ // http://aluigi.altervista.org/papers/gslist.cfg /*byte[] key; * key = DataFunctions.StringToBytes("hW6m9a"); * else if (gamename == "arma2oapc") * key = DataFunctions.StringToBytes("sGKWik"); * else * key = DataFunctions.StringToBytes("Xn221z");*/ byte[] unencryptedServerList = PackServerList(state, servers, fields, isAutomatch); byte[] encryptedServerList = GSEncoding.Encode(ChatServer.Gamekey, DataFunctions.StringToBytes(validate), unencryptedServerList, unencryptedServerList.LongLength); SendToClient(state, encryptedServerList); return(true); }
/// <summary> /// Отправляем список публичных комнат в чате. /// Сейчас фейкает только один чат рум GPG1 с названием "Room 1" /// Игра сама подставит красивое имя из HTTP данных о списке комнат /// </summary> /// <param name="validate">Строка валидации запроса. Должна быть получена от игры</param> void SendChatRooms(TcpPortHandler handler, TcpClientNode node, string validate) { var bytes = new List <byte>(); //var remoteEndPoint = handler.RemoteEndPoint; //bytes.AddRange(remoteEndPoint.Address.GetAddressBytes()); bytes.AddRange(IPAddress.Loopback.GetAddressBytes()); byte[] value2 = BitConverter.GetBytes((ushort)6500); bytes.AddRange(BitConverter.IsLittleEndian ? value2.Reverse() : value2); bytes.Add(5); // fields count bytes.Add(0); // Забивает поля, которые нужны игре. В этом же порядке надо будет пихнуть значения дальше для каждой комнаты bytes.AddRange("hostname".ToAsciiBytes()); bytes.Add(0); bytes.Add(0); bytes.AddRange("numwaiting".ToAsciiBytes()); bytes.Add(0); bytes.Add(0); bytes.AddRange("maxwaiting".ToAsciiBytes()); bytes.Add(0); bytes.Add(0); bytes.AddRange("numservers".ToAsciiBytes()); bytes.Add(0); bytes.Add(0); bytes.AddRange("numplayersname".ToAsciiBytes()); bytes.Add(0); bytes.Add(0); // Изначально было 10 комнат в игре, но мы сделаем только одну и весь код написан для синхронизации чата в игре с чатом из лаунчера // for (int i = 1; i <= 10; i++) // { // Странный байт в начале инфы о комнате bytes.Add(81); // инфа об IP комнаты, но игре на нее пофиг var b2 = BitConverter.GetBytes((long)1); bytes.Add(b2[3]); bytes.Add(b2[2]); bytes.Add(b2[1]); bytes.Add(b2[0]); // инфа о порте комнаты, но игре на нее пофиг bytes.Add(0); bytes.Add(0); // Скрытое название комнаты. Только такой формат принимает с цифрой в конце bytes.Add(255); bytes.AddRange("Room 1".ToAsciiBytes()); bytes.Add(0); // Количество игроков в комнате bytes.Add(255); bytes.AddRange(_emulationAdapter.ActivePlayersCount.ToString().ToAsciiBytes()); bytes.Add(0); bytes.Add(255); bytes.AddRange("1000".ToAsciiBytes()); bytes.Add(0); bytes.Add(255); bytes.AddRange("1".ToAsciiBytes()); bytes.Add(0); bytes.Add(255); bytes.AddRange("20".ToAsciiBytes()); bytes.Add(0); // } // Непонятный набор байт в конце, но без него не сработает bytes.AddRange(new byte[] { 0, 255, 255, 255, 255 }); var array = bytes.ToArray(); // Шифруем алгоритмом спая. Участвует строка валидации и уникальный ключ игры byte[] enc = GSEncoding.Encode(_gameGSkeyBytes, validate.ToAsciiBytes(), array, array.LongLength); handler.Send(node, enc); handler.KillClient(node); }
public bool ParseRequest(SocketState state, string message) { /////////////////Ahtung Program.LogCyan("SB.Parserequest." + message); string[] data = message.Split(new char[] { '\x00' }, StringSplitOptions.RemoveEmptyEntries); if (data.Length != 4 || /* COMOUT 07.10 */(!data[0].Equals("civ4bts" /*Program.gameName/*"civ4"/*battlefield2*/, StringComparison.InvariantCultureIgnoreCase) && !data[0].Equals("civ4btsjp", StringComparison.InvariantCultureIgnoreCase) && !data[0].Equals("civ4", StringComparison.InvariantCultureIgnoreCase)) ||//*/ ( /*COMOUT 07.10 */ (!data[1].Equals("civ4bts" /*Program.gameName/*"civ4"/*battlefield2*/, StringComparison.InvariantCultureIgnoreCase) && !data[1].Equals("civ4btsjp", StringComparison.InvariantCultureIgnoreCase) && !data[1].Equals("civ4", StringComparison.InvariantCultureIgnoreCase) && !data[1].Equals("gmtest", StringComparison.InvariantCultureIgnoreCase)) && !data[1].Equals("gslive", StringComparison.InvariantCultureIgnoreCase) ) ) { Program.LogCyan("SB.CHECKPOINT X."); return(false); } string gamename = data[1].ToLowerInvariant(); //if (gamename == "gmtest") { gamename = "civ4bts"; } string validate = data[2].Substring(0, 8); Program.LogCyan("SB.validate cp:" + validate); string filter = "numplayers>-1";//Temporarily so that it shows all games //"gamemode=\"openstaging\"";//FixFilter(data[2].Substring(8)); Program.LogCyan("filtar:" + '(' + filter + ')'); string[] fields = data[3].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); Log(Category, String.Format("Received client request: {0}:{1}", ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port)); IQueryable <GameServer> servers = _report.Servers.ToList().Select(x => x.Value).Where(x => x.Valid).AsQueryable(); if (!String.IsNullOrWhiteSpace(filter)) { try { //Console.WriteLine(filter); servers = servers.Where(filter); //Console.ForegroundColor = ConsoleColor.DarkCyan; //Console.WriteLine(servers.Where(filter)); //Console.ForegroundColor = ConsoleColor.Gray; } catch (Exception e) { LogError(Category, "Error parsing filter"); LogError(Category, filter); LogError(Category, e.ToString()); } } // http://aluigi.altervista.org/papers/gslist.cfg byte[] key; //if (gamename == Program.gameName) COMOUT 07.10 {/*"civ4")/*battlefield2*/ //Program.LogCyan("GKey:" + Program.getGKey(gamename)); key = DataFunctions.StringToBytes(Program.getGKey(gamename)); }//("y3D9Hw"/*"Cs2iIq"/*hW6m9a*/); /* else if (gamename == "arma2oapc") * key = DataFunctions.StringToBytes("sGKWik"); * else * key = DataFunctions.StringToBytes("Xn221z"); */ byte[] unencryptedServerList = PackServerList(state, servers, fields); byte[] encryptedServerList = GSEncoding.Encode(key, DataFunctions.StringToBytes(validate), unencryptedServerList, unencryptedServerList.LongLength); //Program.LogCyan("SB.UnencSL. "+System.Text.Encoding.ASCII.GetString(unencryptedServerList)); if (encryptedServerList.Count() < 1) { Program.LogCyan("SB.CheckPoint44.EncrSList is empty."); } //ADDING /final/ to encryptedserverlist bytes /* byte[] bytes1 = {92,102,105,110,97,108,92}; * * * byte[] c = new byte[encryptedServerList.Length + bytes1.Length]; * encryptedServerList.CopyTo(c, 0); * bytes1.CopyTo(c, encryptedServerList.Length); * * Program.LogBlue(System.Text.Encoding.Default.GetString(c)); * * SendToClient(state, c);*/ SendToClient(state, encryptedServerList); //state.Socket.Disconnect(false); Program.LogCyan("SB.SL sent."); //SendToClient(state, unencryptedServerList); return(true); }
void OnServerRetrieveReceived(TcpPortHandler handler, TcpClientNode node, byte[] buffer, int count) { var str = buffer.ToASCII(count); LogTrace("RETRIEVE " + str); var endPoint = node.RemoteEndPoint; if (endPoint == null) { handler.KillClient(node); return; } string[] data = str.Split(new char[] { '\x00' }, StringSplitOptions.RemoveEmptyEntries); string validate = data[4]; string filter = null; bool isAutomatch = false; if (validate.Length > 8) { filter = validate.Substring(8); validate = validate.Substring(0, 8); } else { //Log(Category, "ROOMS REQUEST - "+ data[2]); isAutomatch = data[2].EndsWith("am"); if (!isAutomatch) { SendChatRooms(handler, node, validate); return; } } var lobbies = _emulationAdapter.GetOpenedLobbies(); try { // var currentRating = ServerContext.ChatServer.CurrentRating; /*for (int i = 0; i < lobbies.Length; i++) * { * var server = lobbies[i]; * * //server["score_"] = GetCurrentRating(server.MaxPlayers); * }*/ var fields = data[5].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); var unencryptedBytes = ParseHelper.PackServerList(endPoint, lobbies, fields, isAutomatch); _lastLoadedLobbies.Clear(); for (int i = 0; i < lobbies.Length; i++) { var server = lobbies[i]; var address = server.HostIP ?? server.LocalIP; var port = ushort.Parse(server.HostPort ?? server.LocalPort); var channelHash = ChatCrypt.PiStagingRoomHash(address, address, port); Log($"HASHFOR {address}:{port} {channelHash}"); server.RoomHash = channelHash; _lastLoadedLobbies[channelHash] = server; } Log("SERVERS VALIDATE VALUE ~" + validate + "~"); var encryptedBytes = GSEncoding.Encode(_gameGSkeyBytes, validate.ToAsciiBytes(), unencryptedBytes, unencryptedBytes.LongLength); Log("SERVERS bytes " + encryptedBytes.Length); int autoGames = 0; int customGames = 0; // TODO вынести в отдельно for (int i = 0; i < lobbies.Length; i++) { var server = lobbies[i]; if (server.Ranked) { autoGames++; } else { customGames++; } } //CoreContext.ClientServer.SendAsServerMessage( // "Received game list: " + customGames + " - custom; " + autoGames + // " - auto; Mod: "+ CoreContext.ThunderHawkModManager.CurrentModName); handler.Send(node, encryptedBytes); } finally { handler.KillClient(node); } }