// this stuff can generate a malformed .unity3d file that oblitarates your hard disk public void OpenNew() { var filesPath = GetFiles(Path.GetDirectoryName(FilePath)); var files = new WebArchiveFile[filesPath.Length]; var headerSize = 5; //int32 //read files for (int i = 0; i < filesPath.Length; i++) { files[i] = new WebArchiveFile(); files[i].Name = Path.GetFileName(filesPath[i]); files[i].Bytes = File.ReadAllBytes(filesPath[i]); files[i].Size = files[i].Bytes.Length; headerSize += files[i].Name.Length + 9; } files[0].Offset = headerSize; for (int i = 1; i < files.Length; i++) files[i].Offset = files[i - 1].Offset + files[i - 1].Size; var uncompressedSize = headerSize; for (int i = 0; i < files.Length; i++) uncompressedSize += files[i].Bytes.Length; Files = files; UncompressedSize = uncompressedSize; Opened = true; }
public void Open() { var file = File.ReadAllBytes(FilePath); var fileReader = new FileReader(file); //read compressed header var signature = fileReader.ReadString(); var buildVersion = fileReader.ReadInt32(); var webPlayerVersion = fileReader.ReadString(); var unityEngineVersion = fileReader.ReadString(); var compressedFileSize = fileReader.ReadInt32(); var compressedHeaderSize = fileReader.ReadInt32(); fileReader.SkipBytes(8); var compressedBodySize = fileReader.ReadInt32(); var uncompressedSize = fileReader.ReadInt32(); var compressedFileSize2 = fileReader.ReadInt32(); var uncompressedHeaderSize = fileReader.ReadInt32(); if (fileReader.ReadByte() != 0x00) //end of header throw new InvalidDataException(string.Format("Expected 0x00 at: {0}.", fileReader.Position.ToString("X2"))); fileReader.Position = compressedHeaderSize; //read compressed body var fileBody = fileReader.ReadByteArray(compressedBodySize); var decompressedFile = LzmaUtils.Decompress(fileBody); File.WriteAllBytes(@"C:\Users\Ramda_000\Documents\GitHub\Unity3D-Disassembler\Source\bin\Debug\decompressed.txt", decompressedFile); //read decompressed header fileReader = new FileReader(decompressedFile); var files = new WebArchiveFile[fileReader.ReadInt32()]; for (int i = 0; i < files.Length; i++) { files[i] = new WebArchiveFile(); files[i].Name = fileReader.ReadString(); files[i].Offset = fileReader.ReadInt32(); files[i].Size = fileReader.ReadInt32(); } //read decompressed body for (int i = 0; i < files.Length; i++) { fileReader.Position = files[i].Offset; files[i].Bytes = fileReader.ReadByteArray(files[i].Size); } Files = files; CompressedSize = compressedFileSize; UncompressedSize = uncompressedSize; Opened = true; }