Exemplo n.º 1
0
        private void InitKeys(Il2CppGlobalMetadataHeader p_Header)
        {
            var s_Random = new mt19937_64_t();

            s_Random.init_genrand64(this.m_Seed);


            this.m_StringsSize   = p_Header.stringsCount ^ (uint)s_Random.genrand64_int64();
            this.m_StringsOffset = p_Header.stringsOffset ^ (uint)s_Random.genrand64_int64();

            // String literal size isnt encrypted..
            s_Random.genrand64_int64();
            this.m_StringLiteralSize   = p_Header.stringLiteralCount;// ^ (uint)s_Random.genrand64_int64();
            this.m_StringLiteralOffset = p_Header.stringLiteralOffset ^ (uint)s_Random.genrand64_int64();

            this.m_StringLiteralDataSize   = p_Header.stringLiteralDataCount ^ (uint)s_Random.genrand64_int64();
            this.m_StringLiteralDataOffset = p_Header.stringLiteralDataOffset ^ (uint)s_Random.genrand64_int64();


            m_KeyData = new byte[0x5000];

            for (var s_Index = 0; s_Index < 2560; s_Index++)
            {
                var s_DataOffset = s_Index * 8;

                var s_TempBuffer = BitConverter.GetBytes(s_Random.genrand64_int64());;

                Array.Copy(s_TempBuffer, 0, this.m_KeyData, s_DataOffset, s_TempBuffer.Length);
            }
        }
Exemplo n.º 2
0
 public Metadata(Stream stream) : base(stream)
 {
     pMetadataHdr = ReadClass <Il2CppGlobalMetadataHeader>();
     if (pMetadataHdr.sanity != 0xFAB11BAF)
     {
         throw new Exception("ERROR: Metadata file supplied is not valid metadata file.");
     }
     if (pMetadataHdr.version != 21 && pMetadataHdr.version != 22)
     {
         throw new Exception($"ERROR: Metadata file supplied is not a supported version[{pMetadataHdr.version}].");
     }
     uiImageCount = pMetadataHdr.imagesCount / MySizeOf(typeof(Il2CppImageDefinition));
     uiNumTypes   = pMetadataHdr.typeDefinitionsCount / MySizeOf(typeof(Il2CppTypeDefinition));
     imageDefs    = ReadClassArray <Il2CppImageDefinition>(pMetadataHdr.imagesOffset, uiImageCount);
     //GetTypeDefFromIndex
     typeDefs = ReadClassArray <Il2CppTypeDefinition>(pMetadataHdr.typeDefinitionsOffset, uiNumTypes);
     //GetMethodDefinition
     methodDefs = ReadClassArray <Il2CppMethodDefinition>(pMetadataHdr.methodsOffset, pMetadataHdr.methodsCount / MySizeOf(typeof(Il2CppMethodDefinition)));
     //GetParameterFromIndex
     parameterDefs = ReadClassArray <Il2CppParameterDefinition>(pMetadataHdr.parametersOffset, pMetadataHdr.parametersCount / MySizeOf(typeof(Il2CppParameterDefinition)));
     //GetFieldDefFromIndex
     fieldDefs = ReadClassArray <Il2CppFieldDefinition>(pMetadataHdr.fieldsOffset, pMetadataHdr.fieldsCount / MySizeOf(typeof(Il2CppFieldDefinition)));
     //GetFieldDefaultFromIndex
     fieldDefaultValues = ReadClassArray <Il2CppFieldDefaultValue>(pMetadataHdr.fieldDefaultValuesOffset, pMetadataHdr.fieldDefaultValuesCount / MySizeOf(typeof(Il2CppFieldDefaultValue)));
 }
