Skip to content

Commit b05c039

Browse files
authored
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
1 parent 5b0476f commit b05c039

File tree

130 files changed

+5087
-4341
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

130 files changed

+5087
-4341
lines changed

.github/workflows/build.yml

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,77 @@
11
name: Il2CppInspectorRedux Build
22

3-
on:
4-
push:
5-
branches: [ master ]
6-
7-
workflow_dispatch:
3+
on: [push, workflow_dispatch]
84

95
jobs:
10-
build:
6+
build-gui:
117
runs-on: windows-latest
128

139
steps:
14-
- uses: actions/checkout@v3
10+
- uses: actions/checkout@v4
1511
with:
1612
submodules: true
1713

18-
- uses: microsoft/[email protected]
14+
- name: Setup .NET SDK
15+
uses: actions/setup-dotnet@v4
16+
with:
17+
dotnet-version: '9.0.x'
1918

20-
- uses: actions/cache@v3
19+
- uses: actions/cache@v4
2120
with:
2221
path: ~/.nuget/packages
23-
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
22+
key: ${{ runner.os }}-nuget-gui-${{ hashFiles('**/packages.lock.json') }}
2423
restore-keys: |
25-
${{ runner.os }}-nuget-
24+
${{ runner.os }}-nuget-gui-
2625
2726
- name: Restore NuGet packages
28-
run: nuget restore
27+
run: dotnet restore -r win-x64 ./Il2CppInspector.GUI
2928

3029
- name: Build GUI
31-
run: msbuild /t:Il2CppInspector_GUI:publish /p:Configuration=Release /p:Platform="Any CPU" /p:TargetFramework=net8.0-windows /p:SelfContained=false /verbosity:minimal
30+
run: dotnet publish ./Il2CppInspector.GUI/Il2CppInspector.GUI.csproj -c Release -r win-x64 --no-self-contained
3231

33-
- name: Build CLI
34-
run: msbuild /t:Il2CppInspector_CLI:publish /p:Configuration=Release /p:Platform="Any CPU" /p:TargetFramework=net8.0 /p:SelfContained=false /verbosity:minimal
32+
- name: Upload GUI Artifact
33+
uses: actions/upload-artifact@v4
34+
with:
35+
name: Il2CppInspectorRedux.GUI
36+
path: Il2CppInspector.GUI/bin/Release/net9.0-windows/win-x64/publish
3537

36-
- name: Add Plugins folder (GUI)
37-
shell: pwsh
38-
working-directory: Il2CppInspector.GUI/bin/Release/net8.0-windows/win-x64/publish
39-
run: ../../../../../../get-plugins.ps1
38+
build-cli:
39+
runs-on: ubuntu-latest
40+
strategy:
41+
matrix:
42+
dotnet-version: [ '9.0.x' ]
43+
rid: ['win-x64', 'linux-x64', 'linux-arm64', 'osx-x64', 'osx-arm64']
4044

41-
- name: Add Plugins folder (CLI)
42-
shell: pwsh
43-
working-directory: Il2CppInspector.CLI/bin/Release/net8.0/win-x64/publish
44-
run: ../../../../../../get-plugins.ps1
45+
steps:
46+
- uses: actions/checkout@v4
47+
with:
48+
submodules: true
4549

46-
- name: Upload GUI Artifact
47-
uses: actions/upload-artifact@v3
50+
- name: Setup .NET SDK
51+
uses: actions/setup-dotnet@v4
4852
with:
49-
name: Il2CppInspectorRedux.GUI
50-
path: Il2CppInspector.GUI/bin/Release/net8.0-windows/win-x64/publish
53+
dotnet-version: '9.0.x'
54+
55+
- uses: actions/cache@v3
56+
with:
57+
path: ~/.nuget/packages
58+
key: ${{ runner.os }}-nuget-cli-${{ matrix.rid }}-${{ hashFiles('**/packages.lock.json') }}
59+
restore-keys: |
60+
${{ runner.os }}-nuget-cli-${{ matrix.rid }}-
5161
52-
- name: Upload CLI Artifact
53-
uses: actions/upload-artifact@v2
62+
- name: Setup .NET SDK ${{ matrix.dotnet-version }}
63+
uses: actions/setup-dotnet@v3
5464
with:
55-
name: Il2CppInspectorRedux.CLI
56-
path: Il2CppInspector.CLI/bin/Release/net8.0/win-x64/publish
65+
dotnet-version: ${{ matrix.dotnet-version }}
66+
67+
- name: Install dependencies
68+
run: dotnet restore -r ${{ matrix.rid }} ./Il2CppInspector.CLI
5769

70+
- name: Build & Publish
71+
run: dotnet publish -c Release --no-self-contained --no-restore -o ./${{ matrix.rid }} -r ${{ matrix.rid }} ./Il2CppInspector.CLI/Il2CppInspector.CLI.csproj
72+
73+
- name: Upload artifacts
74+
uses: actions/upload-artifact@v4
75+
with:
76+
name: Il2CppInspectorRedux.CLI-${{ matrix.rid }}
77+
path: ./${{ matrix.rid }}

