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

@@ -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;