Exemplo n.º 3
0
        public Metadata(Stream stream) : base(stream)
        {
            var sanity = ReadUInt32();

            if (sanity != 0xFAB11BAF)
            {
                throw new Exception("ERROR: Metadata file supplied is not valid metadata file.");
            }
            version = ReadInt32();
            switch (version)
            {
            case 16:
            case 20:
            case 21:
            case 22:
            case 23:
            case 24:
                break;

            default:
                throw new Exception($"ERROR: Metadata file supplied is not a supported version[{version}].");
            }
            //pMetadataHdr
            pMetadataHdr = ReadClass <Il2CppGlobalMetadataHeader>(0);
            //ImageDefinition
            uiImageCount = pMetadataHdr.imagesCount / MySizeOf(typeof(Il2CppImageDefinition));
            uiNumTypes   = pMetadataHdr.typeDefinitionsCount / MySizeOf(typeof(Il2CppTypeDefinition));
            imageDefs    = ReadClassArray <Il2CppImageDefinition>(pMetadataHdr.imagesOffset, uiImageCount);
            //TypeDefinition
            typeDefs = ReadClassArray <Il2CppTypeDefinition>(pMetadataHdr.typeDefinitionsOffset, uiNumTypes);
            //MethodDefinition
            methodDefs = ReadClassArray <Il2CppMethodDefinition>(pMetadataHdr.methodsOffset, pMetadataHdr.methodsCount / MySizeOf(typeof(Il2CppMethodDefinition)));
            //ParameterDefinition
            parameterDefs = ReadClassArray <Il2CppParameterDefinition>(pMetadataHdr.parametersOffset, pMetadataHdr.parametersCount / MySizeOf(typeof(Il2CppParameterDefinition)));
            //FieldDefinition
            fieldDefs = ReadClassArray <Il2CppFieldDefinition>(pMetadataHdr.fieldsOffset, pMetadataHdr.fieldsCount / MySizeOf(typeof(Il2CppFieldDefinition)));
            //FieldDefaultValue
            fieldDefaultValues = ReadClassArray <Il2CppFieldDefaultValue>(pMetadataHdr.fieldDefaultValuesOffset, pMetadataHdr.fieldDefaultValuesCount / MySizeOf(typeof(Il2CppFieldDefaultValue)));
            //PropertyDefinition
            propertyDefs = ReadClassArray <Il2CppPropertyDefinition>(pMetadataHdr.propertiesOffset, pMetadataHdr.propertiesCount / MySizeOf(typeof(Il2CppPropertyDefinition)));
            //GetInterfaceFromIndex
            interfaceIndices = ReadClassArray <int>(pMetadataHdr.interfacesOffset, pMetadataHdr.interfacesCount / 4);
            if (version > 16)
            {
                //Il2CppStringLiteral
                stringLiterals = ReadClassArray <Il2CppStringLiteral>(pMetadataHdr.stringLiteralOffset, pMetadataHdr.stringLiteralCount / MySizeOf(typeof(Il2CppStringLiteral)));
                //Il2CppMetadataUsageList
                metadataUsageLists = ReadClassArray <Il2CppMetadataUsageList>(pMetadataHdr.metadataUsageListsOffset, pMetadataHdr.metadataUsageListsCount / MySizeOf(typeof(Il2CppMetadataUsageList)));
                //Il2CppMetadataUsagePair
                metadataUsagePairs = ReadClassArray <Il2CppMetadataUsagePair>(pMetadataHdr.metadataUsagePairsOffset, pMetadataHdr.metadataUsagePairsCount / MySizeOf(typeof(Il2CppMetadataUsagePair)));
                CreateStringLiteralDic();
            }
            if (version > 20)
            {
                //CustomAttributeTypeRange
                attributesInfos = ReadClassArray <Il2CppCustomAttributeTypeRange>(pMetadataHdr.attributesInfoOffset, pMetadataHdr.attributesInfoCount / MySizeOf(typeof(Il2CppCustomAttributeTypeRange)));
                //AttributeTypes
                attributeTypes = ReadClassArray <int>(pMetadataHdr.attributeTypesOffset, pMetadataHdr.attributeTypesCount / 4);
            }
        }
Exemplo n.º 4
0
        public Metadata(Stream stream, float version) : base(stream)
        {
            this.version   = version;
            metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>();
            if (metadataHeader.sanity != 0xFAB11BAF)
            {
                throw new Exception("ERROR: Metadata file supplied is not valid metadata file.");
            }
            switch (metadataHeader.version)
            {
            case 16:
            case 19:
            case 20:
            case 21:
            case 22:
            case 23:
            case 24:
                break;

            default:
                throw new Exception($"ERROR: Metadata file supplied is not a supported version[{version}].");
            }
            imageDefs              = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
            typeDefs               = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount);
            methodDefs             = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount);
            parameterDefs          = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount);
            fieldDefs              = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount);
            fieldDefaultValues     = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount);
            parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount);
            propertyDefs           = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount);
            interfaceIndices       = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4);
            nestedTypeIndices      = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4);
            eventDefs              = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount);
            genericContainers      = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount);
            genericParameters      = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount);
            constraintIndices      = ReadClassArray <int>(metadataHeader.genericParameterConstraintsOffset, metadataHeader.genericParameterConstraintsCount / 4);
            if (version > 16)
            {
                stringLiterals     = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount);
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount);

                ProcessingMetadataUsage();

                fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount);
            }
            if (version > 20)
            {
                attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount);
                attributeTypes      = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4);
            }
        }
