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); }
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); }
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); }
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); }
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!"); }
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); }
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); }
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); }