Struct reading and disassembly script overhaul, various misc. loading fixes, bump to .NET 9 (#13)
* Bump projects to .net 9 and update nugets * add VersionedSerialization + source generator * migrate versioning to StructVersion class, add handling/detection for 29.2/31.2 * add new struct definitions * rename serialization methods and add BinaryObjectStreamReader for interop * Rework metadata struct loading to use new struct versioning * move 29/31.1/.2 to use tags (-2022,-2023) instead of minor versions * fix metadata usage validity checks * rework code registration offsetting a bit and add second 29/31.1 condition * tweak .1 condition (again) * 29/31.2 was a psyop * also remove 29.2 from the readme * remove loading of packed dlls - this was a very unsafe feature * support auto-recovering type indices from type handles fixes loading of memory-dumped v29+ libraries since those replacee their class indices on load with a pointer to the corresponding type * support loading PEs without an export table * also read UnresolvedVirtualCallCount on regular v31 * Disable plugin loading for now * Overhaul disassembler script + add Binary Ninja target (#12) * Overhaul diassembler scripts: - No longer defines top level functions - Split into three classes: StatusHandler (like before), DisassemblerInterface (for interfacing with the used program API), ScriptContext (for definiting general functions that use the disassembler interface) - Add type annotations to all class methods and remove 2.7 compatibility stuff (Ghidra now supports Python 3 so this is unnecessary anymore) - Disassembler backends are now responsible for launching metadata/script processing, to better support disassembler differences - String handling is back in the base ScriptContext class, disassembler interfaces opt into the fake string segment creation and fall back to the old method if it isn't supported * Add Binary Ninja disassembler script backend This uses the new backend-controlled execution to launch metadata processing on a background thread to keep the ui responsive * make binary ninja script use own _BINARYNINJA_ define and add define helpers to header * Update README to account for new script and binary ninja backend * implement fake string segment functions for binary ninja but don't advertise support * also cache API function types in binary ninja backend * fix ida script and disable folders again * Fix metadata usage issues caused by it being a value type now * make TryMapVATR overrideable and implement it for ELFs * Make field offset reading use TryMapVATR to reduce exceptions * Fix NRE in Assembly ctor on < v24.2 * Update actions workflow to produce cross-platform CLI binaries, update readme to reflect .net 9 changes * workflow: only restore packages for projects that are being built * workflow: tweak caching and fix gui compilation * workflow: remove double .zip in CLI artifact name * 29/31.2 don't actually exist, this logic is not needed
This commit is contained in:
@@ -12,6 +12,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using dnlib.DotNet;
|
||||
using dnlib.DotNet.Emit;
|
||||
using Il2CppInspector.Next;
|
||||
using Il2CppInspector.Reflection;
|
||||
|
||||
namespace Il2CppInspector.Outputs
|
||||
@@ -186,7 +187,7 @@ namespace Il2CppInspector.Outputs
|
||||
};
|
||||
|
||||
if (mType.IsExplicitLayout || mType.IsSequentialLayout)
|
||||
mType.ClassLayout = new ClassLayoutUser(1, (uint)type.Sizes.nativeSize);
|
||||
mType.ClassLayout = new ClassLayoutUser(1, (uint)type.Sizes.NativeSize);
|
||||
|
||||
// Add nested types
|
||||
foreach (var nestedType in type.DeclaredNestedTypes)
|
||||
@@ -241,7 +242,7 @@ namespace Il2CppInspector.Outputs
|
||||
AddMethod(module, mType, method);
|
||||
|
||||
// Add token attribute
|
||||
if (type.Definition != null)
|
||||
if (type.Definition.IsValid)
|
||||
mType.AddAttribute(module, tokenAttribute, ("Token", $"0x{type.MetadataToken:X8}"));
|
||||
|
||||
// Add custom attribute attributes
|
||||
@@ -269,7 +270,7 @@ namespace Il2CppInspector.Outputs
|
||||
if (field.HasFieldRVA) {
|
||||
// Attempt to get field size
|
||||
|
||||
var fieldSize = field.FieldType.Sizes.nativeSize;
|
||||
var fieldSize = field.FieldType.Sizes.NativeSize;
|
||||
var preview = model.Package.Metadata.ReadBytes((long) field.DefaultValueMetadataAddress, fieldSize);
|
||||
|
||||
mField.InitialValue = preview;
|
||||
@@ -310,7 +311,7 @@ namespace Il2CppInspector.Outputs
|
||||
|
||||
// Add token attribute
|
||||
// Generic properties and constructed properties (from disperate get/set methods) have no definition
|
||||
if (prop.Definition != null)
|
||||
if (prop.Definition.IsValid)
|
||||
mProp.AddAttribute(module, tokenAttribute, ("Token", $"0x{prop.MetadataToken:X8}"));
|
||||
|
||||
// Add custom attribute attributes
|
||||
@@ -432,8 +433,8 @@ namespace Il2CppInspector.Outputs
|
||||
("Offset", string.Format("0x{0:X}", model.Package.BinaryImage.MapVATR(method.VirtualAddress.Value.Start))),
|
||||
("VA", method.VirtualAddress.Value.Start.ToAddressString())
|
||||
};
|
||||
if (method.Definition.slot != ushort.MaxValue)
|
||||
args.Add(("Slot", method.Definition.slot.ToString()));
|
||||
if (method.Definition.Slot != ushort.MaxValue)
|
||||
args.Add(("Slot", method.Definition.Slot.ToString()));
|
||||
|
||||
mMethod.AddAttribute(module, addressAttribute, args.ToArray());
|
||||
}
|
||||
@@ -591,7 +592,7 @@ namespace Il2CppInspector.Outputs
|
||||
// Create folder for DLLs
|
||||
Directory.CreateDirectory(outputPath);
|
||||
|
||||
if (model.Package.Version >= 29)
|
||||
if (model.Package.Version >= MetadataVersions.V290)
|
||||
{
|
||||
// We can now apply all attributes directly.
|
||||
directApplyAttributes = model.TypesByDefinitionIndex
|
||||
@@ -648,7 +649,7 @@ namespace Il2CppInspector.Outputs
|
||||
AddCustomAttribute(module, module.Assembly, ca);
|
||||
|
||||
// Add token attributes
|
||||
module.AddAttribute(module, tokenAttribute, ("Token", $"0x{asm.ImageDefinition.token:X8}"));
|
||||
module.AddAttribute(module, tokenAttribute, ("Token", $"0x{asm.ImageDefinition.Token:X8}"));
|
||||
module.Assembly.AddAttribute(module, tokenAttribute, ("Token", $"0x{asm.MetadataToken:X8}"));
|
||||
|
||||
if (types.TryGetValue(module, out var shallowTypes))
|
||||
|
||||
Reference in New Issue
Block a user