Beispiel #1
0
        private Il2CppMetadata(MemoryStream stream) : base(stream)
        {
            metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(-1);
            if (metadataHeader.magicNumber != 0xFAB11BAF)
            {
                throw new Exception("ERROR: Magic number mismatch. Expecting " + 0xFAB11BAF + " but got " + metadataHeader.magicNumber);
            }

            if (metadataHeader.version < 24)
            {
                throw new Exception("ERROR: Invalid metadata version, we only support v24+, this metadata is using v" + metadataHeader.version);
            }

            Console.Write("\tReading image definitions...");
            var start = DateTime.Now;

            imageDefinitions = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading type definitions...");
            start    = DateTime.Now;
            typeDefs = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount);
            Console.WriteLine($"{typeDefs.Length} OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading interface offsets...");
            start            = DateTime.Now;
            interfaceOffsets = ReadMetadataClassArray <Il2CppInterfaceOffset>(metadataHeader.interfaceOffsetsOffset, metadataHeader.interfaceOffsetsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading method definitions...");
            start      = DateTime.Now;
            methodDefs = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading method parameter definitions...");
            start         = DateTime.Now;
            parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading field definitions...");
            start     = DateTime.Now;
            fieldDefs = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading default field values...");
            start = DateTime.Now;
            fieldDefaultValues = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading default parameter values...");
            start = DateTime.Now;
            parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading property definitions...");
            start        = DateTime.Now;
            propertyDefs = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading interface definitions...");
            start            = DateTime.Now;
            interfaceIndices = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading nested type definitions...");
            start             = DateTime.Now;
            nestedTypeIndices = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading event definitions...");
            start     = DateTime.Now;
            eventDefs = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading generic container definitions...");
            start             = DateTime.Now;
            genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading generic parameter definitions...");
            start             = DateTime.Now;
            genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            //v17+ fields
            Console.Write("\tReading string definitions...");
            start          = DateTime.Now;
            stringLiterals = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            //Removed in v27 (2020.2)
            if (LibCpp2IlMain.MetadataVersion < 27f)
            {
                Console.Write("\tReading usage data...");
                start = DateTime.Now;
                metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount);
                metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount);

                DecipherMetadataUsage();
                Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");
            }

            Console.Write("\tReading field references...");
            start     = DateTime.Now;
            fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            //v21+ fields
            Console.Write("\tReading attribute types...");
            start = DateTime.Now;
            attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount);
            attributeTypes      = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tBuilding Lookup Table for field defaults...");
            start = DateTime.Now;
            foreach (var il2CppFieldDefaultValue in fieldDefaultValues)
            {
                _fieldDefaultValueLookup[il2CppFieldDefaultValue.fieldIndex] = il2CppFieldDefaultValue;
            }
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");
        }
Beispiel #2
0
        private Il2CppMetadata(Stream stream) : base(stream)
        {
            metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(-1);
            if (metadataHeader.magicNumber != 0xFAB11BAF)
            {
                throw new Exception("ERROR: Magic number mismatch. Expecting " + 0xFAB11BAF + " but got " + metadataHeader.magicNumber);
            }

            if (metadataHeader.version != 24)
            {
                throw new Exception("ERROR: Invalid metadata version, unity only uses 24, we got " + metadataHeader.version);
            }

            Console.Write("\tReading image definitions...");
            var start = DateTime.Now;

            assemblyDefinitions = ReadMetadataClassArray <Il2CppAssemblyDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading type definitions...");
            start    = DateTime.Now;
            typeDefs = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading interface offsets...");
            start            = DateTime.Now;
            interfaceOffsets = ReadMetadataClassArray <Il2CppInterfaceOffset>(metadataHeader.interfaceOffsetsOffset, metadataHeader.interfaceOffsetsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading method definitions...");
            start      = DateTime.Now;
            methodDefs = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading method parameter definitions...");
            start         = DateTime.Now;
            parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading field definitions...");
            start     = DateTime.Now;
            fieldDefs = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading default field values...");
            start = DateTime.Now;
            fieldDefaultValues = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading default parameter values...");
            start = DateTime.Now;
            parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading property definitions...");
            start        = DateTime.Now;
            propertyDefs = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading interface definitions...");
            start            = DateTime.Now;
            interfaceIndices = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading nested type definitions...");
            start             = DateTime.Now;
            nestedTypeIndices = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading event definitions...");
            start     = DateTime.Now;
            eventDefs = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading generic container definitions...");
            start             = DateTime.Now;
            genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading generic parameter definitions...");
            start             = DateTime.Now;
            genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            //v17+ fields
            Console.Write("\tReading string definitions...");
            start          = DateTime.Now;
            stringLiterals = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading usage data...");
            start = DateTime.Now;
            metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount);
            metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount);

            DecipherMetadataUsage();
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            Console.Write("\tReading field references...");
            start     = DateTime.Now;
            fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");

            //v21+ fields
            Console.Write("\tReading attribute types...");
            start = DateTime.Now;
            attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount);
            attributeTypes      = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4);
            Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)");
        }