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); } }
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))); }
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); } }
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); } }
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); }
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; }
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); } }
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); } }
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); } }
public MetadataStringDecryptor(Il2CppGlobalMetadataHeader p_Header) { InitSeed(p_Header); InitKeys(p_Header); }
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); } }
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; } } }
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); } }