* Initial commit of new UI c# component
* Initial commit of new UI frontend component
* target WinExe to hide console window in release mode, move ui exe into resources
* force single file publishing and add initial gh workflow for publishing ui
* fix workflow errors
* update dependencies and remove cxxdemangler, as it was outdated
* fix c# single file output due to invalid output path
* smaller tweaks, hack around loops in cpp type layouting
* process other queued exports even if one fails and show error message
* add basic support for processing LC_DYLD_CHAINED_FIXUPS
* ELF loading should not use the file offset for loading the dynamic section
* fix symbol table loading in some modified elfs
* add "start export" button on format selection screen, clear all toasts after selecting an export format
* embed ui executable directly into c# assembly
* only build tauri component in c# release builds
* add il2cpp file (binary, metadata) export to advanced tab
* fix and enable binary ninja fake string segment support
* add support for metadata
* unify logic for getting element type index
* fix new ui not allowing script exports other than ida
* new ui: clear out loaded binary if no IL2CPP images could be loaded
* fix toAddr calls in ghidra script target
* remove dependency on a section being named .text in loaded pe files
* tweak symbol reading a bit and remove sht relocation reading
* add initial support for required forward references in il2cpp types, also fix issues with type names clashing with il2cpp api types
* reduce clang errors for header file, fix better array size struct, emit required forward definitions in header
* expose forward definitions in AppModel, fix issue with method-only used types not being emitted
* remove debug log line
* fix spelling mistakes in gui outputs
* fix il2cpp_array_size_t not being an actual type for later method definitions
* change the default port for new ui dev to 5000
* show current version and hash in new ui footer
* seperate redux ui impl into FrontendCore project
* make inspector version a server api, split up output subtypes and tweak some option names
* add redux CLI based on redux GUI output formats
* replace all Console.WriteLine calls in core inspector with AnsiConsole calls
* add workflow for new cli and add back old gui workflow
* disable aot publish and enable single file for redux cli
* 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
In 2019.3.7f1, the following fields were added to
Il2CppCodeRegistration:
uint32_t interopDataCount;
Il2CppInteropData* interopData;
+ uint32_t windowsRuntimeFactoryCount;
+ Il2CppWindowsRuntimeFactoryTableEntry* windowsRuntimeFactoryTable;
uint32_t codeGenModulesCount;
const Il2CppCodeGenModule** codeGenModules;
These two fields overlap the old codeGenModules fields, causing failures.
The current fix is simply to bump the version to 24.3 if these fields are
detected in order to get the correct codeGenModules pointer. Long term, a
better detection mechanism (probably based on examining the name string
pointer in codeGenModules[0]) will be necessary. However, this is pending
more samples of 2019.3.7+ for testing.
The logic for fieldOffsetsArePointers was always reading 32-bit units
even on 64-bits. When fieldOffsetsArePointers is true, fieldOffsets is
declared as int32_t**, so each element *must* be a pointer and therefore
word-sized (64 bits on 64-bit machines). So it doesn't make sense to
only read 32-bit words for this test.
This fixes metadata extraction for 64-bit builds from Il2Cpp versions
5.3.7f1, 5.3.8f2, 5.4.1f1, 5.4.2f2, 5.4.3f1, 5.4.4f1, 5.4.5f1 and
5.4.6f3. Notably, 5.4.0f3 is an unusual outlier which uses int32_t * for
fieldOffsets.