public override bool Search(string searchString)
        {
            var encryptedBytes = File.ReadAllBytes(Path);
            var bytes          = EncryptionManager.DecryptData(encryptedBytes);

            var pattern        = FileEncoding.GetBytes(searchString.ToFullWidthChars());
            var encodedPattern = new byte[pattern.Length];

            using (var ms = new MemoryStream(pattern))
                using (var br = new BinaryReader(ms))
                    using (var ms2 = new MemoryStream(encodedPattern))
                        using (var bw = new BinaryWriter(ms2))
                        {
                            while (br.BaseStream.Position < br.BaseStream.Length)
                            {
                                var chr = br.ReadUInt16();
                                bw.Write((ushort)(chr + 128));
                            }
                        }

            var index1 = SearchHelper.SearchPattern(bytes, encodedPattern, 0);

            var index2 = -1;

            if (HasChanges)
            {
                bytes   = File.ReadAllBytes(ChangesFile);
                pattern = System.Text.Encoding.Unicode.GetBytes(searchString);
                index2  = SearchHelper.SearchPattern(bytes, pattern, 0);
            }

            return(index1 != -1 || index2 != -1);
        }
Пример #2
0
        protected override IList <Subtitle> GetSubtitles()
        {
            var result        = new List <Subtitle>();
            var encryptedData = System.IO.File.ReadAllBytes(Path);
            var data          = EncryptionManager.DecryptData(encryptedData);

            using (var ms = new MemoryStream(data))
                using (var input = new ExtendedBinaryReader(ms, FileEncoding))
                {
                    while (input.Position + 2 <= input.Length)
                    {
                        var offset = input.Position;
                        var id     = input.ReadUInt16();
                        var text   = input.ReadString();
                        text = text.Replace(",", "<Break>");
                        text = text.ToHalfWidthChars();

                        var subtitle = new Subtitle {
                            Offset = offset, Text = text, Translation = text, Loaded = text
                        };
                        subtitle.PropertyChanged += SubtitlePropertyChanged;
                        result.Add(subtitle);
                    }
                }

            LoadChanges(result);

            return(result);
        }
Пример #3
0
        public override bool Search(string searchString, string path = "")
        {
            if (string.IsNullOrEmpty(path))
            {
                path = Path;
            }
            var encryptedBytes = File.ReadAllBytes(path);
            var bytes          = EncryptionManager.DecryptData(encryptedBytes);

            var pattern = FileEncoding.GetBytes(searchString.ToFullWidthChars());

            var searchHelper = new SearchHelper(pattern);
            var index1       = searchHelper.Search(bytes);

            var index2 = -1;

            if (HasChanges)
            {
                bytes        = File.ReadAllBytes(ChangesFile);
                pattern      = System.Text.Encoding.Unicode.GetBytes(searchString);
                searchHelper = new SearchHelper(pattern);
                index2       = searchHelper.Search(bytes);
            }

            return(index1 != -1 || index2 != -1);
        }
Пример #4
0
        public bool Decode(byte[] data, string password)
        {
            var msEncoded = new MemoryStream(data);

            byte[] buffer = new byte[4];

            msEncoded.Read(buffer, 0, 4);
            int encodedBytes = BitConverter.ToInt32(buffer, 0);

            buffer = new byte[encodedBytes];
            msEncoded.Read(buffer, 0, buffer.Length);
            byte[] decodedBytes = EncryptionManager.DecryptData(buffer, password);

            msEncoded.Read(buffer, 0, 4);
            int hashByteLength = BitConverter.ToInt32(buffer, 0);

            if (hashByteLength > 512)
            {
                return(false);
            }

            byte[] hashBytesFromData = new byte[hashByteLength];
            msEncoded.Read(hashBytesFromData, 0, hashBytesFromData.Length);
            byte[] hashBytesFromDecodedDataBytes = SHA512.Create().ComputeHash(decodedBytes, 0, decodedBytes.Length);

            bool hashCompareResult = GeneralConverters.ByteArrayToBase64(hashBytesFromData) == GeneralConverters.ByteArrayToBase64(hashBytesFromDecodedDataBytes);

            if (!hashCompareResult)
            {
                return(false);
            }

            var msDecoded = new MemoryStream(decodedBytes);

            buffer = new byte[4];

            msDecoded.Read(buffer, 0, buffer.Length);
            int leftPaddingLength = BitConverter.ToInt32(buffer, 0);

            msDecoded.Read(buffer, 0, buffer.Length);
            int rightPaddingLength = BitConverter.ToInt32(buffer, 0);

            msDecoded.Read(buffer, 0, buffer.Length);
            int totalLength = BitConverter.ToInt32(buffer, 0);

            byte[] decodedDataBlock = new byte[totalLength];
            msDecoded.Read(decodedDataBlock, 0, decodedDataBlock.Length);

            byte[] sharedSecretBytes = new byte[totalLength - leftPaddingLength - rightPaddingLength];
            Buffer.BlockCopy(decodedDataBlock, leftPaddingLength, sharedSecretBytes, 0, sharedSecretBytes.Length);

            SharedSecret = GeneralConverters.GetStringFromByteArray(sharedSecretBytes);

            return(true);
        }
