IL2CPP: Encoded tokens in metadata v27 must be shifted right 1 bit

This commit is contained in:
Katy Coe
2020-08-16 02:35:33 +02:00
parent ec6066aa1d
commit 5f7218f7df
3 changed files with 21 additions and 5 deletions

View File

@@ -127,9 +127,17 @@ namespace Il2CppInspector
return ((ulong) pValue, value); return ((ulong) pValue, value);
} }
// TODO: The resolution of metadata usages is broken for metadata v27 (MetadataUsageLists, MetadataUsagePairs no longer exist)
private List<MetadataUsage> buildMetadataUsages() private List<MetadataUsage> buildMetadataUsages()
{ {
// No metadata usages for versions < 19
if (Version < 19)
return null;
// Metadata usages are lazily initialized during runtime for versions >= 27
if (Version >= 27)
return buildLateBindingMetadataUsages();
// Version >= 19 && <= 24.3
var usages = new Dictionary<uint, MetadataUsage>(); var usages = new Dictionary<uint, MetadataUsage>();
foreach (var metadataUsageList in Metadata.MetadataUsageLists) foreach (var metadataUsageList in Metadata.MetadataUsageLists)
{ {
@@ -150,6 +158,11 @@ namespace Il2CppInspector
return usages.Values.ToList(); return usages.Values.ToList();
} }
public List<MetadataUsage> buildLateBindingMetadataUsages() {
// TODO: Resolve late binding for metadata v27
return null;
}
public Il2CppInspector(Il2CppBinary binary, Metadata metadata) { public Il2CppInspector(Il2CppBinary binary, Metadata metadata) {
// Store stream representations // Store stream representations
Binary = binary; Binary = binary;
@@ -243,8 +256,7 @@ namespace Il2CppInspector
} }
// Merge all metadata usage references into a single distinct list // Merge all metadata usage references into a single distinct list
if (Version >= 19) MetadataUsages = buildMetadataUsages();
MetadataUsages = buildMetadataUsages();
} }
// Get a method pointer if available // Get a method pointer if available

View File

@@ -42,6 +42,10 @@ namespace Il2CppInspector
var encodedType = encodedIndex & 0xE0000000; var encodedType = encodedIndex & 0xE0000000;
usageType = (MetadataUsageType)(encodedType >> 29); usageType = (MetadataUsageType)(encodedType >> 29);
index = encodedIndex & 0x1FFFFFFF; index = encodedIndex & 0x1FFFFFFF;
// From v27 the bottom bit is set to indicate the usage token hasn't been replaced with a pointer at runtime yet
if (package.Version >= 27)
index >>= 1;
} }
return new MetadataUsage(usageType, (int)index); return new MetadataUsage(usageType, (int)index);
} }

View File

@@ -51,7 +51,7 @@ namespace Il2CppInspector.Model
// For il2cpp < 19, the key is the string literal ordinal instead of the address // For il2cpp < 19, the key is the string literal ordinal instead of the address
public Dictionary<ulong, string> Strings { get; } = new Dictionary<ulong, string>(); public Dictionary<ulong, string> Strings { get; } = new Dictionary<ulong, string>();
public bool StringIndexesAreOrdinals => Package.MetadataUsages == null; public bool StringIndexesAreOrdinals => Package.Version < 19;
// The .NET type model for the application // The .NET type model for the application
public TypeModel TypeModel { get; } public TypeModel TypeModel { get; }
@@ -239,7 +239,7 @@ namespace Il2CppInspector.Model
} }
// Add string literals for metadata <19 to the model // Add string literals for metadata <19 to the model
else { if (Package.Version < 19) {
/* Version < 19 calls `il2cpp_codegen_string_literal_from_index` to get string literals. /* Version < 19 calls `il2cpp_codegen_string_literal_from_index` to get string literals.
* Unfortunately, metadata references are just loose globals in Il2CppMetadataUsage.cpp * Unfortunately, metadata references are just loose globals in Il2CppMetadataUsage.cpp
* so we can't automatically name those. Next best thing is to define an enum for the strings. */ * so we can't automatically name those. Next best thing is to define an enum for the strings. */