Output: IDA Python script generation
IL2CPP: Implement MetadataUsages
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user