Exemplo n.º 5
0
 public Metadata(Stream stream) : base(stream)
 {
     pMetadataHdr = ReadClass <Il2CppGlobalMetadataHeader>();
     uiImageCount = pMetadataHdr.imagesCount / MySizeOf(typeof(Il2CppImageDefinition));
     uiNumTypes   = pMetadataHdr.typeDefinitionsCount / MySizeOf(typeof(Il2CppTypeDefinition));
     imageDefs    = ReadClassArray <Il2CppImageDefinition>(pMetadataHdr.imagesOffset, uiImageCount);
     //GetTypeDefFromIndex
     typeDefs = ReadClassArray <Il2CppTypeDefinition>(pMetadataHdr.typeDefinitionsOffset, uiNumTypes);
     //GetMethodDefinition
     methodDefs = ReadClassArray <Il2CppMethodDefinition>(pMetadataHdr.methodsOffset, pMetadataHdr.methodsCount / MySizeOf(typeof(Il2CppMethodDefinition)));
     //GetParameterFromIndex
     parameterDefs = ReadClassArray <Il2CppParameterDefinition>(pMetadataHdr.parametersOffset, pMetadataHdr.parametersCount / MySizeOf(typeof(Il2CppParameterDefinition)));
     //GetFieldDefFromIndex
     fieldDefs = ReadClassArray <Il2CppFieldDefinition>(pMetadataHdr.fieldsOffset, pMetadataHdr.fieldsCount / MySizeOf(typeof(Il2CppFieldDefinition)));
     //GetFieldDefaultValuesFromIndex
     fieldDefaultValues = ReadClassArray <Il2CppFieldDefaultValue>(pMetadataHdr.fieldDefaultValuesOffset, pMetadataHdr.fieldDefaultValuesCount / MySizeOf(typeof(Il2CppFieldDefaultValue)));
     //GetPropertyDefinitionFromIndex
     propertyDefs = ReadClassArray <Il2CppPropertyDefinition>(pMetadataHdr.propertiesOffset, pMetadataHdr.propertiesCount / MySizeOf(typeof(Il2CppPropertyDefinition)));
     //GetAttributesInfoFromIndex
     attributesInfos = ReadClassArray <Il2CppCustomAttributeTypeRange>(pMetadataHdr.attributesInfoOffset, pMetadataHdr.attributesInfoCount / MySizeOf(typeof(Il2CppCustomAttributeTypeRange)));
     //GetAttributeTypesFromIndex
     attributeTypes = ReadClassArray <int>(pMetadataHdr.attributeTypesOffset, pMetadataHdr.attributeTypesCount / 4);
 }
Exemplo n.º 6
0
        private void InitSeed(Il2CppGlobalMetadataHeader p_Header)
        {
            uint[] s_SeedParts = new uint[18]
            {
                p_Header.KeyPart1_1,
                p_Header.KeyPart1_2,
                p_Header.KeyPart1_3,
                p_Header.KeyPart1_4,

                p_Header.KeyPart2_1,
                p_Header.KeyPart2_2,
                p_Header.KeyPart2_3,
                p_Header.KeyPart2_4,

                p_Header.KeyPart3_1,
                p_Header.KeyPart3_2,
                p_Header.KeyPart3_3,
                p_Header.KeyPart3_4,

                p_Header.KeyPart4_1,
                p_Header.KeyPart4_2,


                p_Header.KeyPart5_1,
                p_Header.KeyPart5_2,
                p_Header.KeyPart5_3,
                p_Header.KeyPart5_4,
            };

            var s_FirstSeed = s_SeedParts[0];
            var s_LastSeed  = s_SeedParts[s_SeedParts.Length - 1];

            var s_LowerPart = (ulong)s_SeedParts[(s_LastSeed & 0xF) + 2];
            var s_UpperPart = (ulong)s_SeedParts[(s_FirstSeed & 0xF)];

            this.m_Seed = (s_UpperPart << 32) | s_LowerPart;
        }
