示例#1
0
        private void readBase(StringBuilder cb, int level)
        {
            string varType = a_Stream.ReadStringToNull();
            string varName = a_Stream.ReadStringToNull();
            //a_Stream.Position += 20;
            int size          = a_Stream.ReadInt32();
            int index         = a_Stream.ReadInt32();
            int isArray       = a_Stream.ReadInt32();
            int num0          = a_Stream.ReadInt32();
            int num1          = a_Stream.ReadInt16();
            int num2          = a_Stream.ReadInt16();
            int childrenCount = a_Stream.ReadInt32();

            //Debug.WriteLine(baseFormat + " " + baseName + " " + childrenCount);
            cb.AppendFormat("{0}{1} {2} {3}\r\n", (new string('\t', level)), varType, varName, size);
            for (int i = 0; i < childrenCount; i++)
            {
                readBase(cb, level + 1);
            }
        }
示例#2
0
        private void readBundle(EndianStream b_Stream)
        {
            var signature = b_Stream.ReadStringToNull();

            if (signature == "UnityWeb" || signature == "UnityRaw" || signature == "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA")
            {
                format        = b_Stream.ReadInt32();
                versionPlayer = b_Stream.ReadStringToNull();
                versionEngine = b_Stream.ReadStringToNull();
                if (format < 6)
                {
                    int bundleSize = b_Stream.ReadInt32();
                }
                else if (format == 6)
                {
                    ReadFormat6(b_Stream, true);
                    return;
                }
                short dummy2     = b_Stream.ReadInt16();
                int   offset     = b_Stream.ReadInt16();
                int   dummy3     = b_Stream.ReadInt32();
                int   lzmaChunks = b_Stream.ReadInt32();

                int  lzmaSize   = 0;
                long streamSize = 0;

                for (int i = 0; i < lzmaChunks; i++)
                {
                    lzmaSize   = b_Stream.ReadInt32();
                    streamSize = b_Stream.ReadInt32();
                }

                b_Stream.Position = offset;
                switch (signature)
                {
                case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA":     //.bytes
                case "UnityWeb":
                {
                    byte[] lzmaBuffer = new byte[lzmaSize];
                    b_Stream.Read(lzmaBuffer, 0, lzmaSize);

                    using (var lzmaStream = new EndianStream(SevenZipHelper.StreamDecompress(new MemoryStream(lzmaBuffer)), EndianType.BigEndian))
                    {
                        getFiles(lzmaStream, 0);
                    }
                    break;
                }

                case "UnityRaw":
                {
                    getFiles(b_Stream, offset);
                    break;
                }
                }
            }
            else if (signature == "UnityFS")
            {
                format        = b_Stream.ReadInt32();
                versionPlayer = b_Stream.ReadStringToNull();
                versionEngine = b_Stream.ReadStringToNull();
                if (format == 6)
                {
                    ReadFormat6(b_Stream);
                }
            }
        }