Пример #5
0
        public static void Extract(string inputPath, string outputFolder)
        {
            var data          = File.ReadAllBytes(inputPath);
            var decryptedData = EncryptionManager.DecryptData(data);

            var copyPath = Path.Combine(outputFolder, Path.GetFileName(inputPath));

            File.WriteAllBytes(copyPath, decryptedData);

            RunUnityEx("exportbundle", string.Empty, copyPath);
            RunUnityEx("export", string.Empty, copyPath);
        }
        public void TestEncryption()
        {
            byte[] testData = new byte[4096];

            RandomNumberGenerator rng = RandomNumberGenerator.Create();

            rng.GetBytes(testData);

            string       checksumString = GeneralToolkitLib.Hashing.MD5.GetMD5HashAsHexString(testData);
            const string password       = "******";

            byte[] encodedbytes = EncryptionManager.EncryptData(testData, password);
            Assert.IsNotNull(encodedbytes);
            byte[] decodedBytes = EncryptionManager.DecryptData(encodedbytes, password);
            Assert.IsNotNull(decodedBytes);

            Assert.IsTrue(checksumString != GeneralToolkitLib.Hashing.MD5.GetMD5HashAsHexString(encodedbytes), "Original byte sequence cant be equal to encoded bytes!");
            Assert.IsTrue(checksumString == GeneralToolkitLib.Hashing.MD5.GetMD5HashAsHexString(decodedBytes), "Original byte sequence was not equal to decoded bytes!");
        }
Пример #7
0
        public override bool Search(string searchString)
        {
            var encryptedBytes = File.ReadAllBytes(Path);
            var bytes          = EncryptionManager.DecryptData(encryptedBytes);

            var pattern = FileEncoding.GetBytes(searchString.ToFullWidthChars());

            var index1 = SearchHelper.SearchPattern(bytes, pattern, 0);

            var index2 = -1;

            if (HasChanges)
            {
                bytes   = File.ReadAllBytes(ChangesFile);
                pattern = System.Text.Encoding.Unicode.GetBytes(searchString);
                index2  = SearchHelper.SearchPattern(bytes, pattern, 0);
            }

            return(index1 != -1 || index2 != -1);
        }
Пример #8
0
        public override void Rebuild(string outputFolder)
        {
            var outputPath = System.IO.Path.Combine(outputFolder, RelativePath);

            Directory.CreateDirectory(System.IO.Path.GetDirectoryName(outputPath));

            var subtitles = GetSubtitles();

            var encryptedInputData = System.IO.File.ReadAllBytes(Path);
            var inputData          = EncryptionManager.DecryptData(encryptedInputData);

            byte[] outputData;

            using (var msInput = new MemoryStream(inputData))
                using (var input = new ExtendedBinaryReader(msInput, FileEncoding))
                    using (var msOutput = new MemoryStream())
                        using (var output = new ExtendedBinaryWriter(msOutput, FileEncoding))
                        {
                            while (input.Position + 2 <= input.Length)
                            {
                                var offset    = input.Position;
                                var id        = input.ReadUInt16();
                                var inputText = input.ReadString();

                                var subtitle   = subtitles.First(x => x.Offset == offset);
                                var outputText = subtitle.Translation.Replace("<Break>", "\u0001");
                                outputText = outputText.ToFullWidthChars();
                                outputText = outputText.Replace("\u0001", ",");
                                output.Write(id);
                                output.WriteString(outputText);
                            }

                            outputData = msOutput.ToArray();
                        }

            var encryptedOutputData = EncryptionManager.EncryptData(outputData);

            System.IO.File.WriteAllBytes(outputPath, encryptedOutputData);
        }
Пример #9
0
        protected override PlainText GetText()
        {
            var result = new PlainText();
            var txt    = new StringBuilder();

            var encryptedData = System.IO.File.ReadAllBytes(Path);
            var data          = EncryptionManager.DecryptData(encryptedData);

            using (var ms = new MemoryStream(data))
                using (var input = new ExtendedBinaryReader(ms))
                {
                    var messageCount = input.ReadUInt16();
                    var dummy        = input.ReadUInt16();

                    var messageOffset = new uint[messageCount];
                    var messageSize   = new uint[messageCount];
                    for (var i = 0; i < messageCount; i++)
                    {
                        messageOffset[i] = input.ReadUInt32();
                    }

                    for (var i = 0; i < messageCount - 1; i++)
                    {
                        messageSize[i] = messageOffset[i + 1] - messageOffset[i];
                    }

                    messageSize[messageCount - 1] = (uint)(data.Length - messageOffset[messageCount - 1]);

                    for (var i = 0; i < messageCount; i++)
                    {
                        input.Seek(messageOffset[i], SeekOrigin.Begin);
                        if (i > 0)
                        {
                            txt.AppendLine();
                        }

                        txt.AppendLine(messageOffset[i] < data.Length ? $"StartMessage({input.Position});" : $"StartMessageExtra({input.Position});");

                        while (input.Position < input.Length && input.Position - messageOffset[i] < messageSize[i])
                        {
                            var offset = input.Position;
                            var type   = input.ReadUInt16();

                            if (type < 128)
                            {
                                var op = GameOps[type];

                                var args = new string[op.ParamCount];
                                for (var j = 0; j < op.ParamCount; j++)
                                {
                                    args[j] = string.Concat(input.ReadUInt16().ToString());
                                }

                                txt.AppendLine($"{op.Name}({string.Join(", ", args)});");
                            }
                            else
                            {
                                var sb = new StringBuilder();
                                while (input.Position < input.Length && type >= 128)
                                {
                                    var c = type - 128;
                                    sb.Append((char)c);
                                    type = input.ReadUInt16();
                                }

                                var value = sb.ToString().ToHalfWidthChars();

                                var text = string.Concat("Text(\"", value, "\");");

                                txt.AppendLine(text);

                                if (input.Position < input.Length)
                                {
                                    input.Seek(-2, SeekOrigin.Current);
                                }
                            }
                        }
                    }
                }

            result.Text             = txt.ToString();
            result.Translation      = txt.ToString();
            result.Loaded           = txt.ToString();
            result.PropertyChanged += SubtitlePropertyChanged;

            LoadChanges(result);

            return(result);
        }