示例#1
0
        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);
        }