Mit großem Bedauern muss ich mitteilen, dass die Entwicklungsarbeit auf IL2Cppinspector auf absehbare Zeit eingestellt wurde.
Der Grund dafür ist, dass ich aufgrund von Gesundheit und Veränderungen in meinem persönlichen Leben einfach keine Zeit mehr habe, mich für die Arbeit an dem Projekt zu verpflichten. Das ist sehr frustrierend für mich, aber es gibt wenig, was ich wirklich dagegen tun kann.
Bitte zögern Sie nicht, das Projekt zu streichen und Verbesserungen vorzunehmen! Sie können auch weiterhin Probleme veröffentlichen, da ich gerne ein Kompendium mit Fehler und Problemen speichern möchte, falls ich oder jemand anderes die Möglichkeit haben, wieder daran zu arbeiten. Bitte beachten Sie jedoch, dass ich auf absehbare Zeit nicht auf Probleme oder PRs antworten werde.
Wenn Sie IL2CPP-Tooling benötigen, empfehle ich den hervorragenden Projekt CPP2IL meines Freundes und Kollegen, ein Werkzeug zur Umwandlung von IL2CPP-Binarern direkt in IL-Code, das leicht in DNSPY usw. betrachtet werden kann. Dies ist eine Mammutaufgabe. Bitte unterstützen Sie seine Arbeit an diesem erstaunlichen Projekt!
Happy Hacking,
Katy.
IL2CPPinspector hilft Ihnen dabei, die Ingenieur IL2CPP -Anwendungen rückgängig zu machen, und bietet die derzeit verfügbare derzeit verfügbare Analyse.