Exemplo n.º 7
0
        public Metadata(Stream stream) : base(stream)
        {
            /*var sanity = ReadUInt32();
             * if (sanity != 0xFAB11BAF)
             * {
             *  throw new InvalidDataException("ERROR: Metadata file supplied is not valid metadata file.");
             * }
             * var version = ReadInt32();
             * if (version < 16 || version > 27)
             * {
             *  throw new NotSupportedException($"ERROR: Metadata file supplied is not a supported version[{version}].");
             * }
             * Version = version;*/
            Version = 24;
            header  = ReadClass <Il2CppGlobalMetadataHeader>(0);

            stringDecryptionBlob = File.ReadAllBytes("D:\\genshinimpactre\\decryption_blob.bin");

            /*if (version == 24)
             * {
             *  if (header.stringLiteralOffset == 264)
             *  {
             *      Version = 24.2f;
             *      header = ReadClass<Il2CppGlobalMetadataHeader>(0);
             *  }
             *  else
             *  {
             *      imageDefs = ReadMetadataClassArray<Il2CppImageDefinition>(header.imagesOffset, header.imagesCount);
             *      if (imageDefs.Any(x => x.token != 1))
             *      {
             *          Version = 24.1f;
             *      }
             *  }
             * }*/
            imageDefs     = ReadMetadataClassArray <Il2CppImageDefinition>(header.imagesOffset, header.imagesCount);
            typeDefs      = ReadMetadataClassArray <Il2CppTypeDefinition>(header.typeDefinitionsOffset, header.typeDefinitionsCount);
            methodDefs    = ReadMetadataClassArray <Il2CppMethodDefinition>(header.methodsOffset, header.methodsCount);
            parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(header.parametersOffset, header.parametersCount);
            fieldDefs     = ReadMetadataClassArray <Il2CppFieldDefinition>(header.fieldsOffset, header.fieldsCount);
            var fieldDefaultValues     = ReadMetadataClassArray <Il2CppFieldDefaultValue>(header.fieldDefaultValuesOffset, header.fieldDefaultValuesCount);
            var parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(header.parameterDefaultValuesOffset, header.parameterDefaultValuesCount);

            fieldDefaultValuesDic     = fieldDefaultValues.ToDictionary(x => x.fieldIndex);
            parameterDefaultValuesDic = parameterDefaultValues.ToDictionary(x => x.parameterIndex);
            propertyDefs      = ReadMetadataClassArray <Il2CppPropertyDefinition>(header.propertiesOffset, header.propertiesCount);
            interfaceIndices  = ReadClassArray <int>(header.interfacesOffset, header.interfacesCount / 4);
            nestedTypeIndices = ReadClassArray <int>(header.nestedTypesOffset, header.nestedTypesCount / 4);
            eventDefs         = ReadMetadataClassArray <Il2CppEventDefinition>(header.eventsOffset, header.eventsCount);
            genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(header.genericContainersOffset, header.genericContainersCount);
            genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(header.genericParametersOffset, header.genericParametersCount);
            constraintIndices = ReadClassArray <int>(header.genericParameterConstraintsOffset, header.genericParameterConstraintsCount / 4);
            vtableMethods     = ReadClassArray <uint>(header.vtableMethodsOffset, header.vtableMethodsCount / 4);
            if (Version > 16 && Version < 27)                                                                                              //TODO
            {
                stringLiterals     = ReadMetadataClassArray <Il2CppStringLiteral>(0xC7F2C, (int)header.genericContainersOffset - 0xC7F2C); // see notes for how to get this
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(header.metadataUsageListsOffset, header.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(header.metadataUsagePairsOffset, header.metadataUsagePairsCount);

                ProcessingMetadataUsage();

                fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(header.fieldRefsOffset, header.fieldRefsCount);
            }
            if (Version > 20)
            {
                attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(header.attributesInfoOffset, header.attributesInfoCount);
                attributeTypes      = ReadClassArray <int>(header.attributeTypesOffset, header.attributeTypesCount / 4);
            }

            /*if (Version > 24)
             * {
             *  attributeTypeRangesDic = new Dictionary<Il2CppImageDefinition, Dictionary<uint, int>>();
             *  foreach (var imageDef in imageDefs)
             *  {
             *      var dic = new Dictionary<uint, int>();
             *      attributeTypeRangesDic[imageDef] = dic;
             *      var end = imageDef.customAttributeStart + imageDef.customAttributeCount;
             *      for (int i = imageDef.customAttributeStart; i < end; i++)
             *      {
             *          dic.Add(attributeTypeRanges[i].token, i);
             *      }
             *  }
             * }*/
            if (Version <= 24.1f)
            {
                rgctxEntries = ReadMetadataClassArray <Il2CppRGCTXDefinition>(header.rgctxEntriesOffset, header.rgctxEntriesCount);
            }
        }
Exemplo n.º 8
0
        public Metadata(Stream stream) : base(stream)
        {
            var sanity = ReadUInt32();

            if (sanity != 0xFAB11BAF)
            {
                throw new InvalidDataException("ERROR: Metadata file supplied is not valid metadata file.");
            }
            var version = ReadInt32();

            if (version < 16 || version > 27)
            {
                throw new NotSupportedException($"ERROR: Metadata file supplied is not a supported version[{version}].");
            }
            Version        = version;
            metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(0);
            if (version == 24)
            {
                if (metadataHeader.stringLiteralOffset == 264)
                {
                    Version        = 24.2f;
                    metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(0);
                }
                else
                {
                    imageDefs = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
                    if (imageDefs.Any(x => x.token != 1))
                    {
                        Version = 24.1f;
                    }
                }
            }
            imageDefs     = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
            typeDefs      = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount);
            methodDefs    = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount);
            parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount);
            fieldDefs     = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount);
            var fieldDefaultValues     = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount);
            var parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount);

            fieldDefaultValuesDic     = fieldDefaultValues.ToDictionary(x => x.fieldIndex);
            parameterDefaultValuesDic = parameterDefaultValues.ToDictionary(x => x.parameterIndex);
            propertyDefs      = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount);
            interfaceIndices  = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4);
            nestedTypeIndices = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4);
            eventDefs         = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount);
            genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount);
            genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount);
            constraintIndices = ReadClassArray <int>(metadataHeader.genericParameterConstraintsOffset, metadataHeader.genericParameterConstraintsCount / 4);
            vtableMethods     = ReadClassArray <uint>(metadataHeader.vtableMethodsOffset, metadataHeader.vtableMethodsCount / 4);
            if (Version > 16 && Version < 27) //TODO
            {
                stringLiterals     = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount);
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount);

                ProcessingMetadataUsage();

                fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount);
            }
            if (Version > 20)
            {
                attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount);
                attributeTypes      = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4);
            }
            if (Version > 24)
            {
                attributeTypeRangesDic = new Dictionary <Il2CppImageDefinition, Dictionary <uint, int> >();
                foreach (var imageDef in imageDefs)
                {
                    var dic = new Dictionary <uint, int>();
                    attributeTypeRangesDic[imageDef] = dic;
                    var end = imageDef.customAttributeStart + imageDef.customAttributeCount;
                    for (int i = imageDef.customAttributeStart; i < end; i++)
                    {
                        dic.Add(attributeTypeRanges[i].token, i);
                    }
                }
            }
            if (Version <= 24.1f)
            {
                rgctxEntries = ReadMetadataClassArray <Il2CppRGCTXDefinition>(metadataHeader.rgctxEntriesOffset, metadataHeader.rgctxEntriesCount);
            }
        }
