void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var request = new IPRequestPacket1(reader); if (request.Type3 == 0x14) // only type we handle right now? { Log.Debug("Handling IP request from " + request.XUID.ToString("X16")); bool breakNAT = false; if (!Client.IsHostAllowed(request.XUID)) { breakNAT = true; } /*var lclient = Client.Get(request.XUID); * bool breakGame = false; * if (lclient.GameVersion != 0) * { * if (!Client.IsVersionAllowed(lclient.GameVersion, lclient.GameBuild)) * { * breakGame = true; * } * }*/ // we don't have what client thinks is his port, but this is just an override anyway var responsePacket = new IPResponsePacket1(packet.GetSource(), request.Sequence, false, breakNAT); var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); if (!breakNAT && packet.GetSource().Port >= 28960 && packet.GetSource().Port <= 29960) { responsePacket = new IPResponsePacket1(packet.GetSource(), request.Sequence, true, false); response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); } } // and afterwards, update client's stuff var client = Client.Get(request.XUID); client.SetLastTouched(); }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var type = reader.ReadByte(); if (type == 0xE) { var request = new LogRequestPacket1(reader); if (request.GameVersion == 0 || (request.InternalIP.Port < 28960 || request.InternalIP.Port > 28970)) { // update 'last touched', possibly re-set state var client = Client.Get(request.XUID); client.SetLastTouched(); if (!client.IsMatched) { client.CurrentState = 0x417D; } // only send 0E 02 00 here var response = packet.MakeResponse(); var writer = response.GetWriter(); writer.Write(new byte[] { 0x0E, 0x02, 0x00 }); response.Send(); } else { bool allowedVersion = true; Log.Data(string.Format("Player connecting {0} from {1} version {2}.{3} XUID {4}", request.GamerTag, request.ExternalIP, request.GameVersion, request.GameBuild, request.XUID.ToString("X16"))); if (!Client.IsVersionAllowed(request.GameVersion, request.GameBuild)) { // no return, we need to keep the version logged for later packets Log.Warn(string.Format("Client {0} attempted to connect with disallowed version {1}.{2}.", request.GamerTag, request.GameVersion, request.GameBuild)); // to send 'fake' data allowedVersion = false; } var client = Client.Get(request.XUID); client.SetFromLog(request); var tempStats = new List<LogStatistics>(); /* tempStats.Add(new LogStatistics(0x2ee0, 1)); tempStats.Add(new LogStatistics(1, 2)); tempStats.Add(new LogStatistics(0x417f, 3)); tempStats.Add(new LogStatistics(0x417e, 4)); tempStats.Add(new LogStatistics(5, 5)); tempStats.Add(new LogStatistics(13, 6)); tempStats.Add(new LogStatistics(0x3a98, 7)); tempStats.Add(new LogStatistics(4, 8)); tempStats.Add(new LogStatistics(3, 9)); tempStats.Add(new LogStatistics(2, 10)); tempStats.Add(new LogStatistics(17, 11)); tempStats.Add(new LogStatistics(17, 12)); tempStats.Add(new LogStatistics(6, 13)); tempStats.Add(new LogStatistics(9, 14)); tempStats.Add(new LogStatistics(15, 16)); tempStats.Add(new LogStatistics(0x416e, 17)); tempStats.Add(new LogStatistics(7, 18)); tempStats.Add(new LogStatistics(0x417d, 19)); tempStats.Add(new LogStatistics(8, 20)); tempStats.Add(new LogStatistics(12, 21)); tempStats.Add(new LogStatistics(16, 22)); tempStats.Add(new LogStatistics(14, 23)); tempStats.Add(new LogStatistics(0x2ee0, 24)); tempStats.Add(new LogStatistics(11, 25)); tempStats.Add(new LogStatistics(10, 26)); */ var responsePacket = new LogResponsePacket1(client.XUID); if (allowedVersion) { responsePacket.SetStatistics(Client.GetStatistics()); } else { var fakeStats = new List<LogStatistics>(); fakeStats.Add(new LogStatistics(1, 28789)); //up fakeStats.Add(new LogStatistics(2, 24932)); //da fakeStats.Add(new LogStatistics(3, 25972)); //te for (short i = 4; i <= 19; i++) { fakeStats.Add(new LogStatistics(i, 1337)); } responsePacket.SetStatistics(fakeStats); /*if (request.GameBuild < 40) { responsePacket.SetBetaClosed(); } else {*/ responsePacket.SetOldBuild(); //} } if ((request.XUID & 0xFFFFFFFF) == 2) { Log.Info(string.Format("Non-allowed client (IDGEN) (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBetaClosed(); } if (!Client.IsAllowed(request.XUID)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBanned(); } if (!Client.IsAllowed(client.XUIDAlias)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBanned(); } var ipAddress = packet.GetSource().Address; if (!Client.IsAllowed(ipAddress)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to connect", ipAddress)); responsePacket.SetBanned(); } if (!packet.Secure) { if (allowedVersion) { Log.Info(string.Format("Client (IP {0}) tried to connect with insecure packet.", ipAddress)); } responsePacket.SetOldBuild(); } var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); } } else if (type == 0xFD) { if (!packet.Secure) { return; } long realID = (0x0110000100000000 | reader.ReadInt32()); long fakeID = (0x0110000100000000 | reader.ReadInt32()); if (realID == fakeID) { return; } var client = Client.Get(realID); client.XUIDAlias = fakeID; } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var request = new IPRequestPacket1(reader); if (request.Type3 == 0x14) // only type we handle right now? { Log.Debug("Handling IP request from " + request.XUID.ToString("X16")); bool breakGame = false; bool breakNAT = false; if (!Client.IsHostAllowed(request.XUID)) { breakNAT = true; } /*var lclient = Client.Get(request.XUID); if (lclient.GameVersion != 0) { if (!Client.IsVersionAllowed(lclient.GameVersion, lclient.GameBuild)) { breakGame = true; } }*/ // we don't have what client thinks is his port, but this is just an override anyway var responsePacket = new IPResponsePacket1(packet.GetSource(), request.Sequence, false, breakNAT); var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); if (!breakNAT && packet.GetSource().Port >= 28960 && packet.GetSource().Port <= 29960) { responsePacket = new IPResponsePacket1(packet.GetSource(), request.Sequence, true, false); response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); } } // and afterwards, update client's stuff var client = Client.Get(request.XUID); client.SetLastTouched(); }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var type = reader.ReadByte(); if (type == 0xCD) // CI packet, lol { // read another byte to skip double CD if (reader.ReadByte() != 0xCD) { // ignore the packet if it's old client return; } // build an non-ruined byte array var key = new byte[] { 0x45, 0x5E, 0x1A, 0x2D, 0x5C, 0x13, 0x37, 0x1E }; var bytes = new byte[((int)reader.BaseStream.Length - 4) / 4]; var ib = reader.ReadBytes((int)(reader.BaseStream.Length - 2)); var tb = 0x00; var i = 0; var j = 0; while (true) { tb = ib[i]; if (tb == 0xDC) { if (i < (ib.Length - 1)) { if (ib[i + 1] == 0xDC) { break; } } } if ((i % 4) == 0) { bytes[j] = (byte)(tb ^ key[j % 8]); j++; } i++; } // make a new reader var stream = new MemoryStream(bytes); var nreader = new BinaryReader(stream); var xuid = (0x0110000100000000 | nreader.ReadUInt32()); var status = nreader.ReadUInt16(); // prevent unknown clients from being logged if (!Client.Exists(xuid)) { return; } // only allow client to flag themselves, not other people var nativeClient = Client.Get(xuid); if (!nativeClient.ExternalIP.Address.Equals(packet.GetSource().Address)) // only used address, port might differ, // which likely explains why jerbob's fix caused // false flaggings due to missed heartbeats. { return; } var client = Get(xuid); client.Unclean = (status != 0xCA3E && status > 0); //if (status != client.LastStatus) //{ if (status != 0xCA3E && status > 0) { Log.Info(string.Format("{0} got marked unclean (cur: {1} ({3}) - old: {2} ({4})).", xuid.ToString("X16"), status, client.LastStatus, DescribeStatus(status), DescribeStatus(client.LastStatus))); client.LastStatus = status; } //} } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var type = reader.ReadByte(); if (type == 0xE) { var request = new LogRequestPacket1(reader); if (request.GameVersion == 0 || (request.InternalIP.Port < 28960 || request.InternalIP.Port > 28970)) { // update 'last touched', possibly re-set state var client = Client.Get(request.XUID); client.SetLastTouched(); if (!client.IsMatched) { client.CurrentState = 0x417D; } // only send 0E 02 00 here var response = packet.MakeResponse(); var writer = response.GetWriter(); writer.Write(new byte[] { 0x0E, 0x02, 0x00 }); response.Send(); } else { bool allowedVersion = true; Log.Data(string.Format("Player connecting {0} from {1} version {2}.{3} XUID {4}", request.GamerTag, request.ExternalIP, request.GameVersion, request.GameBuild, request.XUID.ToString("X16"))); if (!Client.IsVersionAllowed(request.GameVersion, request.GameBuild)) { // no return, we need to keep the version logged for later packets Log.Warn(string.Format("Client {0} attempted to connect with disallowed version {1}.{2}.", request.GamerTag, request.GameVersion, request.GameBuild)); // to send 'fake' data allowedVersion = false; } var client = Client.Get(request.XUID); client.SetFromLog(request); var tempStats = new List <LogStatistics>(); /* * tempStats.Add(new LogStatistics(0x2ee0, 1)); * tempStats.Add(new LogStatistics(1, 2)); * tempStats.Add(new LogStatistics(0x417f, 3)); * tempStats.Add(new LogStatistics(0x417e, 4)); * tempStats.Add(new LogStatistics(5, 5)); * tempStats.Add(new LogStatistics(13, 6)); * tempStats.Add(new LogStatistics(0x3a98, 7)); * tempStats.Add(new LogStatistics(4, 8)); * tempStats.Add(new LogStatistics(3, 9)); * tempStats.Add(new LogStatistics(2, 10)); * tempStats.Add(new LogStatistics(17, 11)); * tempStats.Add(new LogStatistics(17, 12)); * tempStats.Add(new LogStatistics(6, 13)); * tempStats.Add(new LogStatistics(9, 14)); * tempStats.Add(new LogStatistics(15, 16)); * tempStats.Add(new LogStatistics(0x416e, 17)); * tempStats.Add(new LogStatistics(7, 18)); * tempStats.Add(new LogStatistics(0x417d, 19)); * tempStats.Add(new LogStatistics(8, 20)); * tempStats.Add(new LogStatistics(12, 21)); * tempStats.Add(new LogStatistics(16, 22)); * tempStats.Add(new LogStatistics(14, 23)); * tempStats.Add(new LogStatistics(0x2ee0, 24)); * tempStats.Add(new LogStatistics(11, 25)); * tempStats.Add(new LogStatistics(10, 26)); */ var responsePacket = new LogResponsePacket1(client.XUID); if (allowedVersion) { responsePacket.SetStatistics(Client.GetStatistics()); } else { var fakeStats = new List <LogStatistics>(); fakeStats.Add(new LogStatistics(1, 28789)); //up fakeStats.Add(new LogStatistics(2, 24932)); //da fakeStats.Add(new LogStatistics(3, 25972)); //te for (short i = 4; i <= 19; i++) { fakeStats.Add(new LogStatistics(i, 1337)); } responsePacket.SetStatistics(fakeStats); /*if (request.GameBuild < 40) * { * responsePacket.SetBetaClosed(); * } * else * {*/ responsePacket.SetOldBuild(); //} } if ((request.XUID & 0xFFFFFFFF) == 2) { Log.Info(string.Format("Non-allowed client (IDGEN) (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBetaClosed(); } if (!Client.IsAllowed(request.XUID)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBanned(); } if (!Client.IsAllowed(client.XUIDAlias)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to connect", request.XUID)); responsePacket.SetBanned(); } var ipAddress = packet.GetSource().Address; if (!Client.IsAllowed(ipAddress)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to connect", ipAddress)); responsePacket.SetBanned(); } if (!packet.Secure) { if (allowedVersion) { Log.Info(string.Format("Client (IP {0}) tried to connect with insecure packet.", ipAddress)); } responsePacket.SetOldBuild(); } var response = packet.MakeResponse(); responsePacket.Write(response.GetWriter()); response.Send(); } } else if (type == 0xFD) { if (!packet.Secure) { return; } long realID = (0x0110000100000000 | reader.ReadInt32()); long fakeID = (0x0110000100000000 | reader.ReadInt32()); if (realID == fakeID) { return; } var client = Client.Get(realID); client.XUIDAlias = fakeID; } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var basePacket = new MatchBaseRequestPacket(reader); var client = Client.Get(basePacket.XUID); /*if (!Client.IsAllowed(basePacket.XUID)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to get matches", basePacket.XUID.ToString("X16"))); return; } if (!Client.IsAllowed(client.XUIDAlias)) { Log.Info(string.Format("Non-allowed client (XUID {0}) tried to get matches", basePacket.XUID.ToString("X16"))); return; }*/ var ipAddress = packet.GetSource().Address; if (!Client.IsAllowed(ipAddress)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to get matches", ipAddress)); return; } client.SetLastTouched(); client.CurrentState = _playlist; client.SetLastMatched(); if (!Client.IsVersionAllowed(client.GameVersion, client.GameBuild)) { return; } var sessions = from session in Sessions where session.HostXUID == client.XUID && (DateTime.Now - session.LastTouched).TotalSeconds < 120 select session; if (sessions.Count() > 0) { var session = sessions.First(); if (CIServer.IsUnclean(session.HostXUID, packet.GetSource().Address)) { session.Unclean = true; } foreach (var updateClient in session.Clients) { var updClient = Client.Get(updateClient.XUID); updClient.CurrentState = _playlist; updClient.SetLastTouched(); updClient.SetLastMatched(); } } if (_handlers.ContainsKey(basePacket.CommandType)) { _handlers[basePacket.CommandType].HandleCommand(this, client, packet, basePacket); } else { Log.Info(string.Format("Client {0} sent unknown match packet {1}", basePacket.XUID.ToString("X16"), basePacket.CommandType)); } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var type = reader.ReadByte(); if (type == 0xCD) // CI packet, lol { // read another byte to skip double CD if (reader.ReadByte() != 0xCD) { // ignore the packet if it's old client return; } // build an non-ruined byte array var key = new byte[] { 0x45, 0x5E, 0x1A, 0x2D, 0x5C, 0x13, 0x37, 0x1E }; var bytes = new byte[((int)reader.BaseStream.Length - 4) / 4]; var ib = reader.ReadBytes((int)(reader.BaseStream.Length - 2)); var tb = 0x00; var i = 0; var j = 0; while (true) { tb = ib[i]; if (tb == 0xDC) { if (i < (ib.Length - 1)) { if (ib[i + 1] == 0xDC) { break; } } } if ((i % 4) == 0) { bytes[j] = (byte)(tb ^ key[j % 8]); j++; } i++; } // make a new reader var stream = new MemoryStream(bytes); var nreader = new BinaryReader(stream); var xuid = (0x0110000100000000 | nreader.ReadUInt32()); var status = nreader.ReadUInt16(); var nativeClient = Client.Get(xuid); if (nativeClient.ExternalIP != null && !nativeClient.ExternalIP.Address.Equals(packet.GetSource().Address)) { return; } var client = Get(xuid); client.Unclean = (status != 0xCA3E && status > 0); //if (status != client.LastStatus) //{ if (status != 0xCA3E && status > 0) { Log.Info(string.Format("{0} got marked unclean (cur: {1} ({3}) - old: {2} ({4})).", xuid.ToString("X16"), status, client.LastStatus, DescribeStatus(status), DescribeStatus(client.LastStatus))); client.LastStatus = status; } //} } }
void server_PacketReceived(object sender, UdpPacketReceivedEventArgs e) { var packet = e.Packet; var reader = packet.GetReader(); var basePacket = new MatchBaseRequestPacket(reader); var client = Client.Get(basePacket.XUID); /*if (!Client.IsAllowed(basePacket.XUID)) * { * Log.Info(string.Format("Non-allowed client (XUID {0}) tried to get matches", basePacket.XUID.ToString("X16"))); * return; * } * * if (!Client.IsAllowed(client.XUIDAlias)) * { * Log.Info(string.Format("Non-allowed client (XUID {0}) tried to get matches", basePacket.XUID.ToString("X16"))); * return; * }*/ var ipAddress = packet.GetSource().Address; if (!Client.IsAllowed(ipAddress)) { Log.Info(string.Format("Non-allowed client (IP {0}) tried to get matches", ipAddress)); return; } client.SetLastTouched(); client.CurrentState = _playlist; client.SetLastMatched(); if (!Client.IsVersionAllowed(client.GameVersion, client.GameBuild)) { return; } var sessions = from session in Sessions where session.HostXUID == client.XUID && (DateTime.Now - session.LastTouched).TotalSeconds < 120 select session; if (sessions.Count() > 0) { var session = sessions.First(); if (CIServer.IsUnclean(session.HostXUID, packet.GetSource().Address)) { session.Unclean = true; } foreach (var updateClient in session.Clients) { var updClient = Client.Get(updateClient.XUID); updClient.CurrentState = _playlist; updClient.SetLastTouched(); updClient.SetLastMatched(); } } if (_handlers.ContainsKey(basePacket.CommandType)) { _handlers[basePacket.CommandType].HandleCommand(this, client, packet, basePacket); } else { Log.Info(string.Format("Client {0} sent unknown match packet {1}", basePacket.XUID.ToString("X16"), basePacket.CommandType)); } }