Ausgabe von IL2CPP -Typ Definitionen, Metadaten und Methodenzeiger als C# Stub -Code
Erstellen Sie .NET -Assembly -Shim -DLLs, die die IL2CPP -Anwendungsstruktur und Metadaten für Dekompiler wie ILSPY, DNSPY, Unity Asset Loading mit AssetStudio oder verwalteter Proxy -Erzeugung mit IL2CPPassemblyunHollower enthält
Erstellen Sie C ++ - Gerüste für alle Typen, Methoden, Funktionszeiger und API -Funktionen in einer IL2CPP -Anwendung zur Verwendung in X64DBG, Cydia -Substrat usw.
Erstellen Sie IDA- und Ghidra -Python -Skripte, um Symbol-, Funktions- und Typinformationen zu füllen. Beinhaltet API -Hooks, um Skripte für andere Ziele zu implementieren
Erstellen Sie Visual Studio C ++ DLL -Injektionsprojekte direkt aus IL2CPP -Dateien
Erstellen Sie Visual Studio C# Code Stub -Lösungen direkt aus IL2CPP -Dateien
Erstellen Sie JSON -Metadaten mit einer vollständigen Adresskarte direkt aus IL2CPP -Dateien.
Erstellen Sie IL2CPP -Binärdateien aus dem beliebigen C# Quellcode ohne Einheitsprojekt
Drei Haupt -APIs für die Verwendung in Ihren eigenen benutzerdefinierten statischen Analyseprojekten zur Abfrage von Binary -Metadaten mit niedrigem Niveau, dem .NET -Typmodell und der gesamten C ++ - Anwendung. Diese sind auch als Nuget -Paket erhältlich.
Mit Plugin SDK können Sie benutzerdefinierte Plugins erstellen, um die Funktionen von IL2Cppinspector zu erweitern
Besiegt bestimmte Arten von Verschleierung
Unterstützt alle wichtigen Dateiformate und Prozessorarchitekturen
Funktioniert unter Windows, MacOS X und Linux. Integrierte GUI für Windows -Benutzer mit Drag & Drop -Support
Getestet mit jeder Freisetzung von IL2CPP seit Einheit 5.3.0
Sie können mehr darüber erfahren, wie IL2CPP in meiner Serie IL2CPP Reverse Engineering funktioniert:
Teil 1: Hallo Welt und die IL2CPP -Toolchain
Teil 2: Strukturübersicht & Finden der Metadaten
IL2Cppinspector Plugin Development Wiki
So erstellen, verwenden und debuggen Sie IL2CPP -DLL -Injektionsprojekte
Arbeiten mit Code in IL2CPP -DLL -Injektionsprojekten
Verwenden Sie das Typmodell von IL2Cppinspector zum Extrahieren von Protobuf-Net-Definitionen (Fallstudie: Fall Guys)
Finden von Ladern für verschleierte globale Methodendateien- global-metadata.dat
Aktivieren Sie die Belastung der League of Legends: Wild Rift - Deckt XOR Decryption, XOR String Decryption, API -Export -Rot -Entschlüsselung, Datenverzerrung von Binärmetadaten ab
Aktivieren Sie das Laden von Honkai Impact (3 Teile) - Deckt die Suche nach Funktionen in einem Bild, Datenverzerrung von globalem Metadaten, IDA Decompiler -Techniken, So schreiben Sie ein Plugin
VMProtect Control Flow Verschleierung in Honkai Impact - Deckt das Extrapolieren des Codepfads von einer Funktion mit Kontrollflussabflachung mit X64DBG und der IDA -Dekompiler ab
Reverse Engineering Genshin Impact mit PowerShell - Deckt das Schreiben eines Testkabelbaum
Dateiformat und Architekturunterstützung:
Schön zu haben:
using Anweisungen. Umfangs- und Typname -Konflikte werden automatisch behoben, um Code zu erstellen, die er kompiliert.Klassenbibliothek Ziele .net Core 3.1. Gebaut mit Visual Studio 2019.
Hinweis : IL2Cppinspector ist kein Dekompiler. Es kann Ihnen die Struktur einer Anwendung und Funktionsadressen für jede Methode liefern, sodass Sie leicht direkt zu Methoden des Interesses an Ihrem Disassembler springen können. Es wird nicht versucht, den gesamten Quellcode der Anwendung wiederherzustellen.
git clone --recursive https://github.com/djkaty/Il2CppInspector
cd Il2CppInspector
Erstellen Sie die CLI- und Windows -GUI -Versionen:
dotnet publish -c Release
Holen Sie sich alle aktuellen Plugins (optional):
powershell -f get-plugins.ps1
Erstellen Sie die CLI -Version:
cd Il2CppInspector.CLI
dotnet publish -r osx-x64 -c Release
Holen Sie sich alle aktuellen Plugins (optional):
../get-plugins.sh
Erstellen Sie die CLI -Version:
cd Il2CppInspector.CLI
dotnet publish -r linux-x64 -c Release
Holen Sie sich alle aktuellen Plugins (optional):
../get-plugins.sh
Für andere xxx -r xxx die .NET Core unterstützen
Die Ausgabe-Binärin für die Verwendung von Befehlszeilen wird in Il2CppInspector/Il2CppInspector.CLI/bin/Release/netcoreapp3.0/[win|osx|linux]-x64/publish/Il2CppInspector.exe platziert.
Die Ausgabe-Binärin für Windows-GUI wird in Il2CppInspector/Il2CppInspector.GUI/bin/Release/netcoreapp3.1/[win|osx|linux]-x64/publish/Il2CppInspector.exe platziert.
Der plugins -Ordner sollte in denselben Ordner wie Il2CppInspector.exe platziert werden.
Führen Sie Il2CppInspector.exe auf die Eingabeaufforderung aus.
Dateiformat und Architektur werden automatisch erkannt.
Alle Ausgänge werden standardmäßig generiert. Verwenden Sie, um nur bestimmte Ausgänge zu generieren, den Switch --select-outputs -Schalter in Kombination mit den Auswahlauswahlschaltern.
-i, --bin (Default: libil2cpp.so) IL2CPP binary, APK, AAB, XAPK, IPA, Zip or Linux process map text input file(s) (single file or comma-separated list for split APKs)
-m, --metadata (Default: global-metadata.dat) IL2CPP metadata file input (ignored for APK/AAB/XAPK/IPA/Zip)
--image-base For ELF memory dumps, the image base address in hex (ignored for standard ELF files and other file formats)
--select-outputs Only generate outputs specified on the command line (use --cs-out, --py-out, --cpp-out, --json-out, --dll-out to select outputs). If not specified, all outputs are generated
-c, --cs-out (Default: types.cs) C# output file (when using single-file layout) or path (when using per namespace, assembly or class layout)
-p, --py-out (Default: il2cpp.py) Python script output file
-h, --cpp-out (Default: cpp) C++ scaffolding / DLL injection project output path
-o, --json-out (Default: metadata.json) JSON metadata output file
-d, --dll-out (Default: dll) .NET assembly shim DLLs output path
--metadata-out IL2CPP metadata file output (for extracted or decrypted metadata; ignored otherwise)
--binary-out IL2CPP binary file output (for extracted or decrypted binaries; ignored otherwise; suffixes will be appended for multiple files)
-e, --exclude-namespaces (Default: System Mono Microsoft.Reflection Microsoft.Win32 Internal.Runtime Unity UnityEditor UnityEngine UnityEngineInternal AOT JetBrains.Annotations) Comma-separated list of namespaces to suppress in C# output, or 'none' to include all namespaces
-l, --layout (Default: single) Partitioning of C# output ('single' = single file, 'namespace' = one file per namespace in folders, 'assembly' = one file per assembly, 'class' = one file per class in namespace folders, 'tree' = one file per class in assembly and
namespace folders)
-s, --sort (Default: index) Sort order of type definitions in C# output ('index' = by type definition index, 'name' = by type name). No effect when using file-per-class or tree layout
-f, --flatten Flatten the namespace hierarchy into a single folder rather than using per-namespace subfolders. Only used when layout is per-namespace or per-class. Ignored for tree layout
-n, --suppress-metadata Diff tidying: suppress method pointers, field offsets and type indices from C# output. Useful for comparing two versions of a binary for changes with a diff tool
--suppress-dll-metadata Diff tidying: suppress method pointers, field offsets and type indices attributes from DLL output. Useful for comparing two versions of a binary for changes
-k, --must-compile Compilation tidying: try really hard to make code that compiles. Suppress generation of code for items with CompilerGenerated attribute. Comment out attributes without parameterless constructors or all-optional constructor arguments. Don't emit
add/remove/raise on events. Specify AttributeTargets.All on classes with AttributeUsage attribute. Force auto-properties to have get accessors. Force regular properties to have bodies. Suppress global::Locale classes. Generate dummy parameterless
base constructors and ref return fields.
--separate-attributes Place assembly-level attributes in their own AssemblyInfo.cs files. Only used when layout is per-assembly or tree
-j, --project Create a Visual Studio solution and projects. Implies --layout tree, --must-compile and --separate-attributes
--cpp-compiler (Default: BinaryFormat) Compiler to target for C++ output (MSVC or GCC); selects based on binary executable type by default
-t, --script-target (Default: IDA) Application to target for Python script output (IDA or Ghidra) - case-sensitive
--unity-path (Default: C:Program FilesUnityHubEditor*) Path to Unity editor (when using --project). Wildcards select last matching folder in alphanumeric order
--unity-assemblies (Default: C:Program FilesUnityHubEditor*EditorDataResourcesPackageManagerProjectTemplateslibcachecom.unity.template.3d-*ScriptAssemblies) Path to Unity script assemblies (when using --project). Wildcards select last matching folder in
alphanumeric order
--unity-version Version of Unity used to create the input files, if known. Used to enhance Python, C++ and JSON output. If not specified, a close match will be inferred automatically.
--unity-version-from-asset A Unity asset file used to determine the exact Unity version. Overrides --unity-version.
--plugins Specify options for plugins. Enclose each plugin's configuration in quotes as follows: --plugins "pluginone --option1 value1 --option2 value2" "plugintwo --option...". Use --plugins <name> to get help on a specific plugin
--help Display this help screen.
--version Display version information.
Apple Universal Binaries und APKs/XAPKs mit Binärdateien für mehrere Architekturen : Bei Verwendung der CLI werden mehrere Ausgabedateien generiert, wobei jeder Dateiname neben dem ersten Suffizienz des Bildindex im Binäranlagen wird. Nicht unterstützte Bilder werden übersprungen.
IPA -Pakete : Die ausführbare Datei muss zuerst entschlüsselt werden. Verschlüsselte ausführbare Binärdateien werden nicht unterstützt.
Split APK -Pakete : Geben Sie bei Verwendung der CLI eine Liste von APK -Dateien mit einem Komma zwischen jedem Dateinamen an.
ELF-Binärdateien aus Speicher-Mülldeponie : Geben Sie die Bildbasis (in Hex) mithilfe von --image-base . Wenn die mitgelieferte Bildbasis falsch ist, kann die Anwendung abstürzen.
GameGuardian-Dumps (und andere Linux-Prozesskarten-Dumps) : Sie können eine il2CPP-Binärdatei eine *-maps.txt Datei verwenden. IL2CPPInspector scannt den Ordner mit der MAPS -Datei zum Matching .bin -Dateien und stellt libil2cpp.so automatisch wieder zusammen. Sie müssen die Datei daher nicht manuell erstellen oder eine Bildbasisadresse angeben, wenn Sie diese Art von Dump verwenden. Damit dies funktioniert, müssen weder die Textdatei noch eine der Binärdateien umbenannt werden, und alle müssen sich im selben Ordner befinden.
Packed PE -Dateien (DLLs) : Warnung: Das Laden einer gepackten PE -Datei führt dazu, dass die Einstiegs- und Initialisierungsfunktionen der DLL ausgeführt werden. Laden Sie keine böswilligen DLLs und führen Sie IL2Cppinspector bei der Behandlung von PE -Dateien niemals als Administrator aus. Verwenden Sie auf eigenes Risiko.
IL2CPPinspector kann C# Code-Stub-Dateien mit Zeigermetadaten erstellen, mit denen Sie den IL2CPP-Binärer in einem leicht zu lesenden Format erkunden können.
Geben Sie den -c -Switch an, um die C# Ausgabedatei oder Pfad auszuwählen.
Um Typen aus bestimmten Namespaces auszuschließen, die in der C# Quelldateiausgabe generiert werden, geben Sie eine von Kommas getrennte Liste von Fallsensitiven-Namespaces in --exclude-namespaces an. Die folgenden Namespaces werden ausgeschlossen, wenn kein Argument angegeben ist:
System
Mono
Microsoft.Reflection
Microsoft.Win32
Internal.Runtime
Unity
UnityEditor
UnityEngine
UnityEngineInternal
AOT
JetBrains.Annotations
Durch die Bereitstellung eines Arguments für --exclude-namespaces wird die Standardliste überschreiben. Verwenden Sie, um alle Namespaces --exclude-namespaces=none . Dies gilt nur für C# -Prototypen.
Sie können das Ausgangslayout mit dem Switch --layout angeben:
single - Alle Typen in einer einzelnen Dateinamespace - Ein Namespace pro Datei (jede Datei erhält den Namespace -Namen)assembly - Eine Baugruppe pro Datei (jede Datei wird der Montage -Name erhalten)class - eine Klasse pro Dateitree -eine Klasse pro Datei in einer baumartigen Ordnerstruktur mit Montageordnern der obersten Ebene und Namespace-Ordnern der zweiten Ebene Sie können die Intra-Datei-Bestellung mit dem --sort Switch angeben:
index - Sortieren nach Typdefinitionsindex, wie im IL2CPP -Metadaten gefundenname - Sortieren Sie alphabetisch mit dem Typennamen Dieser Switch hat keine Wirkung bei der Verwendung class oder tree .
Mit dem --flatten -Switch können Sie eine Hierarchie verschachtelter Namespaces abflachen namespace wenn layout oder class , dh. Eine Reihe von Unterordnern System/IO/Compression ist stattdessen ein einzelnes Subdolter- System.IO.Compression der obersten Ebene.
Mit dem Switch --suppress-metadata können Sie die Ausgabe von Kommentaren, einschließlich Methodenzeiger, Außensets und Typindizes, unterdrücken. Dies ist nützlich, wenn Sie die Änderungen zwischen zwei Versionen einer Anwendung differenzieren möchten, um nur festzustellen, welche Typen sich geändert haben.
Der Switch --seperate-attributes Switch leitet IL2Cppinspector an, Attribute auf Assembly-Ebene in ihre eigenen AssemblyInfo.cs Dateien zu setzen, anstatt oben in der ersten Datei, die für jede Baugruppe generiert wurde, wenn layout assembly oder tree ist.
Führen Sie einfach IL2Cppinspector mit dem -p -Switch aus, um die IDA -Skriptausgabedatei auszuwählen. Laden Sie Ihre Binärdatei in IDA, drücken Sie Alt+F7 und wählen Sie das generierte Skript aus. Beobachten Sie das Ausgangsfenster, während IDA die Datei analysiert - dies kann lange dauern.
Drei Dateien werden von IL2Cppinspector für Idapython: Das Python-Skript selbst, eine JSON-Metadata-Datei und eine C ++ -Typ-Header-Datei generiert (dies ist cpp/appdata/il2cpp-types.h standardmäßig, wenn Sie die CLI oder il2cpp.h verwenden, wenn Sie die GUI verwendet haben,). Diese Dateien müssen vorhanden sein, damit das Skript erfolgreich ausgeführt werden kann.
Wenn Sie wissen, mit welcher Version der Einheit die Binärdatei zusammengestellt wurde, können Sie die Ausgabe verbessern, indem Sie diese mit --unity-version , beispielsweise --unity-version 2019.3.1f1 , angeben. Sie können auch jede Asset-Datei von der Anwendung angeben, um die Einheit-Version mit --unity-version-from-asset zu erkennen. Andernfalls wird IL2Cppinspector eine fundierte Vermutung auf der Grundlage des Inhalts des Binarischen vorlegen.
IL2Cppinspector generiert die folgenden Daten für IDA -Projekte:
Beispiel IDA C ++ Dekompilierung nach Anwendung von IL2Cppinspector (Initialisierungscode für die Kürze weggelassen):