Il2CppInspector.CLI/Il2CppInspector.CLI.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net8.0</TargetFramework>
5+
<TargetFramework>net9.0</TargetFramework>
66

77
<PublishSingleFile>true</PublishSingleFile>
88
<!-- Plugins may require bass class library assemblies we're not using so disable trimming -->
@@ -32,7 +32,7 @@
3232
</ItemGroup>
3333

3434
<ItemGroup>
35-
<PackageReference Include="CommandLineParser" Version="2.6.0" />
35+
<PackageReference Include="CommandLineParser" Version="2.9.1" />
3636
</ItemGroup>
3737

3838
<ItemGroup>

Il2CppInspector.Common/Architectures/Il2CppBinaryARM.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
All rights reserved.
66
*/
77

8+
using Il2CppInspector.Next;
89
using System;
910
using System.Collections.Generic;
1011
using System.Linq;
@@ -342,10 +343,10 @@ protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc
342343
// In v21 and later, R0-R2 + PC will be set and they will be the only registers set
343344
// Pre-v21, R0-R1 + PC will be the only registers set
344345

345-
if (image.Version >= 21 && regs.Count == 4 && regs.TryGetValue(0, out r0) && regs.TryGetValue(1, out r1) && regs.TryGetValue(2, out uint _))
346+
if (image.Version >= MetadataVersions.V210 && regs.Count == 4 && regs.TryGetValue(0, out r0) && regs.TryGetValue(1, out r1) && regs.TryGetValue(2, out uint _))
346347
return (r0 & 0xffff_fffe, r1 & 0xffff_fffe);
347348

348-
if (image.Version < 21 && regs.Count == 3 && regs.TryGetValue(0, out r0) && regs.TryGetValue(1, out r1))
349+
if (image.Version < MetadataVersions.V210 && regs.Count == 3 && regs.TryGetValue(0, out r0) && regs.TryGetValue(1, out r1))
349350
return (r0 & 0xffff_fffe, r1 & 0xffff_fffe);
350351

351352
return (0, 0);

Il2CppInspector.Common/Architectures/Il2CppBinaryARM64.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
All rights reserved.
55
*/
66

7+
using Il2CppInspector.Next;
78
using System;
89
using System.Collections.Generic;
910

@@ -168,10 +169,10 @@ protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc
168169
// Is it Il2CppCodegenRegistration(void)?
169170
// In v21 and later, X0-X2 will be set and they will be the only registers set
170171
// Pre-v21, X0-X1 will be the only registers set
171-
if (image.Version >= 21 && regs.Count == 3 && regs.TryGetValue(0, out ulong x0) && regs.TryGetValue(1, out x1) && regs.TryGetValue(2, out ulong _))
172+
if (image.Version >= MetadataVersions.V210 && regs.Count == 3 && regs.TryGetValue(0, out ulong x0) && regs.TryGetValue(1, out x1) && regs.TryGetValue(2, out ulong _))
172173
return (x0, x1);
173174

174-
if (image.Version < 21 && regs.Count == 2 && regs.TryGetValue(0, out x0) && regs.TryGetValue(1, out x1))
175+
if (image.Version < MetadataVersions.V210 && regs.Count == 2 && regs.TryGetValue(0, out x0) && regs.TryGetValue(1, out x1))
175176
return (x0, x1);
176177

177178
return (0, 0);

Il2CppInspector.Common/Architectures/Il2CppBinaryX64.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
All rights reserved.
55
*/
66

7+
using Il2CppInspector.Next;
78
using System;
89
using System.Collections.Generic;
910
using System.Collections.Specialized;
@@ -216,7 +217,7 @@ protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc
216217
offset = nextLea?.foundOffset + leaSize ?? buff2Size;
217218
}
218219

219-
if ((image.Version < 21 && leas.Count == 2) || (image.Version >= 21 && leas.Count == 3)) {
220+
if ((image.Version < MetadataVersions.V210 && leas.Count == 2) || (image.Version >= MetadataVersions.V210 && leas.Count == 3)) {
220221
// Register-based argument passing?
221222
var leaRSI = leas.FirstOrDefault(l => l.Value == RSI).Key.address;
222223
var leaRDI = leas.FirstOrDefault(l => l.Value == RDI).Key.address;

Il2CppInspector.Common/Architectures/Il2CppBinaryX86.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
All rights reserved.
55
*/
66

7+
using Il2CppInspector.Next;
78
using System;
89
using System.Linq;
910

@@ -34,7 +35,7 @@ protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc
3435
return (0, 0);
3536

3637
// Jump to Il2CppCodegenRegistration
37-
if(image.Version < 21) {
38+
if(image.Version < MetadataVersions.V210) {
3839
image.Position = image.MapVATR((ulong)pCgr + 1);
3940
metadata = image.ReadUInt32();
4041
image.Position = image.MapVATR((ulong)pCgr + 6);

0 commit comments

Comments
 (0)