public void Dispose() //Faily attempt to reduce memory usage. :[ { if (_fileBytes != null) { _fileBytes = null; } if (_fileExtension != null) { _fileExtension = null; } if (_fileName != null) { _fileName = null; } if (_filePath != null) { _filePath = null; } if (_compressedFile != null) { _compressedFile = null; } if (_decompressedFile != null) { _decompressedFile = null; } }
/// <summary> /// Compresses the LZB file. /// </summary> /// <param name="clean">True for cleaning up the remains of the decompression.</param> /// <returns></returns> public bool Compress(bool clean = true) { if (DecompressedFile == null || HeaderFile == null) { return(false); } if (!DecompressedFile.Exists() || !HeaderFile.Exists()) { return(false); } byte[] buffer; using (BinaryReader reader = new BinaryReader(new FileStream(HeaderFile.FilePath, FileMode.Open))) { buffer = new byte[16]; reader.Read(buffer, 0, 16); LZSSHeader.Load(buffer); } using (BinaryReader reader = new BinaryReader(new FileStream(DecompressedFile.FilePath, FileMode.Open))) { int bufferLength = (int)reader.BaseStream.Length; buffer = new byte[bufferLength]; reader.Read(buffer, 0, bufferLength); LZSSHeader.UncompressedSize = (uint)bufferLength; } byte mode = LZSSHeader.Mode; if (clean) { DecompressedFile.Delete(); DecompressedFile = null; HeaderFile.Delete(); HeaderFile = null; } switch (mode) { default: MessageBox.Show("Not a valid LZSS-bu2 mode number!\nOnly possible modes are 0, 1 and 2.", "Sorry!"); return(false); case 0: compress_Mode0(buffer); break; case 1: compress_Mode(buffer, 1, 256); break; case 2: compress_Mode(buffer, 2, 4096); break; } return(true); }
/// <summary> /// Disassemble the .unity3d file. /// </summary> public void Disassemble() { _compressedFile.ReadFile(); _compressedFile.FileReader.BaseStream.Position = _compressedFile.Header.CompressedFileHeaderSize; byte[] compressed_file_body = _compressedFile.FileReader.ReadByteArray(_compressedFile.Header.CompressedFileSizeWithoutHeader); //Get the body of the compressed file ConsoleIO.Log("Decompressing the .unity3d with Lzma..."); _decompressedFile = new DecompressedFile(LzmaUtils.Decompress(compressed_file_body)); _decompressedFile.ReadFile(); }
/// <summary> /// Start assembling the files into a .unity3d webarchive. /// </summary> public void Assemble() { DecompressedFile.WriteFile(); byte[] compressedbody = Compression.LZMA.LzmaUtils.Compress(((MemoryStream)DecompressedFile.FileWriter.BaseStream).ToArray()); CompressedFile.Header.BuildVerison = 3; CompressedFile.Header.WebPlayerVersion = "3.x.x"; CompressedFile.Header.UnityEngineVersion = "4.5.1f3"; CompressedFile.Header.CompressedFileSize = compressedbody.Length; CompressedFile.Header.CompressedFileHeaderSize = 60; CompressedFile.Header.CompressedFileSizeWithoutHeader = compressedbody.Length - CompressedFile.Header.CompressedFileHeaderSize; CompressedFile.Header.DecompressedFileSize = ((MemoryStream)DecompressedFile.FileWriter.BaseStream).ToArray().Length; CompressedFile.Header.CompressedFileSize2 = compressedbody.Length; CompressedFile.Header.DecompressedFileHeaderSize = DecompressedFile.Header.Files[0].Offset; CompressedFile.WriteFile(compressedbody); }
/// <summary> /// Try to disassemble the .unity3d file. /// </summary> /// <param name="timesToTry">Times to try</param> public void BurteForceDisassemble(int timesToTry) { ConsoleIO.WriteLine("Brute force disassembling file."); byte[] buf = null; for (int i = 0; i < timesToTry; i++) { try { buf = new byte[_compressedFile.Bytes.Length - i]; Buffer.BlockCopy(_compressedFile.Bytes, i, buf, 0, buf.Length); LzmaUtils.Decompress(buf); ConsoleIO.WriteLine("Was able to decompress file at offset: " + i.ToString("X")); _decompressedFile = new DecompressedFile(LzmaUtils.Decompress(buf)); break; } catch { } ConsoleIO.WriteLine("Failed to brute force unpack file. Tried: " + i.ToString(), ConsoleIO.LogType.Error); } }