コード例 #1
0
        /// <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();
        }
コード例 #2
0
        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;

            //decompress compressed body
            var fileBody         = fileReader.ReadByteArray(compressedBodySize);
            var decompressedFile = LzmaUtils.Decompress(fileBody);

            //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;
        }
コード例 #3
0
        public void Close(bool write)
        {
            if (!write)
            {
                return;
            }

            var fileWriter = new FileWriter();
            var headerSize = 5;

            fileWriter.WriteInt32(FileCount);
            for (int i = 0; i < FileCount; i++)
            {
                fileWriter.WriteString(this[i].Name);
                fileWriter.WriteInt32(this[i].Offset);
                fileWriter.WriteInt32(this[i].Size);
                headerSize += this[i].Name.Length + 9;
            }
            fileWriter.WriteByte(0x00);

            for (int i = 0; i < FileCount; i++)
            {
                fileWriter.Position = this[i].Offset;
                fileWriter.WriteByteArray(this[i].Bytes);
            }

            var uncompressed   = ((MemoryStream)fileWriter.BaseStream).ToArray();
            var compressedBody = LzmaUtils.Compress(uncompressed);

            fileWriter = new FileWriter();
            fileWriter.WriteString("UnityWeb");
            fileWriter.WriteInt32(3);
            fileWriter.WriteString("3.x.x");
            fileWriter.WriteString("4.6.1f1");
            fileWriter.WriteInt32(compressedBody.Length + 60);
            fileWriter.WriteInt32(60);
            fileWriter.WriteInt32(1);
            fileWriter.WriteInt32(1);
            fileWriter.WriteInt32(compressedBody.Length);
            fileWriter.WriteInt32(uncompressed.Length);
            fileWriter.WriteInt32(compressedBody.Length + 60);
            fileWriter.WriteInt32(headerSize);
            fileWriter.WriteByte(0x00);
            fileWriter.WriteByteArray(compressedBody);
            fileWriter.WriteByte(0x00);

            File.WriteAllBytes(FilePath, ((MemoryStream)fileWriter.BaseStream).ToArray());

            this.CompressedSize = fileWriter.BaseStream.Length;
        }
コード例 #4
0
ファイル: CsvTable.cs プロジェクト: myegos/CoCSharp
 /// <summary>
 /// Reads the specified .csv file from a <see cref="Byte"/> array and decompresses it if specifed.
 /// </summary>
 /// <param name="bytes"><see cref="Byte"/> array of the .csv file.</param>
 /// <param name="compressed">>Whether the .csv file is compressed or not.</param>
 public void Load(byte[] bytes, bool compressed)
 {
     if (compressed)
     {
         using (var mem = new MemoryStream())
         {
             mem.Write(bytes, 0, 9); // fix the header
             mem.Write(new byte[4], 0, 4);
             mem.Write(bytes, 9, bytes.Length - 9);
             Load(LzmaUtils.Decompress(mem.ToArray()));
         }
     }
     else
     {
         Load(bytes);
     }
 }