Exemplo n.º 9
0
        public Metadata(Stream stream, float version) : base(stream)
        {
            this.version = version;
            //pMetadataHdr
            pMetadataHdr = ReadClass <Il2CppGlobalMetadataHeader>();
            if (pMetadataHdr.sanity != 0xFAB11BAF)
            {
                throw new Exception("ERROR: Metadata file supplied is not valid metadata file.");
            }
            switch (pMetadataHdr.version)
            {
            case 16:
            case 19:
            case 20:
            case 21:
            case 22:
            case 23:
            case 24:
                break;

            default:
                throw new Exception($"ERROR: Metadata file supplied is not a supported version[{version}].");
            }
            //ImageDefinition
            uiImageCount = pMetadataHdr.imagesCount / MySizeOf(typeof(Il2CppImageDefinition));
            uiNumTypes   = pMetadataHdr.typeDefinitionsCount / MySizeOf(typeof(Il2CppTypeDefinition));
            imageDefs    = ReadClassArray <Il2CppImageDefinition>(pMetadataHdr.imagesOffset, uiImageCount);
            //GetTypeDefinitionFromIndex
            typeDefs = ReadClassArray <Il2CppTypeDefinition>(pMetadataHdr.typeDefinitionsOffset, uiNumTypes);
            //GetMethodDefinitionFromIndex
            methodDefs = ReadClassArray <Il2CppMethodDefinition>(pMetadataHdr.methodsOffset, pMetadataHdr.methodsCount / MySizeOf(typeof(Il2CppMethodDefinition)));
            //GetParameterDefinitionFromIndex
            parameterDefs = ReadClassArray <Il2CppParameterDefinition>(pMetadataHdr.parametersOffset, pMetadataHdr.parametersCount / MySizeOf(typeof(Il2CppParameterDefinition)));
            //GetFieldDefinitionFromIndex
            fieldDefs = ReadClassArray <Il2CppFieldDefinition>(pMetadataHdr.fieldsOffset, pMetadataHdr.fieldsCount / MySizeOf(typeof(Il2CppFieldDefinition)));
            //FieldDefaultValue
            fieldDefaultValues = ReadClassArray <Il2CppFieldDefaultValue>(pMetadataHdr.fieldDefaultValuesOffset, pMetadataHdr.fieldDefaultValuesCount / MySizeOf(typeof(Il2CppFieldDefaultValue)));
            //ParameterDefaultValue
            parameterDefaultValues = ReadClassArray <Il2CppParameterDefaultValue>(pMetadataHdr.parameterDefaultValuesOffset, pMetadataHdr.parameterDefaultValuesCount / MySizeOf(typeof(Il2CppParameterDefaultValue)));
            //GetPropertyDefinitionFromIndex
            propertyDefs = ReadClassArray <Il2CppPropertyDefinition>(pMetadataHdr.propertiesOffset, pMetadataHdr.propertiesCount / MySizeOf(typeof(Il2CppPropertyDefinition)));
            //GetInterfaceFromIndex
            interfaceIndices = ReadClassArray <int>(pMetadataHdr.interfacesOffset, pMetadataHdr.interfacesCount / 4);
            //GetNestedTypeFromIndex
            nestedTypeIndices = ReadClassArray <int>(pMetadataHdr.nestedTypesOffset, pMetadataHdr.nestedTypesCount / 4);
            //GetEventDefinitionFromIndex
            eventDefs = ReadClassArray <Il2CppEventDefinition>(pMetadataHdr.eventsOffset, pMetadataHdr.eventsCount / MySizeOf(typeof(Il2CppEventDefinition)));
            //GetGenericContainerFromIndex
            genericContainers = ReadClassArray <Il2CppGenericContainer>(pMetadataHdr.genericContainersOffset, pMetadataHdr.genericContainersCount / MySizeOf(typeof(Il2CppGenericContainer)));
            if (version > 16)
            {
                //Il2CppStringLiteral
                stringLiterals = ReadClassArray <Il2CppStringLiteral>(pMetadataHdr.stringLiteralOffset, pMetadataHdr.stringLiteralCount / MySizeOf(typeof(Il2CppStringLiteral)));
                //Il2CppMetadataUsageList
                metadataUsageLists = ReadClassArray <Il2CppMetadataUsageList>(pMetadataHdr.metadataUsageListsOffset, pMetadataHdr.metadataUsageListsCount / MySizeOf(typeof(Il2CppMetadataUsageList)));
                //Il2CppMetadataUsagePair
                metadataUsagePairs = ReadClassArray <Il2CppMetadataUsagePair>(pMetadataHdr.metadataUsagePairsOffset, pMetadataHdr.metadataUsagePairsCount / MySizeOf(typeof(Il2CppMetadataUsagePair)));
                CreateStringLiteralDic();
            }
            if (version > 20)
            {
                //CustomAttributeTypeRange
                attributeTypeRanges = ReadClassArray <Il2CppCustomAttributeTypeRange>(pMetadataHdr.attributesInfoOffset, pMetadataHdr.attributesInfoCount / MySizeOf(typeof(Il2CppCustomAttributeTypeRange)));
                //AttributeTypes
                attributeTypes = ReadClassArray <int>(pMetadataHdr.attributeTypesOffset, pMetadataHdr.attributeTypesCount / 4);
            }
        }
