private byte[] HandleLobbyPacket(byte[] lobbyPayload) { if (lobbyPayload.Length <= 24) { return(null); // ping, not interested } if (lobbyPayload[12] == 0x09) { var key = CalculateEncryption( lobbyPayload.Skip(52).Take(32).ToArray(), lobbyPayload.Skip(116).Take(4).ToArray()); _decrypter = new Blowfish(key); return(lobbyPayload); // plain text } if (_decrypter == null) { // unable to decrypt // but since salt is hard-coded in game binary and time range is relatively small // we can brute force the password in a few seconds if we really need its data lobbyPayload[0x0E] = 0xDE; // DEcrypt lobbyPayload[0x0F] = 0xFA; // FAiled return(lobbyPayload); } var dat = _decrypter.DecryptECB(lobbyPayload); Buffer.BlockCopy(lobbyPayload, 0, dat, 0, 16); // restore header return(dat); }