Führen Sie IL2Cppinspector mit dem -p -Switch aus, um die Ghidra -Skriptausgabedatei und -t Ghidra (Fallempfindlichkeit) auszuwählen, um Ghidra als Skripttyp anzugeben, den Sie erstellen möchten.
Drei Dateien werden von IL2Cppinspector für Ghidra generiert: das Python -Skript selbst, eine JSON -Metadatendatei und eine C ++ -Typ -Header -Datei. Diese Dateien müssen vorhanden sein, damit das Skript erfolgreich ausgeführt werden kann.
Wenn Sie wissen, mit welcher Version der Einheit die Binärdatei zusammengestellt wurde, können Sie die Ausgabe verbessern, indem Sie diese mit --unity-version , beispielsweise --unity-version 2019.3.1f1 , angeben. Sie können auch jede Asset-Datei von der Anwendung angeben, um die Einheit-Version mit --unity-version-from-asset zu erkennen. Andernfalls wird IL2Cppinspector eine fundierte Vermutung auf der Grundlage des Inhalts des Binarischen vorlegen.
HINWEIS: Für die besten Ergebnisse wählen Sie Nein, wenn Ghidra fragt, ob Sie eine Autoanalyse durchführen möchten, wenn die Binärdatei zum ersten Mal geladen wird. Wenn Sie Conflicting data exists at address erhalten, laden Sie die Binärdatei in das Projekt und wählen Sie bei der Eingabeaufforderung für die automatische Analyse Nein.
HINWEIS: Um die Analyse für ELF -Dateien erheblich zu beschleunigen, stellen Sie die Bildbasis auf Null ( 0x00000000 ) in den Lastoptionen für die Binärdatum ein. Aus Gründen der Kompatibilität wird die Ausführung des Ghidra Python-Skripts in einer ELF-Datei die Bildbasis der Datei für Sie bei Bedarf auf Null ändern. Wenn jedoch die aktuelle Bildbasis ungleich Null ist, kann dies nur sehr lange dauern. Andere Dateiformate behalten dieselbe Bildbasis.
Metadaten in ein bestehendes Ghidra -Projekt importieren:
Wählen Sie im Codebrowser Datei -> analysieren Sie C Quelle ...
Erstellen Sie ein neues Profil und fügen Sie die generierte C ++ -Typ -Header -Datei hinzu. Dies il2cpp.h cpp/appdata/il2cpp-types.h
Stellen Sie sicher, dass die Parse -Optionen genau wie folgt festgelegt werden:
-D_GHIDRA_
Klicken Sie analysieren, um zu programmieren und Warnungen zu akzeptieren. Dies kann lange dauern.
Öffnen Sie den Skript -Manager und fügen Sie den Ausgangsordner hinzu, den Sie in IL2Cppinspector als Skriptordner ausgewählt haben.
Wenn Sie Skripte von IL2Cppinspector für andere Binärdateien verwendet haben, stellen Sie sicher, dass die Python -Dateien unterschiedlich benannt werden, oder deaktivieren Sie die Verwendung der vorherigen Skriptordner.
Klicken Sie auf Aktualisieren, um das Skript im Skript -Manager angezeigt zu werden.
Klicken Sie mit der rechten Maustaste auf das Skript und wählen Sie Run . Dies kann eine Weile dauern, bis dies abgeschlossen ist.

