示例#1
0
        public LoginCrypt(uint seed, LoginEncryptionKey loginKey)
        {
            key = new uint[2];

            key[0] = ((~seed ^ 0x00001357) << 16) | ((seed ^ 0xffffaaaa) & 0x0000ffff);
            key[1] = ((seed ^ 0x43210000) >> 16) | ((~seed ^ 0xabcdffff) & 0xffff0000);

            key1 = loginKey.Key1;
            key2 = loginKey.Key2;
            key3 = loginKey.Key3;
        }
示例#2
0
        public LoginEncryptionDetectionResult Detect(uint seed, IPullStream inputStream, Version defaultVersion)
        {
            var reader = new StreamPacketReader(new PullStreamToStreamAdapter(inputStream), rawBuffer);
            var length = 0;

            while (inputStream.DataAvailable && length < 62)
            {
                rawBuffer[length++] = reader.ReadByte();
            }

            rawBuffer.CopyTo(decryptedBuffer, 0);

            var versionsToTest = GetVersionsToTest(defaultVersion).GetEnumerator();

            LoginEncryptionKey?currentKey = null;
            LoginCrypt         loginCrypt = null;

            while (!IsGameServerPacket(decryptedBuffer))
            {
                if (!versionsToTest.MoveNext())
                {
                    break;
                }
                var version = versionsToTest.Current;

                currentKey = LoginEncryptionKey.FromVersion(version);
                loginCrypt = new LoginCrypt(seed, currentKey.Value);
                loginCrypt.Decrypt(rawBuffer, decryptedBuffer, 62);
            }

            if (currentKey.HasValue)
            {
                return(new LoginEncryptionDetectionResult(decryptedBuffer, loginCrypt, currentKey.Value));
            }
            else
            {
                return(new LoginEncryptionDetectionResult(decryptedBuffer));
            }
        }