コード例 #5
0
ファイル: CsvTable.cs プロジェクト: myegos/CoCSharp
        /// <summary>
        /// Saves this <see cref="CsvTable"/> on disk with the specified path and with compression
        /// if specified.
        /// </summary>
        /// <param name="path">Path of the .csv to save to.</param>
        /// <param name="compressed">Whether to compress the file or not.</param>
        public void Save(string path, bool compressed)
        {
            var csvBuilder = new StringBuilder();

            for (int i = 0; i < Table.Columns.Count - 1; i++) // write column names.
            {
                csvBuilder.Append(Columns[i].ColumnName + ",");
            }
            csvBuilder.AppendLine(Columns[Columns.Count - 1].ColumnName);

            for (int i = 0; i < Table.Columns.Count; i++)                         // write TypesRow
            {
                var format   = i == Table.Columns.Count - 1 ? "{0}\r\n" : "{0},"; // check if last in array
                var dataType = Table.Columns[i].DataType;
                if (dataType == typeof(int))
                {
                    csvBuilder.AppendFormat(format, "int");
                    continue;
                }
                csvBuilder.AppendFormat(format, dataType.Name);
            }

            for (int i = 0; i < Table.Rows.Count; i++) // writes all rows
            {
                csvBuilder.AppendLine(string.Join(",", Table.Rows[i].ItemArray));
            }

            if (compressed) // checks compression
            {
                var bytes = LzmaUtils.Compress(Encoding.UTF8.GetBytes(csvBuilder.ToString()));
                using (var mem = new MemoryStream(bytes))
                {
                    mem.Write(bytes, 0, 9);
                    mem.Write(bytes, 12, bytes.Length - 13);
                    File.WriteAllBytes(path, mem.ToArray());
                }
            }
            else
            {
                File.WriteAllText(path, csvBuilder.ToString());
            }
        }
コード例 #6
0
        /// <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);
            }
        }
コード例 #7
0
ファイル: Replay.cs プロジェクト: 02Redpoll/Circles
        /// <summary>
        /// Loads osu! replay from specified <see cref="BinaryReader"/>.
        /// </summary>
        public void Load(OsuBinaryReader reader, bool fullLoad = false)
        {
            Ruleset     = (Ruleset)reader.ReadByte();
            Version     = reader.ReadInt32();
            BeatmapHash = reader.ReadString();
            Username    = reader.ReadString();
            Hash        = reader.ReadString();
            Count300    = reader.ReadUInt16();
            Count100    = reader.ReadUInt16();
            Count50     = reader.ReadUInt16();
            Gekis       = reader.ReadUInt16();
            Katus       = reader.ReadUInt16();
            Misses      = reader.ReadUInt16();
            TotalScore  = reader.ReadUInt32();
            MaxCombo    = reader.ReadUInt16();
            IsPerfect   = reader.ReadBoolean();
            Mods        = (Mods)reader.ReadInt32();

            string lifedata = reader.ReadString();

            if (fullLoad)
            {
                if (!string.IsNullOrEmpty(lifedata))
                {
                    var frames = new List <LifebarFrame>();

                    foreach (string block in lifedata.Split(','))
                    {
                        var pair = block.Split('|');

                        if (pair.Length == 2)
                        {
                            frames.Add(new LifebarFrame
                            {
                                Time  = int.Parse(pair[0]),
                                Value = float.Parse(pair[1], CultureInfo.InvariantCulture)
                            });
                        }
                    }

                    Lifebar = frames.ToArray();
                }
            }

            SubmitDate = new DateTime(reader.ReadInt64(), DateTimeKind.Utc);

            if (fullLoad)
            {
                var frames = new List <DataFrame>();

                foreach (string frame in Encoding.UTF8.GetString(LzmaUtils.Decompress(reader.ReadBytes(reader.ReadInt32()))).Split(','))
                {
                    if (string.IsNullOrEmpty(frame))
                    {
                        break;
                    }

                    var pair = frame.Split('|');

                    if (pair.Length == 4)
                    {
                        if (pair[0] == "-12345")
                        {
                            Seed = int.Parse(pair[3]);

                            break;
                        }

                        frames.Add(new DataFrame
                        {
                            Time    = int.Parse(pair[0]),
                            X       = float.Parse(pair[1], CultureInfo.InvariantCulture),
                            Y       = float.Parse(pair[2], CultureInfo.InvariantCulture),
                            Actions = (Actions)byte.Parse(pair[3])
                        });
                    }
                }

                Data = frames.ToArray();
            }
            else
            {
                int length = reader.ReadInt32();

                reader.BaseStream.Position += length;
            }

            ScoreId = reader.ReadInt64();

            if (Mods.HasFlag(Mods.Target))
            {
                TotalAccuracy = reader.ReadDouble();
            }
        }