Exemplo n.º 10
0
 public MetadataStringDecryptor(Il2CppGlobalMetadataHeader p_Header)
 {
     InitSeed(p_Header);
     InitKeys(p_Header);
 }
Exemplo n.º 11
0
        private Regex nameTranslationMemberRegex            = new Regex(@".+\/<(.+)>", RegexOptions.Compiled); // avoid a bunch of allocations

        public Metadata(Stream stream, MetadataDecryption.StringDecryptionData decData, string nameTranslationPath) : base(stream)
        {
            /*var sanity = ReadUInt32();
             * if (sanity != 0xFAB11BAF)
             * {
             *  throw new InvalidDataException("ERROR: Metadata file supplied is not valid metadata file.");
             * }
             * var version = ReadInt32();
             * if (version < 16 || version > 27)
             * {
             *  throw new NotSupportedException($"ERROR: Metadata file supplied is not a supported version[{version}].");
             * }
             * Version = version;*/
            Version = 24;
            header  = ReadClass <Il2CppGlobalMetadataHeader>(0);

            //stringDecryptionBlob = File.ReadAllBytes("D:\\genshinimpactre\\1.5-dev\\decryption_blob.bin");
            stringDecryptionBlob            = decData.stringDecryptionBlob;
            header.stringCount             ^= (int)decData.stringCountXor;
            header.stringOffset            ^= decData.stringOffsetXor;
            header.stringLiteralOffset     ^= decData.stringLiteralOffsetXor;
            header.stringLiteralDataCount  ^= (int)decData.stringLiteralDataCountXor;
            header.stringLiteralDataOffset ^= decData.stringLiteralDataOffsetXor;

            if (nameTranslationPath != null)
            {
                var nameTranslationFile = File.ReadAllLines(nameTranslationPath);
                foreach (var line in nameTranslationFile)
                {
                    if (line.StartsWith("#"))
                    {
                        continue;
                    }
                    var split = line.Split('⇨');
                    if (split.Length != 2)
                    {
                        throw new NotSupportedException($"unexpected split.Length {split.Length}");
                    }
                    //Console.WriteLine("{0} {1}", split[0], split[1]);
                    nameTranslation.Add(split[0], split[1]);
                }
                Console.WriteLine($"Loaded {nameTranslation.Count} lookup values");
            }

            /*if (version == 24)
             * {
             *  if (header.stringLiteralOffset == 264)
             *  {
             *      Version = 24.2f;
             *      header = ReadClass<Il2CppGlobalMetadataHeader>(0);
             *  }
             *  else
             *  {
             *      imageDefs = ReadMetadataClassArray<Il2CppImageDefinition>(header.imagesOffset, header.imagesCount);
             *      if (imageDefs.Any(x => x.token != 1))
             *      {
             *          Version = 24.1f;
             *      }
             *  }
             * }*/
            imageDefs     = ReadMetadataClassArray <Il2CppImageDefinition>(header.imagesOffset, header.imagesCount);
            typeDefs      = ReadMetadataClassArray <Il2CppTypeDefinition>(header.typeDefinitionsOffset, header.typeDefinitionsCount);
            methodDefs    = ReadMetadataClassArray <Il2CppMethodDefinition>(header.methodsOffset, header.methodsCount);
            parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(header.parametersOffset, header.parametersCount);
            fieldDefs     = ReadMetadataClassArray <Il2CppFieldDefinition>(header.fieldsOffset, header.fieldsCount);
            var fieldDefaultValues     = ReadMetadataClassArray <Il2CppFieldDefaultValue>(header.fieldDefaultValuesOffset, header.fieldDefaultValuesCount);
            var parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(header.parameterDefaultValuesOffset, header.parameterDefaultValuesCount);

            fieldDefaultValuesDic     = fieldDefaultValues.ToDictionary(x => x.fieldIndex);
            parameterDefaultValuesDic = parameterDefaultValues.ToDictionary(x => x.parameterIndex);
            propertyDefs      = ReadMetadataClassArray <Il2CppPropertyDefinition>(header.propertiesOffset, header.propertiesCount);
            interfaceIndices  = ReadClassArray <int>(header.interfacesOffset, header.interfacesCount / 4);
            nestedTypeIndices = ReadClassArray <int>(header.nestedTypesOffset, header.nestedTypesCount / 4);
            eventDefs         = ReadMetadataClassArray <Il2CppEventDefinition>(header.eventsOffset, header.eventsCount);
            genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(header.genericContainersOffset, header.genericContainersCount);
            genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(header.genericParametersOffset, header.genericParametersCount);
            constraintIndices = ReadClassArray <int>(header.genericParameterConstraintsOffset, header.genericParameterConstraintsCount / 4);
            vtableMethods     = ReadClassArray <uint>(header.vtableMethodsOffset, header.vtableMethodsCount / 4);
            stringLiterals    = ReadMetadataClassArray <Il2CppStringLiteral>(header.stringLiteralOffset, header.stringLiteralCount);
            if (Version > 16 && Version < 27) //TODO
            {
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(header.metadataUsageListsOffset, header.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(header.metadataUsagePairsOffset, header.metadataUsagePairsCount);

                ProcessingMetadataUsage();

                fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(header.fieldRefsOffset, header.fieldRefsCount);
            }
            if (Version > 20)
            {
                attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(header.attributesInfoOffset, header.attributesInfoCount);
                attributeTypes      = ReadClassArray <int>(header.attributeTypesOffset, header.attributeTypesCount / 4);
            }

            /*if (Version > 24)
             * {
             *  attributeTypeRangesDic = new Dictionary<Il2CppImageDefinition, Dictionary<uint, int>>();
             *  foreach (var imageDef in imageDefs)
             *  {
             *      var dic = new Dictionary<uint, int>();
             *      attributeTypeRangesDic[imageDef] = dic;
             *      var end = imageDef.customAttributeStart + imageDef.customAttributeCount;
             *      for (int i = imageDef.customAttributeStart; i < end; i++)
             *      {
             *          dic.Add(attributeTypeRanges[i].token, i);
             *      }
             *  }
             * }*/
            if (Version <= 24.1f)
            {
                rgctxEntries = ReadMetadataClassArray <Il2CppRGCTXDefinition>(header.rgctxEntriesOffset, header.rgctxEntriesCount);
            }
        }
Exemplo n.º 12
0
        public Metadata(Stream stream, float version, string ogstring, string newstring, string filename) : base(stream)
        {
            inst = this;
            Debug.WriteLine(GetEncodedIndexType(327680));
            //return;
            this.version = version;
            Debug.WriteLine(Position);
            metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>();
            Debug.WriteLine(Position);
            if (metadataHeader.sanity != 0xFAB11BAF)
            {
                throw new Exception("ERROR: Metadata file supplied is not valid metadata file.");
            }
            switch (metadataHeader.version)
            {
            case 16:
            case 19:
            case 20:
            case 21:
            case 22:
            case 23:
            case 24:
                break;

            default:
                throw new Exception($"ERROR: Metadata file supplied is not a supported version[{version}].");
            }
            imageDefs              = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
            typeDefs               = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount);
            methodDefs             = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount);
            parameterDefs          = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount);
            fieldDefs              = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount);
            fieldDefaultValues     = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount);
            parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount);
            propertyDefs           = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount);
            interfaceIndices       = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4);
            nestedTypeIndices      = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4);
            eventDefs              = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount);
            genericContainers      = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount);
            genericParameters      = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount);
            constraintIndices      = ReadClassArray <int>(metadataHeader.genericParameterConstraintsOffset, metadataHeader.genericParameterConstraintsCount / 4);
            if (version > 16)
            {
                //running = true;
                stringLiterals = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount);
                //running = false;
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount);

                ProcessingMetadataUsage();

                fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount);
            }
            if (version > 20)
            {
                attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount);
                attributeTypes      = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4);

                //windowsRuntimeTypeNamesOffsets = ReadClassArray<int>(metadataHeader.windowsRuntimeTypeNamesOffset, metadataHeader.windowsRuntimeTypeNamesSize / 4);
                //exportedTypeDefinitionsOffsets = ReadClassArray<int>(metadataHeader.exportedTypeDefinitionsOffset, metadataHeader.exportedTypeDefinitionsOffset / 4);
            }
            Dictionary <string, long> dic = new Dictionary <string, long>();

            foreach (var item in metadataHeader.GetType().GetFields())
            {
                if (item.Name.ToLower().Contains("offset"))
                {
                    switch (item.FieldType.Name)
                    {
                    case "Int32":
                        dic.Add(item.Name, (int)item.GetValue(metadataHeader));
                        break;

                    case "UInt32":
                        dic.Add(item.Name, (uint)item.GetValue(metadataHeader));
                        break;

                    case "Int16":
                        dic.Add(item.Name, (short)item.GetValue(metadataHeader));
                        break;

                    case "UInt16":
                        dic.Add(item.Name, (ushort)item.GetValue(metadataHeader));
                        break;

                    case "Byte":
                        dic.Add(item.Name, (byte)item.GetValue(metadataHeader));
                        break;

                    case "Int64" when is32Bit:
                        dic.Add(item.Name, (int)item.GetValue(metadataHeader));
                        break;

                    case "Int64":
                        dic.Add(item.Name, (long)item.GetValue(metadataHeader));
                        break;

                    case "UInt64" when is32Bit:
                        dic.Add(item.Name, (uint)item.GetValue(metadataHeader));
                        break;

                    case "UInt64":
                        dic.Add(item.Name, (long)item.GetValue(metadataHeader));
                        break;

                    default:
                        Console.WriteLine("error getting bytes");
                        break;
                    }
                }
            }
            Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(methodDefs[0]));
            Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(methodDefs[1]));
            //File.WriteAllText("strings2.json", Newtonsoft.Json.JsonConvert.SerializeObject(dic.OrderBy(o => o.Value), Newtonsoft.Json.Formatting.Indented));
            File.WriteAllText("strings1.json", Newtonsoft.Json.JsonConvert.SerializeObject(metadataHeader, Newtonsoft.Json.Formatting.Indented));
            File.AppendAllText("strings1.json", BaseStream.Length.ToString());
            //foreach (var str in stringLiterals)

            bool one = false;

            //string ogstring = one ? "servers.php" : ".scpslgame.com/";
            //string newstring = one ? "serverlist" : ".southwoodstudios.com/";
            //string filename = one ? "global-metadata2.dat" : "global-metadata.dat";

            for (int i = 0; i < stringLiterals.Length; i++)
            {
                var str = stringLiterals[i];
                Position = (uint)(metadataHeader.stringLiteralDataOffset + str.dataIndex);
                string data = Encoding.UTF8.GetString(ReadBytes((int)str.length));
                //Debug.WriteLine(data);
                if (data.Equals(ogstring))
                {
                    Console.WriteLine("true");
                    //Position = (uint)(metadataHeader.stringLiteralDataOffset + str.dataIndex);
                    try
                    {
                        File.Delete(filename);
                    }
                    catch (Exception e)
                    {
                    }
                    //Position = (uint)(metadataHeader.stringLiteralDataOffset + str.dataIndex) + (uint)(newstring.Length - str.length);
                    UpdateOffsets(new MemoryStream(), (uint)(metadataHeader.stringLiteralDataOffset + str.dataIndex), (newstring.Length - data.Length), data, newstring);
                    File.WriteAllBytes(filename, ((MemoryStream)fsstream).ToArray());
                    break;
                }
            }
        }