IL2Cppinspector generiert identische Daten für Ghidra -Projekte wie für IDA - Einzelheiten finden Sie im obigen Abschnitt.
Beispiel Ghidra C ++ Dekompilierung nach Anwendung von IL2Cppinspector:

IL2Cppinspector generiert eine Reihe von C ++ - Quelldateien, die Sie auf verschiedene Weise verwenden können, z. B.:
Führen Sie IL2Cppinspector mit dem -h -Schalter aus, um den C ++ -Ausgangsordner auszuwählen.
Wenn Sie wissen, mit welcher Version der Einheit die Binärdatei zusammengestellt wurde, können Sie die Ausgabe verbessern, indem Sie diese mit --unity-version , beispielsweise --unity-version 2019.3.1f1 , angeben. Sie können auch jede Asset-Datei von der Anwendung angeben, um die Einheit-Version mit --unity-version-from-asset zu erkennen. Andernfalls wird IL2Cppinspector eine fundierte Vermutung auf der Grundlage des Inhalts des Binarischen vorlegen.
Sie können ansprechen, mit welchem C ++-Compiler Sie die Ausgabedateien verwenden möchten: Angeben Sie: --cpp-compiler MSVC für Visual Studio und --cpp-compiler GCC für GCC oder Clang.
IL2CPPinspector führt eine automatische Konfliktauflösung von Namen durch, um die Verwendung vordefinierter Symbole und Schlüsselwörter in C ++ zu vermeiden und um die Neudefinition gleichberechtigter Symbole in der Anwendung zu verarbeiten.
Einige IL2CPP -Binärdateien enthalten nur einen teilweisen Satz von API -Exporten oder gar keine. In diesen Fällen erstellt IL2CPPinspector Gerüste nur mit den verfügbaren Exporten, um sicherzustellen, dass das Projekt erfolgreich erstellt.

