Output: IDA Python script generation

IL2CPP: Implement MetadataUsages
This commit is contained in:
Carter Bush
2020-01-27 07:31:21 +11:00
committed by Katy Coe
parent 89a0b2e97f
commit 8045f2cfd7
6 changed files with 204 additions and 2 deletions

View File

@@ -43,6 +43,9 @@ namespace Il2CppInspector
// Generic method specs for vtables
public Il2CppMethodSpec[] MethodSpecs { get; private set; }
// Addresses where metadata is used
public ulong[] MetadataUsages { get; private set; }
// Every defined type
public List<Il2CppType> Types { get; private set; }
@@ -194,6 +197,9 @@ namespace Il2CppInspector
// Generic method specs
MethodSpecs = image.ReadMappedArray<Il2CppMethodSpec>(MetadataRegistration.methodSpecs, (int) MetadataRegistration.methodSpecsCount);
// Metadata usages (addresses)
MetadataUsages = image.ReadMappedArray<ulong>(MetadataRegistration.metadataUsages, (int)MetadataRegistration.metadataUsagesCount);
}
}
}

View File

@@ -42,6 +42,7 @@ namespace Il2CppInspector
public int[] GenericConstraintIndices => Metadata.GenericConstraintIndices;
public Il2CppCustomAttributeTypeRange[] AttributeTypeRanges => Metadata.AttributeTypeRanges;
public Il2CppInterfaceOffsetPair[] InterfaceOffsets => Metadata.InterfaceOffsets;
public List<MetadataUsage> MetadataUsages => Metadata.MetadataUsages;
public int[] InterfaceUsageIndices => Metadata.InterfaceUsageIndices;
public int[] NestedTypeIndices => Metadata.NestedTypeIndices;
public int[] AttributeTypeIndices => Metadata.AttributeTypeIndices;
@@ -53,6 +54,7 @@ namespace Il2CppInspector
public Dictionary<string, Il2CppCodeGenModule> Modules => Binary.Modules;
public ulong[] CustomAttributeGenerators => Binary.CustomAttributeGenerators;
public Il2CppMethodSpec[] MethodSpecs => Binary.MethodSpecs;
public ulong[] BinaryMetadataUsages => Binary.MetadataUsages;
// TODO: Finish all file access in the constructor and eliminate the need for this
public IFileFormatReader BinaryImage => Binary.Image;
@@ -274,4 +276,28 @@ namespace Il2CppInspector
return processors;
}
}
public enum MetadataUsageType
{
TypeInfo = 1,
Type = 2,
MethodDef = 3,
FieldInfo = 4,
StringLiteral = 5,
MethodRef = 6,
}
public class MetadataUsage
{
public MetadataUsageType Type { get; }
public int SourceIndex { get; }
public int DestinationIndex { get; }
public MetadataUsage(MetadataUsageType type, int sourceIndex, int destinationIndex)
{
Type = type;
SourceIndex = sourceIndex;
DestinationIndex = destinationIndex;
}
}
}

View File

@@ -32,6 +32,8 @@ namespace Il2CppInspector
public Il2CppGenericParameter[] GenericParameters { get; }
public Il2CppCustomAttributeTypeRange[] AttributeTypeRanges { get; }
public Il2CppInterfaceOffsetPair[] InterfaceOffsets { get; }
public Il2CppMetadataUsageList[] MetadataUsageLists { get; }
public Il2CppMetadataUsagePair[] MetadataUsagePairs { get; }
public int[] InterfaceUsageIndices { get; }
public int[] NestedTypeIndices { get; }
@@ -40,6 +42,7 @@ namespace Il2CppInspector
public uint[] VTableMethodIndices { get; }
public Dictionary<int, string> Strings { get; } = new Dictionary<int, string>();
public List<MetadataUsage> MetadataUsages { get; } = new List<MetadataUsage>();
public Metadata(Stream stream) : base(stream)
{
@@ -118,6 +121,11 @@ namespace Il2CppInspector
Assemblies = ReadArray<Il2CppAssemblyDefinition>(Header.assembliesOffset, Header.assembliesCount / Sizeof(typeof(Il2CppAssemblyDefinition)));
ParameterDefaultValues = ReadArray<Il2CppParameterDefaultValue>(Header.parameterDefaultValuesOffset, Header.parameterDefaultValuesCount / Sizeof(typeof(Il2CppParameterDefaultValue)));
}
if (Version >= 19) {
MetadataUsageLists = ReadArray<Il2CppMetadataUsageList>(Header.metadataUsageListsOffset, Header.metadataUsageListsCount / Sizeof(typeof(Il2CppMetadataUsageList)));
MetadataUsagePairs = ReadArray<Il2CppMetadataUsagePair>(Header.metadataUsagePairsOffset, Header.metadataUsagePairsCount / Sizeof(typeof(Il2CppMetadataUsagePair)));
MetadataUsages = buildMetadataUsages();
}
if (Version >= 21) {
AttributeTypeIndices = ReadArray<int>(Header.attributeTypesOffset, Header.attributeTypesCount / sizeof(int));
AttributeTypeRanges = ReadArray<Il2CppCustomAttributeTypeRange>(Header.attributesInfoOffset, Header.attributesInfoCount / Sizeof(typeof(Il2CppCustomAttributeTypeRange)));
@@ -129,6 +137,28 @@ namespace Il2CppInspector
Strings.Add((int)Position - Header.stringOffset, ReadNullTerminatedString());
}
private List<MetadataUsage> buildMetadataUsages()
{
var usages = new Dictionary<uint, MetadataUsage>();
foreach (var metadataUsageList in MetadataUsageLists)
{
for (var i = 0; i < metadataUsageList.count; i++)
{
var metadataUsagePair = MetadataUsagePairs[metadataUsageList.start + i];
var encodedType = metadataUsagePair.encodedSourceIndex & 0xE0000000;
var usageType = (MetadataUsageType)(encodedType >> 29);
var sourceIndex = metadataUsagePair.encodedSourceIndex & 0x1FFFFFFF;
var destinationIndex = metadataUsagePair.destinationindex;
usages.TryAdd(destinationIndex, new MetadataUsage(usageType, (int)sourceIndex, (int)destinationIndex));
}
}
return usages.Values.ToList();
}
private int Sizeof(Type type)
{
int size = 0;

View File

@@ -421,4 +421,16 @@ namespace Il2CppInspector
public int interfaceTypeIndex;
public int offset;
}
public class Il2CppMetadataUsageList
{
public uint start;
public uint count;
}
public class Il2CppMetadataUsagePair
{
public uint destinationindex;
public uint encodedSourceIndex;
}
}