Exemplo n.º 13
0
        public Metadata(Stream stream) : base(stream)
        {
            var sanity = ReadUInt32();

            if (sanity != 0xFAB11BAF)
            {
                throw new InvalidDataException("ERROR: Metadata file supplied is not valid metadata file.");
            }
            var version = ReadInt32();

            if (version < 16 || version > 24)
            {
                throw new NotSupportedException($"ERROR: Metadata file supplied is not a supported version[{version}].");
            }
            Version        = version;
            metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(0);
            if (version == 24)
            {
                if (metadataHeader.stringLiteralOffset == 264)
                {
                    Version        = 24.2f;
                    metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(0);
                }
                else
                {
                    imageDefs = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
                    if (imageDefs.Any(x => x.token != 1))
                    {
                        Version = 24.1f;
                    }
                }
            }
            imageDefs              = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
            typeDefs               = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount);
            methodDefs             = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount);
            parameterDefs          = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount);
            fieldDefs              = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount);
            fieldDefaultValues     = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount);
            parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount);
            propertyDefs           = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount);
            interfaceIndices       = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4);
            nestedTypeIndices      = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4);
            eventDefs              = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount);
            genericContainers      = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount);
            genericParameters      = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount);
            constraintIndices      = ReadClassArray <int>(metadataHeader.genericParameterConstraintsOffset, metadataHeader.genericParameterConstraintsCount / 4);
            if (Version > 16)
            {
                stringLiterals     = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount);
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount);

                ProcessingMetadataUsage();

                fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount);
            }
            if (Version > 20)
            {
                attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount);
                attributeTypes      = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4);
            }
        }