Die folgenden Dateien werden generiert:
appdata -Dieser Ordner enthält projekt-agnostische binärspezifische Erklärungen: ilc2pp-types.h :
il2cpp-functions.h :
MethodInfo ** ) il2cpp-types-ptr.h :
Il2CppClass ** ) il2cpp-api-functions.h ::
il2cpp-api-functions-ptr.h :
il2cpp_ ) il2cpp-metadata-version.h ::
#define für die IL2CPP -Version, die vom Ziel binär verwendet wirdDie obigen Dateien enthalten alle für die dynamischen Analyse benötigten Daten in einem Debugger.
Darüber hinaus werden die folgenden Dateien für die DLL -Injektion generiert:
framework -Projekt-agnostische binär-agnostische Boilerplate-Code und -gerüste:
dllmain.cpp :
init_il2cpp() (siehe unten) aufruft und Run() (siehe unten) in einem neuen Thread startet helpers.cpp und helpers.h ::
helpers.h . il2cpp-init.cpp , il2cpp-init.h und il2cpp-appdata.h :
void init_il2cpp() -Funktion, die alle oben genannten Header verwendet, um nutzbare Funktionszeiger und Klassenzeiger zu erzeugen, die zur Laufzeit auf die richtigen Stellen im In-Memory-Bild zugeordnet sind pch-il2cpp.cpp und pch-il2cpp.h :
appdata Ordner zu ermöglichen user -projektspezifischer binär-agnostischer Benutzercode, den Sie wie gewünscht ändern können:
main.cpp und main.h :Run() -Funktion, die den Einstiegspunkt für Ihren benutzerdefinierten injizierten Code bezeichnet. Die Funktion wird in einem neuen Thread ausgeführt und blockiert daher DllMain nicht.Dies ist der einzige Ordner, dessen Dateien Sie bearbeiten sollten .
Für Visual Studio -Benutzer werden auch die folgenden Dateien generiert:
IL2CppDLL.vcxproj , Il2CppDLL.vcxproj.filters und Il2CppDLL.sln : Der Standard main.cpp enthält einen kommentierten Code, mit dem Sie mit den Funktionen von Helpers.H in ein Protokoll schreiben oder eine neue Konsole mit den Funktionen von helpers.h öffnen können. Um ein Protokolldateiziel in Ihrem Quellcode anzugeben, verwenden Sie extern const LPCWSTR LOG_FILE = L"my_log_file.txt" .
TIPP: Wenn eine neue Version der Zielanwendung veröffentlicht wird, können Sie das C ++-Gerüstprojekt in Platzierung übertreffen. Die Ordner von appdata und framework werden überschrieben, aber der user und die Projekt-/Lösungsdateien werden nicht geändert. Auf diese Weise können Sie Ihr Projekt einfach aktualisieren, wenn die Zielanwendung aktualisiert wurde!
Kompatibilität: Es wird empfohlen, Visual Studio 2019 (MSVC ++ Build -Tools V142 oder höher) zu verwenden. Die Gerüstprojekte wurden mit Visual Studio 2019 und Visual Studio 2017 (MSVC ++ Build Tools V141) getestet. Bei Verwendung von Visual Studio 2017 wird jedoch ein Helfercode weggelassen, um die Kompilierung zum Erfolg zu ermöglichen.
Il2CppDLL.sln ) in Visual StudioRun() in main.cpp ausführen möchtenSie haben Zugriff auf alle C#-äquivalente Typen und Methoden in der Anwendung sowie alle verfügbaren IL2CPP-API-Funktionen. Es sind keine zusätzlichen Funktionszeiger oder Typdeklarationen erforderlich.
Beispiel (Erstellen Sie einen Vector3 und protokollieren Sie seine Y-Koordination einer Datei):
// in main.cpp
void Run ()
{
// Vector3 example
// (Call an IL2CPP API function)
Vector3__Boxed* myVector3 = (Vector3__Boxed*) il2cpp_object_new ((Il2CppClass*) *Vector3__TypeInfo);
// (Call an instance constructor)
Vector3__ctor (myVector3, 1 . 0f , 2 . 0f , 3 . 0f , NULL );
// (Access an instance field)
il2cppi_log_write ( to_string (myVector3-> fields . y ));
}Detailliertere Tutorials finden Sie hier:
So erstellen, verwenden und debuggen Sie IL2CPP -DLL -Injektionsprojekte
Arbeiten mit Code in IL2CPP -DLL -Injektionsprojekten
IL2Cppinspector kann einen vollständigen Visual Studio-Arbeitsbereich mit einer Lösungsdatei (.SLN), einer Projekt (.csproj) und einer baumartigen Ordnerstruktur der Assembly-Namespace-Klasse erstellen. Jedes Projekt erstellt eine einzelne Baugruppe.
Verwenden Sie den --project Switch, um einen Lösungsarbeitsbereich zu generieren.
Damit IL2CPPinspector .CSPROJ -Dateien erstellen können, die die richtigen Referenzen der Einheit Montage enthalten, müssen Sie den Pfad für einen installierten Unity -Editor und einen Projektvorlage oder einen Ordner ScriptAssemblies eines vorhandenen Einheitsprojekts bereitstellen.
HINWEIS: Die Standardeinstellungen wählen die neueste installierte Version von Unity und die neueste installierte Version der Standard -3D -Projektvorlage aus, wenn sie am Standardort installiert wurden.
Typical Unity Editor Standort (angegeben mit --unity-path ): C: Programme Unity Hub Editor 20xx.yz
Typical Unity Project Template Ort (angegeben mit --unity-assemblies ): C: Programmdateien Unity Hub Editor 20xx.yz Editor Data Ressourcen PackageManager ProjectTemplates libcache <name-template>
Typische Einheitskript-Assemblys Standort im vorhandenen Projekt (angegeben mit --unity-aseemblies ): X: MyProject Library ScriptAsSemblys
Ersetzen Sie X , Y und Z durch Ihre Einheit -Versionsnummer. Ersetzen Sie <Name-of-Template> durch die gewünschte Vorlage.
Hinweis: Sie können die Asterisk -Wildcard (*) ein oder mehrmals verwenden, wenn Sie diese Pfade angeben. IL2Cppinspector wählt den letzten Übereinstimmungsordner in alphanumerischer Reihenfolge aus. Dies ist nützlich, wenn Sie über mehrere Side-by-Side-Unity-Installationen verfügen und immer die neueste Version oder Vorlage auswählen möchten.
Falls die Montagereferenzen beim ersten Laden einer Lösung nicht korrekt gelöst werden, schließen Sie einfach die Lösung, um sie zur Lösung zu erzwingen.