示例#3
0
        private void ReadFormat6(EndianStream b_Stream, bool padding = false)
        {
            var bundleSize       = b_Stream.ReadInt64();
            int compressedSize   = b_Stream.ReadInt32();
            int uncompressedSize = b_Stream.ReadInt32();
            int flag             = b_Stream.ReadInt32();

            if (padding)
            {
                b_Stream.ReadByte();
            }
            byte[] blocksInfoBytes;
            if ((flag & 0x80) != 0)//at end of file
            {
                var position = b_Stream.Position;
                b_Stream.Position = b_Stream.BaseStream.Length - compressedSize;
                blocksInfoBytes   = b_Stream.ReadBytes(compressedSize);
                b_Stream.Position = position;
            }
            else
            {
                blocksInfoBytes = b_Stream.ReadBytes(compressedSize);
            }
            EndianStream blocksInfo;

            switch (flag & 0x3F)
            {
            default:    //None
            {
                blocksInfo = new EndianStream(new MemoryStream(blocksInfoBytes), EndianType.BigEndian);
                break;
            }

            case 1:    //LZMA
            {
                blocksInfo = new EndianStream(SevenZipHelper.StreamDecompress(new MemoryStream(blocksInfoBytes)), EndianType.BigEndian);
                break;
            }

            case 2:    //LZ4
            case 3:    //LZ4HC
            {
                byte[] uncompressedBytes = new byte[uncompressedSize];
                using (var mstream = new MemoryStream(blocksInfoBytes))
                {
                    var decoder = new Lz4DecoderStream(mstream);
                    decoder.Read(uncompressedBytes, 0, uncompressedSize);
                    decoder.Dispose();
                }
                blocksInfo = new EndianStream(new MemoryStream(uncompressedBytes), EndianType.BigEndian);
                break;
            }
                //case 4:LZHAM?
            }
            using (blocksInfo)
            {
                blocksInfo.Position = 0x10;
                int          blockcount = blocksInfo.ReadInt32();
                EndianStream assetsData;
                var          assetsDataStream = new MemoryStream();
                for (int i = 0; i < blockcount; i++)
                {
                    uncompressedSize = blocksInfo.ReadInt32();
                    compressedSize   = blocksInfo.ReadInt32();
                    flag             = blocksInfo.ReadInt16();
                    var compressedBytes = b_Stream.ReadBytes(compressedSize);
                    switch (flag & 0x3F)
                    {
                    default:    //None
                    {
                        assetsDataStream.Write(compressedBytes, 0, compressedSize);
                        break;
                    }

                    case 1:    //LZMA
                    {
                        var uncompressedBytes = new byte[uncompressedSize];
                        using (var mstream = new MemoryStream(compressedBytes))
                        {
                            var decoder = SevenZipHelper.StreamDecompress(mstream, uncompressedSize);
                            decoder.Read(uncompressedBytes, 0, uncompressedSize);
                            decoder.Dispose();
                        }
                        assetsDataStream.Write(uncompressedBytes, 0, uncompressedSize);
                        break;
                    }

                    case 2:    //LZ4
                    case 3:    //LZ4HC
                    {
                        var uncompressedBytes = new byte[uncompressedSize];
                        using (var mstream = new MemoryStream(compressedBytes))
                        {
                            var decoder = new Lz4DecoderStream(mstream);
                            decoder.Read(uncompressedBytes, 0, uncompressedSize);
                            decoder.Dispose();
                        }
                        assetsDataStream.Write(uncompressedBytes, 0, uncompressedSize);
                        break;
                    }
                        //case 4:LZHAM?
                    }
                }
                assetsData = new EndianStream(assetsDataStream, EndianType.BigEndian);
                using (assetsData)
                {
                    var entryinfo_count = blocksInfo.ReadInt32();
                    for (int i = 0; i < entryinfo_count; i++)
                    {
                        var memFile          = new MemoryAssetsFile();
                        var entryinfo_offset = blocksInfo.ReadInt64();
                        var entryinfo_size   = blocksInfo.ReadInt64();
                        var unknown          = blocksInfo.ReadInt32();
                        memFile.fileName    = blocksInfo.ReadStringToNull();
                        assetsData.Position = entryinfo_offset;
                        var buffer = new byte[entryinfo_size];
                        assetsData.Read(buffer, 0, (int)entryinfo_size);
                        memFile.memStream = new MemoryStream(buffer);
                        MemoryAssetsFileList.Add(memFile);
                    }
                }
            }
        }
