IL2CPP: Read metadata v15 correctly

This commit is contained in:
Katy Coe
2019-11-11 01:33:03 +01:00
parent eb334751f9
commit e923a51fc0
2 changed files with 25 additions and 3 deletions

View File

@@ -78,7 +78,8 @@ namespace Il2CppInspector
} }
// Load all the relevant metadata using offsets provided in the header // Load all the relevant metadata using offsets provided in the header
Images = ReadArray<Il2CppImageDefinition>(Header.imagesOffset, Header.imagesCount / Sizeof(typeof(Il2CppImageDefinition))); if (Version >= 16)
Images = ReadArray<Il2CppImageDefinition>(Header.imagesOffset, Header.imagesCount / Sizeof(typeof(Il2CppImageDefinition)));
// As an additional sanity check, all images in the metadata should have Mono.Cecil.MetadataToken == 1 // As an additional sanity check, all images in the metadata should have Mono.Cecil.MetadataToken == 1
// In metadata v24.1, two extra fields were added which will cause the below test to fail. // In metadata v24.1, two extra fields were added which will cause the below test to fail.
@@ -95,13 +96,11 @@ namespace Il2CppInspector
throw new InvalidOperationException("ERROR: Could not verify the integrity of the metadata file image list"); throw new InvalidOperationException("ERROR: Could not verify the integrity of the metadata file image list");
} }
Assemblies = ReadArray<Il2CppAssemblyDefinition>(Header.assembliesOffset, Header.assembliesCount / Sizeof(typeof(Il2CppAssemblyDefinition)));
Types = ReadArray<Il2CppTypeDefinition>(Header.typeDefinitionsOffset, Header.typeDefinitionsCount / Sizeof(typeof(Il2CppTypeDefinition))); Types = ReadArray<Il2CppTypeDefinition>(Header.typeDefinitionsOffset, Header.typeDefinitionsCount / Sizeof(typeof(Il2CppTypeDefinition)));
Methods = ReadArray<Il2CppMethodDefinition>(Header.methodsOffset, Header.methodsCount / Sizeof(typeof(Il2CppMethodDefinition))); Methods = ReadArray<Il2CppMethodDefinition>(Header.methodsOffset, Header.methodsCount / Sizeof(typeof(Il2CppMethodDefinition)));
Params = ReadArray<Il2CppParameterDefinition>(Header.parametersOffset, Header.parametersCount / Sizeof(typeof(Il2CppParameterDefinition))); Params = ReadArray<Il2CppParameterDefinition>(Header.parametersOffset, Header.parametersCount / Sizeof(typeof(Il2CppParameterDefinition)));
Fields = ReadArray<Il2CppFieldDefinition>(Header.fieldsOffset, Header.fieldsCount / Sizeof(typeof(Il2CppFieldDefinition))); Fields = ReadArray<Il2CppFieldDefinition>(Header.fieldsOffset, Header.fieldsCount / Sizeof(typeof(Il2CppFieldDefinition)));
FieldDefaultValues = ReadArray<Il2CppFieldDefaultValue>(Header.fieldDefaultValuesOffset, Header.fieldDefaultValuesCount / Sizeof(typeof(Il2CppFieldDefaultValue))); FieldDefaultValues = ReadArray<Il2CppFieldDefaultValue>(Header.fieldDefaultValuesOffset, Header.fieldDefaultValuesCount / Sizeof(typeof(Il2CppFieldDefaultValue)));
ParameterDefaultValues = ReadArray<Il2CppParameterDefaultValue>(Header.parameterDefaultValuesOffset, Header.parameterDefaultValuesCount / Sizeof(typeof(Il2CppParameterDefaultValue)));
Properties = ReadArray<Il2CppPropertyDefinition>(Header.propertiesOffset, Header.propertiesCount / Sizeof(typeof(Il2CppPropertyDefinition))); Properties = ReadArray<Il2CppPropertyDefinition>(Header.propertiesOffset, Header.propertiesCount / Sizeof(typeof(Il2CppPropertyDefinition)));
Events = ReadArray<Il2CppEventDefinition>(Header.eventsOffset, Header.eventsCount / Sizeof(typeof(Il2CppEventDefinition))); Events = ReadArray<Il2CppEventDefinition>(Header.eventsOffset, Header.eventsCount / Sizeof(typeof(Il2CppEventDefinition)));
InterfaceUsageIndices = ReadArray<int>(Header.interfacesOffset, Header.interfacesCount / sizeof(int)); InterfaceUsageIndices = ReadArray<int>(Header.interfacesOffset, Header.interfacesCount / sizeof(int));
@@ -109,6 +108,10 @@ namespace Il2CppInspector
GenericContainers = ReadArray<Il2CppGenericContainer>(Header.genericContainersOffset, Header.genericContainersCount / Sizeof(typeof(Il2CppGenericContainer))); GenericContainers = ReadArray<Il2CppGenericContainer>(Header.genericContainersOffset, Header.genericContainersCount / Sizeof(typeof(Il2CppGenericContainer)));
GenericParameters = ReadArray<Il2CppGenericParameter>(Header.genericParametersOffset, Header.genericParametersCount / Sizeof(typeof(Il2CppGenericParameter))); GenericParameters = ReadArray<Il2CppGenericParameter>(Header.genericParametersOffset, Header.genericParametersCount / Sizeof(typeof(Il2CppGenericParameter)));
if (Version >= 16) {
Assemblies = ReadArray<Il2CppAssemblyDefinition>(Header.assembliesOffset, Header.assembliesCount / Sizeof(typeof(Il2CppAssemblyDefinition)));
ParameterDefaultValues = ReadArray<Il2CppParameterDefaultValue>(Header.parameterDefaultValuesOffset, Header.parameterDefaultValuesCount / Sizeof(typeof(Il2CppParameterDefaultValue)));
}
if (Version >= 21) { if (Version >= 21) {
AttributeTypeIndices = ReadArray<int>(Header.attributeTypesOffset, Header.attributeTypesCount / sizeof(int)); AttributeTypeIndices = ReadArray<int>(Header.attributeTypesOffset, Header.attributeTypesCount / sizeof(int));
AttributeTypeRanges = ReadArray<Il2CppCustomAttributeTypeRange>(Header.attributesInfoOffset, Header.attributesInfoCount / Sizeof(typeof(Il2CppCustomAttributeTypeRange))); AttributeTypeRanges = ReadArray<Il2CppCustomAttributeTypeRange>(Header.attributesInfoOffset, Header.attributesInfoCount / Sizeof(typeof(Il2CppCustomAttributeTypeRange)));

View File

@@ -11,6 +11,8 @@ namespace Il2CppInspector
{ {
// Unity 4.6.1p5 - first release, no global-metadata.dat // Unity 4.6.1p5 - first release, no global-metadata.dat
// Unity 5.2.0f3 -> v15 // Unity 5.2.0f3 -> v15
// Unity 5.3.0f1 -> v16
// ..
// Unity 5.6.2p3 -> v23 // Unity 5.6.2p3 -> v23
// Unity 5.6.4f1 -> v23 // Unity 5.6.4f1 -> v23
// Unity 2017.2f3 -> v24 // Unity 2017.2f3 -> v24
@@ -39,7 +41,9 @@ namespace Il2CppInspector
public int methodsOffset; // Il2CppMethodDefinition public int methodsOffset; // Il2CppMethodDefinition
public int methodsCount; public int methodsCount;
[Version(Min = 16)]
public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue
[Version(Min = 16)]
public int parameterDefaultValuesCount; public int parameterDefaultValuesCount;
public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue
@@ -47,7 +51,9 @@ namespace Il2CppInspector
public int fieldAndParameterDefaultValueDataOffset; // uint8_t public int fieldAndParameterDefaultValueDataOffset; // uint8_t
public int fieldAndParameterDefaultValueDataCount; public int fieldAndParameterDefaultValueDataCount;
[Version(Min = 16)]
public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize
[Version(Min = 16)]
public int fieldMarshaledSizesCount; public int fieldMarshaledSizesCount;
public int parametersOffset; // Il2CppParameterDefinition public int parametersOffset; // Il2CppParameterDefinition
@@ -76,9 +82,13 @@ namespace Il2CppInspector
[Version(Max = 24.1)] [Version(Max = 24.1)]
public int rgctxEntriesCount; public int rgctxEntriesCount;
[Version(Min = 16)]
public int imagesOffset; // Il2CppImageDefinition public int imagesOffset; // Il2CppImageDefinition
[Version(Min = 16)]
public int imagesCount; public int imagesCount;
[Version(Min = 16)]
public int assembliesOffset; // Il2CppAssemblyDefinition public int assembliesOffset; // Il2CppAssemblyDefinition
[Version(Min = 16)]
public int assembliesCount; public int assembliesCount;
[Version(Min = 19)] [Version(Min = 19)]
@@ -159,7 +169,13 @@ namespace Il2CppInspector
public class Il2CppAssemblyDefinition public class Il2CppAssemblyDefinition
{ {
public int imageIndex; public int imageIndex;
[Version(Min = 19)]
public uint token; public uint token;
[Version(Max = 24.0)]
public int customAttributeIndex;
public int referencedAssemblyStart; public int referencedAssemblyStart;
public int referencedAssemblyCount; public int referencedAssemblyCount;
public Il2CppAssemblyNameDefinition aname; public Il2CppAssemblyNameDefinition aname;
@@ -253,7 +269,10 @@ namespace Il2CppInspector
public class Il2CppMethodDefinition public class Il2CppMethodDefinition
{ {
public int nameIndex; public int nameIndex;
[Version(Min = 16)]
public int declaringType; public int declaringType;
public int returnType; public int returnType;
public int parameterStart; public int parameterStart;