IL2Cppinspector kann eine JSON -Datei erstellen, die verschiedene Metadaten über die Anwendung enthält.
Verwenden Sie den -o -Schalter, um den JSON -Ausgangspfad anzugeben.
Das Ausgangsschema lautet wie folgt:
addressMap (Objekt)
Eine Adresskarte aller IL2CPP-bezogenen Inhalte in Binärer
methodDefinitions (Array) Die virtuelle Adresse, binäres Symbol, C ++-Funktionssignature und .NET-Methode Signatur jeder .NET-äquivalenten Methode in der Binary
constructedGenericMethods (Array) Die virtuelle Adresse, binäres Symbol, C ++-Funktionssignature und .NET-Methode Signatur jeder .NET-äquivalenten konkreten generischen Methode in der Binary
customAttributesGenerators (Array) Die virtuelle Adresse, den Namen und die C ++ - Funktionssignatur jeder benutzerdefinierten Attributegeneratorfunktion in der Binary
methodInvokers (Array) Die virtuelle Adresse, Name und C ++ - Funktionssignatur jeder Methode.
stringLiterals (Array) für Unity -Versionen niedriger als 5.3.2: Der Ordinal, der Name und der Text jedes Zeichenfolge.
typeInfoPointers (Array) Die virtuelle Adresse, der Name, der C ++ abgeleitete Typname und der .NET -Typ Name Äquivalent jedes Zeigers der Klassendefinition ( Il2CppClass * ) in der Binary
typeRefPointers (Array) Die virtuelle Adresse, der Name und der .NET -Typ Name entsprechen jedes Typs Referenzzeiger ( Il2CppType * ) im Binärer
methodInfoPointers (array) Die virtuelle Adresse, Name und .NET -Methode Signatur jeder Laufzeit -Methode -Definitionszeigerin ( MethodInfo * ) im Binary
functionAddresses (Array) Die virtuellen Adressen des Beginns jeder bekannten Funktion in der Binary, einschließlich aller oben genannten und alle anderen, die in den oben genannten Kategorien entdeckt, aber nicht enthalten sind
typeMetadata (Array) Die virtuelle Adresse, der Name und der C ++ -Typ Name der Schlüsselmethoden in der Binärzahlen. Dies schließt Il2CppCodeRegistration und Il2CppMetadataRegistration ein. Abhängig von der binären Version kann auch ein Zeiger auf jeden Il2CppCodeGenModule enthalten sein
arrayMetadata (Array) Die virtuelle Adresse, der Name, C ++ -Typame und Größe der Schlüsselmetadaten -Arrays in der Binary
functionMetadata (Array) Die virtuelle Adresse, der Name und die C ++ - Funktionssignatur der wichtigsten Metadatenfunktionen im Binary. Abhängig davon, wie die Binärdatei von IL2CPPinspector analysiert wurde, kann dies il2cpp_codegen_register umfassen.
apis (Array) Die virtuelle Adresse, den Namen und die C ++ - Funktionssignatur jeder IL2CPP -API -Funktion, die in der Binary identifiziert wurde
exports (Array) Die virtuelle Adresse und der Name jedes Exports in der Binärdatei
symbols (Array) Die virtuelle Adresse, der Name und der Symboltyp jeder benannten (nicht Null-Namenslänge) und nicht-Null-Adressfunktion Definition, Typ, Feldname und Import (für ELF), die in der Binärdatei definiert sind. Derzeit nicht für PE -Dateien unterstützt.
Es werden drei PowerShell -Skripte bereitgestellt, um ein einfaches Aufbau und Testen von IL2CPP -Binärdateien zu ermöglichen:
il2cpp.ps1 ist das Haupt -Arbeitspferd und erstellt jede angegebene C# -Selldatei in TestSources (oder alle, wenn keine geliefert wird) als separate Baugruppe und gibt sie an TestAssemblies aus. Anschließend werden jede angegebene Baugruppe in TestAssemblies verwendet und für jede dieser Architekturen jeweils als separates IL2CPP -Projekt zusammengestellt:
Diese werden in den TestBinaries -Ordner eingebaut. Der C ++ - Quellcode für jeden Build wird in den TestCpp -Ordner platziert. Es ruft dann generate-tests.ps1 .
Geben Sie eine von Kommas getrennte Liste von Quelldateien (ohne .cs -Erweiterung) an, um sie als erstes Argument (oder -assemblies ) zu verarbeiten.
Sie können optional eine Unity -Version oder ein Einheitspfad mit dem zweiten Argument (oder -unityVersion ) angeben. Wenn keine Lieferung geliefert wird, wird die neueste installierte Einheit -Version verwendet. Sie können auch Wildcards angeben, z. 2019* wird die neueste installierte Version von Unity 2019, 2018.3* die neueste installierte Version von Unity 2018.3 usw. verwenden. Verwenden Sie die Unity Hub, um die gewünschten Versionen zu installieren.
Daher können Sie mit einem Befehl einen Assembly DLL, C ++ Quellcode und IL2CPP -Binary für jede Architektur für eine bestimmte Liste von Quelldateien, einen Satz von Ausgängen pro Quelldatei, für eine bestimmte Version der Einheit generieren.
generate-tests.ps1 generiert eine Datei namens Tests.cs im Il2CppTests -Projekt, das einen Test pro IL2CPP-Projekt in TestBinaries enthält. Diese Datei wird vom Il2CppTests -Projekt zusammengestellt. Sie können dann einen Test pro IL2CPP -Projekt im Test Explorer von Visual Studio sehen.
Die automatisch generierten Tests generieren C #-, JSON- und C-Header-Dateien im Ordner von il2cpp Binary in TestBinaries (jeder Dateiname, der mit test vorangestellt ist) und vergleicht sie (weißspace-unempfindlich) mit den entsprechenden Projektnamendateien in TestExpectedResults . Auf diese Weise können Sie nach Dateien mit bekannter Struktur prüfen, ob die Analyse korrekt durchgeführt wird, oder die Analyse bestimmter Binärdateien im Debugger durchlaufen, ohne die Befehlszeilenargumente des Projekts ändern zu müssen.
update-expected-results.ps1 kopiert alle Ausgangstestergebnisse von TestBinaries in TestExpectedResults , wodurch die Dateien aktualisiert werden, mit denen die korrekten Testergebnisse überprüft werden.
Beispiel verwendet:
./il2cpp.ps1
Erstellt jede C# Quelldatei "nto a .NET Assembly DLL, einen C ++ - Quellordner und ein IL2CPP -Binärer pro unterstützter Architektur
./il2cpp.ps1 MyFirstTest
baut MyFirstTest.cs in MyFirstTest.dll , erstellt einen C ++ - Quellordner namens MyFirstTest und ein IL2CPP -Binärer für jede unterstützte Architektur
./il2cpp.ps1 MyFirstTest,MySecondTest 2019.3.1f1
baut MyFirstTest.cs und MySecondTest.cs in einzelne Baugruppen -DLLs, C ++ - Quellordner und IL2CPP -Binärdateien unter Verwendung von Unity 2019.1f1
./il2cpp.ps1 MyFirstTest,MySecondTest F:UnityHubEditor2019.3.1f1
Wie oben jedoch gibt es einen benutzerdefinierten Pfad für Ihre Einheitsinstallation an.
Die minimal unterstützte Unity -Version ist 2017.1.0f3.
Weitere Informationen zu diesen Funktionen finden Sie im Abschnitt mit dem mit IL2CPPinspector mit dem Titel "IL2CPP -Code in IL2CPP Reverse Engineering Teil 1.
Hinweis: Die IL2Cppinspector -APIs sind auch als Nuget -Paket erhältlich! (Suche: Noisycowstudios.il2cppinspector)
IL2Cppinspector bietet die folgenden wiederverwendbaren APIs der Klassenbibliothek an:
Verwenden Sie diese APIs, um IL2CPP -Typen problemlos abzufragen, neue Ausgabemodule zu erstellen und IL2CPPinspector in Ihre eigenen statischen Analyseanwendungen zu integrieren.
Um IL2Cppinspector in Ihren eigenen Projekten zu verwenden, fügen Sie einen Verweis auf Il2CppInspector.Common.dll hinzu.
Include the following using directives:
using Il2CppInspector to use Il2CppInspector .using Il2CppInspector.Reflection to use TypeModel .using Il2CppInspector.Model to use AppModel .See the source code for further details or the tutorials above.
Plugins should be placed in the plugins folder in the same folder as Il2CppInspector.exe . Each plugin should be placed into its own sub-folder with any dependencies or configuration files needed.
From the GUI you can enable and disable plugins, change the execution order and configure individual plugin settings via the Manage plugins... button.
From the CLI you can specify which plugins and settings to use as follows.
For one plugin:
Il2CppInspector.exe --plugins "myplugin --firstOption value1 --secondOption value2"
For multiple plugins:
Il2CppInspector.exe --plugins "plugin1 --option1 ..." "plugin2 --option2 ..." ...
Plugins will be executed in the order specified.
Core plugins (those that are part of Il2CppInspector's base functionality) are always enabled when using the CLI, but can be disabled in the GUI.
When using the CLI, core plugins always execute first by default. You can force the core plugins to execute in a different order by specifying their names in the desired execution order. Zum Beispiel:
Il2CppInspector.exe --plugins "analytics --output foo.csv"
will run the core plugins first then the analytics example plugin, but:
Il2CppInspector.exe --plugins "analytics --output foo.csv" "xor"
will cause the xor core plugin to run after analytics .
For help on a specific plugin, specify the plugin name with no arguments:
Il2CppInspector.exe --plugins myplugin
To get more plugins, click Get Plugins in the Manage Plugins window in the GUI, visit the Il2CppInspectorPlugins repository or use the get-plugins.ps1 or get-plugins.sh scripts to update to the latest plugin releases.

Plugins let you extend the functionality of Il2CppInspector. For example you can pre and post-process metadata and binaries to enable inspection of IL2CPP applications that Il2CppInspector cannot handle automatically.
Plugin support is currently experimental and has limited functionality.
Details on how to create your own plugins can be found in the Il2CppInspector Plugin Development Wiki.
You can find out more about plugins, and browse the source code of current plugins and examples in the Il2CppInspectorPlugins repository.
The current version of Il2CppInspector can output Python scripts targeting the IDA and Ghidra disassemblers.
When Il2CppInspector generates such a script, it generates a concatenation of a shared block of code ( Outputs/ScriptResources/shared-main.py ) which parses the JSON metadata and dispatches it to a set of implementation-specific functions to be processed, and a block of code specific to the target application which implements these functions (a file from Outputs/ScriptResources/Targets ).
If you would like to add support for a new target application, create a new Python script in Outputs/ScriptResources/Targets with the nane <target-name-without-whitespace>.py and implement the following functions:
CustomInitializer() - perform any custom initialization required for the target before applying the metadataDefineCode(code) - parse and apply the specified C++ declaration text (this is not required for Unity 5.3.2 and later; if you don't need to support earlier versions, just specify pass as the implementation)GetScriptDirectory() - retrieve the directory that the Python script is running in. This will normally be os.path.dirname(os.path.realpath(__file__))MakeFunction(start, name=None) - define address start as the start of a function, optionally with name nameSetComment(addr, text) - place the comment text at address addrSetFunctionType(addr, sig) - parse the C++ function signature in sig and apply it to the function at address addrSetHeaderComment(addr, text) - place the header/plate/pre-item comment text at address addrSetName(addr, name) - set the symbol (or label or name) of address addr to nameSetType(addr, type) - define address addr to be an item of the C++ type type Refer to the source code of IDA.py and Ghidra.py for examples.
When you add a new target and re-compile Il2CppInspector:
-t ( --script-target ) switch via the CLIIf you develop an API for a target that you think might be useful to others, please feel free to submit a PR with the code!
| Unity version | IL2CPP version | Unterstützung |
|---|---|---|
| 4.6.1+ | Erste Veröffentlichung | Nicht unterstützt |
| 5.2.x | 15 | Nicht unterstützt |
| 5.3.0-5.3.1 | 16 | Arbeiten |
| 5.3.2 | 19 | Arbeiten |
| 5.3.3-5.3.4 | 20 | Arbeiten |
| 5.3.5-5.4.6 | 21 | Arbeiten |
| 5.5.0-5.5.6 | 22 | Arbeiten |
| 5.6.0-5.6.7 | 23 | Arbeiten |
| 2017.1.0-2018.2.21 | 24 | Arbeiten |
| 2018.3.0-2018.4.x | 24.1 | Arbeiten |
| 2019.1.0-2019.3.6 | 24.2 | Arbeiten |
| 2019.3.7-2019.4.14 | 24.3 | Arbeiten |
| 2019.4.15-2019.4.20 | 24.4 | Arbeiten |
| 2019.4.21-2019.4.x | 24.5 | Arbeiten |
| 2020.1.0-2020.1.10 | 24.3 | Arbeiten |
| 2020.1.11-2020.1.17 | 24.4 | Arbeiten |
| 2020.2.0-2020.2.3 | 27 | Arbeiten |
| 2020.2.4-2020.3.x | 27.1 | Arbeiten |
| 2021.1.0-2021.1.x | 27.2 | Teilweise |
Please refer to the companion repository https://github.com/nneonneo/Il2CppVersions if you would like to track the changes between each IL2CPP release version.
If you have files that don't work or are in an unsupported format, please open a new issue on GitHub and attach a sample with details on the file format, and I'll try to add support. Include both the IL2CPP binary and global-metadata.dat in your submission.
Please check the binary file in a disassembler to ensure that it is a plain IL2CPP binary before filing an issue. Il2CppInspector is not intended to handle packed, encrypted or obfuscated IL2CPP files.
If you found Il2CppInspector useful, you can really help support the project by making a small donation at http://paypal.me/djkaty!
You can also donate with bitcoin: 3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz
Viel Liebe! - Katy
Thanks to the following major contributors!
This project uses:
Thanks to the following individuals whose code and research helped me develop this tool:
The following books and documents were also very helpful:
Pizza spinner animation in the GUI made by Chris Gannon - https://gannon.tv/
This software is licensed under AGPLv3.