diff --git a/src/HackF5.UnitySpy/AssemblyImageFactory.cs b/src/HackF5.UnitySpy/AssemblyImageFactory.cs index 6be4dce..efe67c5 100644 --- a/src/HackF5.UnitySpy/AssemblyImageFactory.cs +++ b/src/HackF5.UnitySpy/AssemblyImageFactory.cs @@ -103,7 +103,7 @@ private static AssemblyImage GetAssemblyImage(UnityProcessFacade process, string domain = process.ReadPtr(domainAddress); } //// pointer to array of structs of type _MonoAssembly - var assemblyArrayAddress = process.ReadPtr(domain + process.MonoLibraryOffsets.ReferencedAssemblies); + var assemblyArrayAddress = process.ReadPtr(domain + /*process.MonoLibraryOffsets.ReferencedAssemblies*/160); for (var assemblyAddress = assemblyArrayAddress; assemblyAddress != IntPtr.Zero; assemblyAddress = process.ReadPtr(assemblyAddress + process.SizeOfPtr)) diff --git a/src/HackF5.UnitySpy/Detail/AssemblyImage.cs b/src/HackF5.UnitySpy/Detail/AssemblyImage.cs index 62ae6e2..d6a98bc 100644 --- a/src/HackF5.UnitySpy/Detail/AssemblyImage.cs +++ b/src/HackF5.UnitySpy/Detail/AssemblyImage.cs @@ -81,8 +81,8 @@ private ConcurrentDictionary CreateTypeDefinitions() { var definitions = new ConcurrentDictionary(); int classCache = this.Process.MonoLibraryOffsets.ImageClassCache; - var classCacheSize = this.ReadUInt32(classCache + this.Process.MonoLibraryOffsets.HashTableSize); - var classCacheTableArray = this.ReadPtr(classCache + this.Process.MonoLibraryOffsets.HashTableTable); + var classCacheSize = this.ReadUInt32(/*classCache + this.Process.MonoLibraryOffsets.HashTableSize*/1256); + var classCacheTableArray = this.ReadPtr(1264/*classCache + this.Process.MonoLibraryOffsets.HashTableTable*/); for (var tableItem = 0; tableItem < (classCacheSize * this.Process.SizeOfPtr); @@ -90,7 +90,7 @@ private ConcurrentDictionary CreateTypeDefinitions() { for (var definition = this.Process.ReadPtr(classCacheTableArray + tableItem); definition != IntPtr.Zero; - definition = this.Process.ReadPtr(definition + this.Process.MonoLibraryOffsets.TypeDefinitionNextClassCache)) + definition = this.Process.ReadPtr(definition + /*this.Process.MonoLibraryOffsets.TypeDefinitionNextClassCache*/264)) { definitions.GetOrAdd(definition, new TypeDefinition(this, definition)); } diff --git a/src/HackF5.UnitySpy/Detail/TypeDefinition.cs b/src/HackF5.UnitySpy/Detail/TypeDefinition.cs index be230a0..f7f43cf 100644 --- a/src/HackF5.UnitySpy/Detail/TypeDefinition.cs +++ b/src/HackF5.UnitySpy/Detail/TypeDefinition.cs @@ -65,6 +65,7 @@ public TypeDefinition([NotNull] AssemblyImage image, IntPtr address) // Get the generic type arguments if (this.TypeInfo.TypeCode == TypeCode.GENERICINST) { + this.fieldCount = this.ReadInt32(96); var monoGenericClassAddress = this.TypeInfo.Data; var monoClassAddress = this.Process.ReadPtr(monoGenericClassAddress); this.Image.GetTypeDefinition(monoClassAddress); @@ -159,7 +160,7 @@ public TValue GetStaticValue(string fieldName) try { var vTableMemorySize = this.Process.SizeOfPtr * this.VTableSize; - var valuePtr = this.Process.ReadPtr(this.VTable + this.Process.MonoLibraryOffsets.VTable + vTableMemorySize); + var valuePtr = this.Process.ReadPtr(this.VTable + /*this.Process.MonoLibraryOffsets.VTable*/72 + vTableMemorySize); return field.GetValue(valuePtr); } catch (Exception e) @@ -193,7 +194,7 @@ private IReadOnlyList GetFields() } var fields = new List(); - if (this.ClassKind == MonoClassKind.GInst) + if (this.ClassKind is MonoClassKind.GInst or MonoClassKind.GParam) { fields.AddRange(this.GetGeneric().GetFields()); } @@ -248,13 +249,15 @@ private IEnumerable NestedHierarchy() private TypeDefinition GetGeneric() { - if (this.ClassKind != MonoClassKind.GInst) + if (this.ClassKind is MonoClassKind.GInst or MonoClassKind.GParam) + { + var genericContainerPtr = this.ReadPtr(this.Process.MonoLibraryOffsets.TypeDefinitionMonoGenericClass); + return this.Image.GetTypeDefinition(this.Process.ReadPtr(genericContainerPtr)); + } + else { return null; } - - var genericContainerPtr = this.ReadPtr(this.Process.MonoLibraryOffsets.TypeDefinitionMonoGenericClass); - return this.Image.GetTypeDefinition(this.Process.ReadPtr(genericContainerPtr)); } } } \ No newline at end of file diff --git a/src/HackF5.UnitySpy/Offsets/UnityVersion.cs b/src/HackF5.UnitySpy/Offsets/UnityVersion.cs index e8e9c7b..09f2c94 100644 --- a/src/HackF5.UnitySpy/Offsets/UnityVersion.cs +++ b/src/HackF5.UnitySpy/Offsets/UnityVersion.cs @@ -8,6 +8,7 @@ public struct UnityVersion public static readonly UnityVersion Version2018_4_10 = new UnityVersion(2018, 4, 10); public static readonly UnityVersion Version2019_4_5 = new UnityVersion(2019, 4, 5); public static readonly UnityVersion Version2020_3_13 = new UnityVersion(2020, 3, 13); + public static readonly UnityVersion Version2022_3_10 = new UnityVersion(2022, 3, 10); public UnityVersion(int year, int versionWithinYear, int subversionWithinYear) { diff --git a/src/HackF5.UnitySpy/ProcessFacade/ProcessFacade.cs b/src/HackF5.UnitySpy/ProcessFacade/ProcessFacade.cs index 5b12784..88a1c49 100644 --- a/src/HackF5.UnitySpy/ProcessFacade/ProcessFacade.cs +++ b/src/HackF5.UnitySpy/ProcessFacade/ProcessFacade.cs @@ -308,8 +308,7 @@ private int GetSize(TypeCode typeCode) case TypeCode.U: case TypeCode.U4: - return sizeof(uint); - + return 8; case TypeCode.I8: return sizeof(long);