示例#4
0
        private void readBase5()
        {
            int classID = a_Stream.ReadInt32();

            if (fileGen > 15)//5.5.0 and up
            {
                a_Stream.ReadByte();
                int type1;
                if ((type1 = a_Stream.ReadInt16()) >= 0)
                {
                    type1 = -1 - type1;
                }
                else
                {
                    type1 = classID;
                }
                classIDs.Add(new[] { type1, classID });
                classID = type1;

                /*TODO 替换?
                 * if(classID == 114)
                 * {
                 *  a_Stream.Position += 16;
                 * }*/
                var temp = a_Stream.ReadInt32();
                if (temp == 0)
                {
                    a_Stream.Position += 16;
                }
                a_Stream.Position -= 4;
                if (type1 < 0)
                {
                    a_Stream.Position += 16;
                }
            }
            else if (classID < 0)
            {
                a_Stream.Position += 16;
            }
            a_Stream.Position += 16;

            if (baseDefinitions)
            {
                int varCount   = a_Stream.ReadInt32();
                int stringSize = a_Stream.ReadInt32();

                a_Stream.Position += varCount * 24;
                string varStrings = Encoding.UTF8.GetString(a_Stream.ReadBytes(stringSize));
                string className  = "";
                var    classVar   = new List <ClassMember>();
                //build Class Structures
                a_Stream.Position -= varCount * 24 + stringSize;
                for (int i = 0; i < varCount; i++)
                {
                    ushort num0    = a_Stream.ReadUInt16();
                    byte   level   = a_Stream.ReadByte();
                    bool   isArray = a_Stream.ReadBoolean();

                    ushort varTypeIndex = a_Stream.ReadUInt16();
                    ushort test         = a_Stream.ReadUInt16();
                    string varTypeStr;
                    if (test == 0) //varType is an offset in the string block
                    {
                        varTypeStr = varStrings.Substring(varTypeIndex, varStrings.IndexOf('\0', varTypeIndex) - varTypeIndex);
                    }                                                                                                          //substringToNull
                    else //varType is an index in an internal strig array
                    {
                        varTypeStr = baseStrings.ContainsKey(varTypeIndex) ? baseStrings[varTypeIndex] : varTypeIndex.ToString();
                    }

                    ushort varNameIndex = a_Stream.ReadUInt16();
                    test = a_Stream.ReadUInt16();
                    string varNameStr;
                    if (test == 0)
                    {
                        varNameStr = varStrings.Substring(varNameIndex, varStrings.IndexOf('\0', varNameIndex) - varNameIndex);
                    }
                    else
                    {
                        varNameStr = baseStrings.ContainsKey(varNameIndex) ? baseStrings[varNameIndex] : varNameIndex.ToString();
                    }

                    int size  = a_Stream.ReadInt32();
                    int index = a_Stream.ReadInt32();
                    int flag  = a_Stream.ReadInt32();

                    if (index == 0)
                    {
                        className = varTypeStr + " " + varNameStr;
                    }
                    else
                    {
                        classVar.Add(new ClassMember()
                        {
                            Level = level - 1,
                            Type  = varTypeStr,
                            Name  = varNameStr,
                            Size  = size,
                            Flag  = flag
                        });
                    }

                    //for (int t = 0; t < level; t++) { Debug.Write("\t"); }
                    //Debug.WriteLine(varTypeStr + " " + varNameStr + " " + size);
                }
                a_Stream.Position += stringSize;

                var aClass = new ClassStruct()
                {
                    ID = classID, Text = className, members = classVar
                };
                aClass.SubItems.Add(classID.ToString());
                ClassStructures.Add(classID, aClass);
            }
        }
示例#5
0
        private void readBundle(EndianStream b_Stream)
        {
            var header = b_Stream.ReadStringToNull();

            if (header == "UnityWeb" || header == "UnityRaw" || header == "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA")
            {
                ver1 = b_Stream.ReadInt32();
                ver2 = b_Stream.ReadStringToNull();
                ver3 = b_Stream.ReadStringToNull();
                if (ver1 < 6) { int bundleSize = b_Stream.ReadInt32(); }
                else
                {
                    long bundleSize = b_Stream.ReadInt64();
                    return;
                }
                short dummy2 = b_Stream.ReadInt16();
                int offset = b_Stream.ReadInt16();
                int dummy3 = b_Stream.ReadInt32();
                int lzmaChunks = b_Stream.ReadInt32();

                int lzmaSize = 0;
                long streamSize = 0;

                for (int i = 0; i < lzmaChunks; i++)
                {
                    lzmaSize = b_Stream.ReadInt32();
                    streamSize = b_Stream.ReadInt32();
                }

                b_Stream.Position = offset;
                switch (header)
                {
                    case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA": //.bytes
                    case "UnityWeb":
                        {
                            byte[] lzmaBuffer = new byte[lzmaSize];
                            b_Stream.Read(lzmaBuffer, 0, lzmaSize);

                            using (var lzmaStream = new EndianStream(SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(new MemoryStream(lzmaBuffer)), EndianType.BigEndian))
                            {
                                getFiles(lzmaStream, 0);
                            }
                            break;
                        }
                    case "UnityRaw":
                        {
                            getFiles(b_Stream, offset);
                            break;
                        }
                }


            }
            else if (header == "UnityFS")
            {
                ver1 = b_Stream.ReadInt32();
                ver2 = b_Stream.ReadStringToNull();
                ver3 = b_Stream.ReadStringToNull();
                long bundleSize = b_Stream.ReadInt64();
            }
        }
