From aafbfc946de9d20bd008e60edda2a9b7efb9ede9 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Tue, 28 Jan 2020 00:30:47 +0100 Subject: [PATCH] IL2CPP: Fix incorrect resolution of FieldRefs in MetadataUsages --- Il2CppInspector/IL2CPP/Il2CppInspector.cs | 1 + Il2CppInspector/IL2CPP/Il2CppModel.cs | 10 +++++----- Il2CppInspector/IL2CPP/Metadata.cs | 2 ++ Il2CppInspector/IL2CPP/MetadataClasses.cs | 6 ++++++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Il2CppInspector/IL2CPP/Il2CppInspector.cs b/Il2CppInspector/IL2CPP/Il2CppInspector.cs index 1276c90..ef8d49e 100644 --- a/Il2CppInspector/IL2CPP/Il2CppInspector.cs +++ b/Il2CppInspector/IL2CPP/Il2CppInspector.cs @@ -51,6 +51,7 @@ namespace Il2CppInspector public int[] NestedTypeIndices => Metadata.NestedTypeIndices; public int[] AttributeTypeIndices => Metadata.AttributeTypeIndices; public uint[] VTableMethodIndices => Metadata.VTableMethodIndices; + public Il2CppFieldRef[] FieldRefs => Metadata.FieldRefs; public Dictionary FieldDefaultValue { get; } = new Dictionary(); public Dictionary ParameterDefaultValue { get; } = new Dictionary(); public List FieldOffsets { get; } diff --git a/Il2CppInspector/IL2CPP/Il2CppModel.cs b/Il2CppInspector/IL2CPP/Il2CppModel.cs index f04de91..a6c9bb6 100644 --- a/Il2CppInspector/IL2CPP/Il2CppModel.cs +++ b/Il2CppInspector/IL2CPP/Il2CppModel.cs @@ -143,11 +143,11 @@ namespace Il2CppInspector.Reflection var method = MethodsByDefinitionIndex[usage.SourceIndex]; return $"{method.DeclaringType.Name}.{method.Name}"; - case MetadataUsageType.FieldInfo: - var field = Package.Fields[usage.SourceIndex]; - type = GetTypeFromUsage(field.typeIndex); - var fieldName = Package.Strings[field.nameIndex]; - return $"{type.Name}.{fieldName}"; + case MetadataUsageType.FieldInfo: + var fieldRef = Package.FieldRefs[usage.SourceIndex]; + type = GetTypeFromUsage(fieldRef.typeIndex); + var field = type.DeclaredFields.First(f => f.Index == type.Definition.fieldStart + fieldRef.fieldIndex); + return $"{type.Name}.{field.Name}"; case MetadataUsageType.StringLiteral: return Package.StringLiterals[usage.SourceIndex]; diff --git a/Il2CppInspector/IL2CPP/Metadata.cs b/Il2CppInspector/IL2CPP/Metadata.cs index 55397ef..4d03401 100644 --- a/Il2CppInspector/IL2CPP/Metadata.cs +++ b/Il2CppInspector/IL2CPP/Metadata.cs @@ -36,6 +36,7 @@ namespace Il2CppInspector public Il2CppInterfaceOffsetPair[] InterfaceOffsets { get; } public Il2CppMetadataUsageList[] MetadataUsageLists { get; } public Il2CppMetadataUsagePair[] MetadataUsagePairs { get; } + public Il2CppFieldRef[] FieldRefs { get; } public int[] InterfaceUsageIndices { get; } public int[] NestedTypeIndices { get; } @@ -127,6 +128,7 @@ namespace Il2CppInspector if (Version >= 19) { MetadataUsageLists = ReadArray(Header.metadataUsageListsOffset, Header.metadataUsageListsCount / Sizeof(typeof(Il2CppMetadataUsageList))); MetadataUsagePairs = ReadArray(Header.metadataUsagePairsOffset, Header.metadataUsagePairsCount / Sizeof(typeof(Il2CppMetadataUsagePair))); + FieldRefs = ReadArray(Header.fieldRefsOffset, Header.fieldRefsCount / Sizeof(typeof(Il2CppFieldRef))); } if (Version >= 21) { AttributeTypeIndices = ReadArray(Header.attributeTypesOffset, Header.attributeTypesCount / sizeof(int)); diff --git a/Il2CppInspector/IL2CPP/MetadataClasses.cs b/Il2CppInspector/IL2CPP/MetadataClasses.cs index 8f946f0..8c7b553 100644 --- a/Il2CppInspector/IL2CPP/MetadataClasses.cs +++ b/Il2CppInspector/IL2CPP/MetadataClasses.cs @@ -439,4 +439,10 @@ namespace Il2CppInspector public int length; public int dataIndex; } + + public class Il2CppFieldRef + { + public int typeIndex; + public int fieldIndex; // local offset into type fields + } }