Inspector: Load Assembly and AssemblyName metadata

This commit is contained in:
Katy Coe
2019-11-11 01:04:44 +01:00
parent 92c4dd342c
commit eb334751f9
2 changed files with 51 additions and 1 deletions

View File

@@ -18,6 +18,7 @@ namespace Il2CppInspector
{ {
public Il2CppGlobalMetadataHeader Header; public Il2CppGlobalMetadataHeader Header;
public Il2CppAssemblyDefinition[] Assemblies { get; }
public Il2CppImageDefinition[] Images { get; } public Il2CppImageDefinition[] Images { get; }
public Il2CppTypeDefinition[] Types { get; } public Il2CppTypeDefinition[] Types { get; }
public Il2CppMethodDefinition[] Methods { get; } public Il2CppMethodDefinition[] Methods { get; }
@@ -94,6 +95,7 @@ namespace Il2CppInspector
throw new InvalidOperationException("ERROR: Could not verify the integrity of the metadata file image list"); throw new InvalidOperationException("ERROR: Could not verify the integrity of the metadata file image list");
} }
Assemblies = ReadArray<Il2CppAssemblyDefinition>(Header.assembliesOffset, Header.assembliesCount / Sizeof(typeof(Il2CppAssemblyDefinition)));
Types = ReadArray<Il2CppTypeDefinition>(Header.typeDefinitionsOffset, Header.typeDefinitionsCount / Sizeof(typeof(Il2CppTypeDefinition))); Types = ReadArray<Il2CppTypeDefinition>(Header.typeDefinitionsOffset, Header.typeDefinitionsCount / Sizeof(typeof(Il2CppTypeDefinition)));
Methods = ReadArray<Il2CppMethodDefinition>(Header.methodsOffset, Header.methodsCount / Sizeof(typeof(Il2CppMethodDefinition))); Methods = ReadArray<Il2CppMethodDefinition>(Header.methodsOffset, Header.methodsCount / Sizeof(typeof(Il2CppMethodDefinition)));
Params = ReadArray<Il2CppParameterDefinition>(Header.parametersOffset, Header.parametersCount / Sizeof(typeof(Il2CppParameterDefinition))); Params = ReadArray<Il2CppParameterDefinition>(Header.parametersOffset, Header.parametersCount / Sizeof(typeof(Il2CppParameterDefinition)));
@@ -135,8 +137,19 @@ namespace Il2CppInspector
if (i.FieldType == typeof(int) || i.FieldType == typeof(uint)) if (i.FieldType == typeof(int) || i.FieldType == typeof(uint))
size += 4; size += 4;
if (i.FieldType == typeof(short) || i.FieldType == typeof(ushort)) else if (i.FieldType == typeof(short) || i.FieldType == typeof(ushort))
size += 2; size += 2;
// Fixed-length array
else if (i.FieldType.IsArray) {
var attr = i.GetCustomAttribute<ArrayLengthAttribute>(false) ??
throw new InvalidOperationException("Array field " + i.Name + " must have ArrayLength attribute");
size += attr.FixedSize;
}
// Embedded object
else
size += Sizeof(i.FieldType);
} }
return size; return size;
} }

View File

@@ -9,11 +9,16 @@ using NoisyCowStudios.Bin2Object;
namespace Il2CppInspector namespace Il2CppInspector
{ {
// Unity 4.6.1p5 - first release, no global-metadata.dat
// Unity 5.2.0f3 -> v15
// Unity 5.6.2p3 -> v23 // Unity 5.6.2p3 -> v23
// Unity 5.6.4f1 -> v23 // Unity 5.6.4f1 -> v23
// Unity 2017.2f3 -> v24 // Unity 2017.2f3 -> v24
// Unity 2018.2.0f2 -> v24
// Unity 2018.3.0f2 -> v24.1 // Unity 2018.3.0f2 -> v24.1
// Unity 2019.2.8f1 -> v24.2 // Unity 2019.2.8f1 -> v24.2
// https://unity3d.com/get-unity/download/archive
// Metadata version is written at the end of Unity.IL2CPP.MetadataCacheWriter.WriteLibIl2CppMetadata (Unity.IL2CPP.dll)
// From il2cpp-metadata.h // From il2cpp-metadata.h
#pragma warning disable CS0649 #pragma warning disable CS0649
@@ -33,14 +38,18 @@ namespace Il2CppInspector
public int propertiesCount; public int propertiesCount;
public int methodsOffset; // Il2CppMethodDefinition public int methodsOffset; // Il2CppMethodDefinition
public int methodsCount; public int methodsCount;
public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue public int parameterDefaultValuesOffset; // Il2CppParameterDefaultValue
public int parameterDefaultValuesCount; public int parameterDefaultValuesCount;
public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue public int fieldDefaultValuesOffset; // Il2CppFieldDefaultValue
public int fieldDefaultValuesCount; public int fieldDefaultValuesCount;
public int fieldAndParameterDefaultValueDataOffset; // uint8_t public int fieldAndParameterDefaultValueDataOffset; // uint8_t
public int fieldAndParameterDefaultValueDataCount; public int fieldAndParameterDefaultValueDataCount;
public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize public int fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize
public int fieldMarshaledSizesCount; public int fieldMarshaledSizesCount;
public int parametersOffset; // Il2CppParameterDefinition public int parametersOffset; // Il2CppParameterDefinition
public int parametersCount; public int parametersCount;
public int fieldsOffset; // Il2CppFieldDefinition public int fieldsOffset; // Il2CppFieldDefinition
@@ -146,6 +155,34 @@ namespace Il2CppInspector
} }
#pragma warning restore CS0649 #pragma warning restore CS0649
// Renamed from Il2CppAssembly somewhere after Unity 2017.2f3 up to Unity 2018.2.0f2
public class Il2CppAssemblyDefinition
{
public int imageIndex;
public uint token;
public int referencedAssemblyStart;
public int referencedAssemblyCount;
public Il2CppAssemblyNameDefinition aname;
}
// Renamed from Il2CppAssemblyName somewhere after Unity 2017.2f3 up to Unity 2018.2.0f2
public class Il2CppAssemblyNameDefinition
{
public uint nameIndex;
public uint cultureIndex;
public uint hashValueIndex;
public uint publicKeyIndex;
public uint hash_alg;
public int hash_len;
public uint flags;
public int major;
public int minor;
public int build;
public int revision;
[ArrayLength(FixedSize = 8)]
public byte[] publicKeyToken;
}
public class Il2CppTypeDefinition public class Il2CppTypeDefinition
{ {
public int nameIndex; public int nameIndex;