示例#6
0
        private void readBundle(EndianStream b_Stream)
        {
            var header = b_Stream.ReadStringToNull();

            if (header == "UnityWeb" || header == "UnityRaw" || header == "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA")
            {
                ver1 = b_Stream.ReadInt32();
                ver2 = b_Stream.ReadStringToNull();
                ver3 = b_Stream.ReadStringToNull();
                if (ver1 < 6)
                {
                    int bundleSize = b_Stream.ReadInt32();
                }
                else
                {
                    long bundleSize = b_Stream.ReadInt64();
                    return;
                }
                short dummy2     = b_Stream.ReadInt16();
                int   offset     = b_Stream.ReadInt16();
                int   dummy3     = b_Stream.ReadInt32();
                int   lzmaChunks = b_Stream.ReadInt32();

                int  lzmaSize   = 0;
                long streamSize = 0;

                for (int i = 0; i < lzmaChunks; i++)
                {
                    lzmaSize   = b_Stream.ReadInt32();
                    streamSize = b_Stream.ReadInt32();
                }

                b_Stream.Position = offset;
                switch (header)
                {
                case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA":     //.bytes
                case "UnityWeb":
                {
                    byte[] lzmaBuffer = new byte[lzmaSize];
                    b_Stream.Read(lzmaBuffer, 0, lzmaSize);

                    using (var lzmaStream = new EndianStream(SevenZip.Compression.LZMA.SevenZipHelper.StreamDecompress(new MemoryStream(lzmaBuffer)), EndianType.BigEndian))
                    {
                        getFiles(lzmaStream, 0);
                    }
                    break;
                }

                case "UnityRaw":
                {
                    getFiles(b_Stream, offset);
                    break;
                }
                }
            }
            else if (header == "UnityFS")
            {
                ver1 = b_Stream.ReadInt32();
                ver2 = b_Stream.ReadStringToNull();
                ver3 = b_Stream.ReadStringToNull();
                long bundleSize = b_Stream.ReadInt64();
            }
        }
示例#7
0
 private static void Read(StringBuilder sb, List <ClassMember> members, EndianStream a_Stream)
 {
     for (int i = 0; i < members.Count; i++)
     {
         var    member     = members[i];
         var    level      = member.Level;
         var    varTypeStr = member.Type;
         var    varNameStr = member.Name;
         object value      = null;
         var    align      = (member.Flag & 0x4000) != 0;
         var    append     = true;
         if (varTypeStr == "SInt8")//sbyte
         {
             value = a_Stream.ReadSByte();
         }
         else if (varTypeStr == "UInt8")//byte
         {
             value = a_Stream.ReadByte();
         }
         else if (varTypeStr == "short" || varTypeStr == "SInt16")//Int16
         {
             value = a_Stream.ReadInt16();
         }
         else if (varTypeStr == "UInt16" || varTypeStr == "unsigned short")//UInt16
         {
             value = a_Stream.ReadUInt16();
         }
         else if (varTypeStr == "int" || varTypeStr == "SInt32")//Int32
         {
             value = a_Stream.ReadInt32();
         }
         else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int")//UInt32
         {
             value = a_Stream.ReadUInt32();
         }
         else if (varTypeStr == "long long" || varTypeStr == "SInt64")//Int64
         {
             value = a_Stream.ReadInt64();
         }
         else if (varTypeStr == "UInt64" || varTypeStr == "unsigned long long")//UInt64
         {
             value = a_Stream.ReadUInt64();
         }
         else if (varTypeStr == "float")//float
         {
             value = a_Stream.ReadSingle();
         }
         else if (varTypeStr == "double")//double
         {
             value = a_Stream.ReadDouble();
         }
         else if (varTypeStr == "bool")//bool
         {
             value = a_Stream.ReadBoolean();
         }
         else if (varTypeStr == "string")//string
         {
             append = false;
             var str = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
             sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str);
             i += 3;                     //skip
         }
         else if (varTypeStr == "Array") //Array
         {
             append = false;
             if ((members[i - 1].Flag & 0x4000) != 0)
             {
                 align = true;
             }
             sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
             var size = a_Stream.ReadInt32();
             sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size);
             var array = ReadArray(members, level, i);
             for (int j = 0; j < size; j++)
             {
                 sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 1)), j);
                 Read(sb, array, a_Stream);
             }
             i += array.Count + 1;//skip
         }
         else
         {
             append = false;
             align  = false;
             sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
         }
         if (append)
         {
             sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
         }
         if (align)
         {
             a_Stream.AlignStream(4);
         }
     }
 }