C'est avec grand regret que je dois annoncer que les travaux de développement sur IL2CPPInspector ont été interrompus dans un avenir prévisible.
La raison en est qu'en raison de la santé et des changements dans ma vie personnelle, je n'ai tout simplement plus le temps de m'engager à travailler sur le projet. C'est très frustrant pour moi, mais je ne peux pas vraiment y faire.
N'hésitez pas à alimenter le projet et à apporter des améliorations! Vous pouvez également continuer à publier des problèmes, car je voudrais avoir un recueil de bogues et de problèmes enregistrés au cas où moi ou quelqu'un d'autre aure la possibilité de recommencer à travailler là-dessus. Veuillez cependant noter que je ne répondrai pas aux problèmes ou aux PR à l'avenir dans un avenir prévisible.
Si vous avez besoin d'outils IL2CPP, je recommande l'excellent projet CPP2IL de mon ami et collègue qui est un outil de travail en cours pour convertir les binaires IL2CPP directement dans le code IL qui peuvent être facilement consultés dans DNSPY, etc. Il s'agit d'une tâche de gigantesque, alors faites-y et soutenez son travail sur ce projet incroyable!
Happy Hacking,
Katy.
IL2CPPInSpector vous aide à rétro-ingénieur des applications IL2CPP, fournissant l'analyse la plus complète actuellement disponible.

Sortie des définitions de type IL2CPP, métadonnées et pointeurs de méthode comme code C #
Créer des DLL de cale d'assemblage .NET contenant la structure d'application IL2CPP et les métadonnées pour une utilisation dans des décompileurs tels que ILSPY, DNSPY, chargement d'unité avec une génération d'actifs AssetStudio ou gérée avec IL2CPPASEMBLYUnHollower
Créez des échafaudages C ++ pour tous les types, méthodes, pointeurs de fonction et fonctions API dans une application IL2CPP à utiliser dans X64DBG, substrat Cydia, etc.
Créez des scripts IDA et Ghidra Python pour remplir les informations de symbole, de fonction et de type; Comprend des crochets API pour implémenter les scripts pour d'autres cibles
Créer des projets d'injection de DLL Visual Studio C ++ directement à partir des fichiers IL2CPP
Créer des solutions Visual Studio C # Code Stub directement à partir des fichiers IL2CPP
Créez des métadonnées JSON avec une carte d'adresse complète directement à partir des fichiers IL2CPP.
Créer des binaires IL2CPP à partir du code source arbitraire sans projet d'unité
Trois principales API à utiliser dans vos propres projets d'analyse statique personnalisés pour interroger les métadonnées binaires de bas niveau, le modèle de type .NET et l'ensemble de l'application C ++. Ceux-ci sont également disponibles en tant que package NuGet.
Le SDK du plugin vous permet de créer des plugins personnalisés pour étendre les capacités d'IL2CPPInspector
Bat certains types d'obscurcissement
Prend en charge tous les principaux formats de fichiers et architectures de processeur
Fonctionne sur Windows, MacOS X et Linux. GUI intégrée pour les utilisateurs de Windows avec support Drag & Drop
Testé à chaque version d'IL2CPP depuis Unity 5.3.0
Vous pouvez en savoir plus sur le fonctionnement de l'IL2CPP dans ma série IL2CPP Renvers l'ingénierie:
Partie 1: Hello World et la chaîne d'outils IL2CPP
Partie 2: Aperçu structurel et trouver les métadonnées
IL2CPPInSpector Plugin Development Wiki
Comment créer, utiliser et déboguer les projets d'injection de DLL IL2CPP
Travailler avec le code dans les projets d'injection de DLL IL2CPP
Utilisation du modèle de type d'IL2CPPInspector pour extraire les définitions de protobuf-net (étude de cas: les gars de l'automne)
Trouver des chargeurs pour les fichiers global-metadata.dat obscurcis - explique comment trouver le chargeur, la déobfuscation et / ou le code de décryptage pour global-metadata.dat dans presque toutes les applications IL2CPP
Activer le chargement de League of Legends: Wild Rift - Couvre le décryptage XOR, le décryptage des cordes XOR, le décryptage pour la pourriture des exportations d'API, l'obscurcissement des données des métadonnées binaires
Activer le chargement de Honkai Impact (3 parties) - Couvre les fonctions de recherche dans une image, l'obscurcissement des données de Global-Metadata.dat, Ida Decompiler Techniques, comment écrire un plugin
VMProtect Control Flow Obfuscation in Honkai Impact - Couvre l'extrapolation du chemin de code à partir d'une fonction avec aplatissement de flux de contrôle à l'aide de X64DBG et du décompilateur IDA
Ingénierie inverse Impact de Genshin avec PowerShell - couvre la rédaction d'un harnais de test pour trouver une fonction dans un binaire obscur
Format de fichier et support d'architecture:
Ravi d'avoir:
using nécessaire. La portée et les conflits de noms de type sont résolus automatiquement pour produire du code qui compile.La bibliothèque de classe cible .NET Core 3.1. Construit avec Visual Studio 2019.
Remarque : IL2CPPInspector n'est pas un décompilateur. Il peut vous fournir la structure d'une application et des adresses de fonction pour chaque méthode afin que vous puissiez facilement passer directement aux méthodes d'intérêt dans votre démontrant. Il n'essaie pas de récupérer l'intégralité du code source de l'application.
git clone --recursive https://github.com/djkaty/Il2CppInspector
cd Il2CppInspector
Construisez les versions CLI et Windows GUI:
dotnet publish -c Release
Obtenez tous les plugins actuels (facultatif):
powershell -f get-plugins.ps1
Construisez la version CLI:
cd Il2CppInspector.CLI
dotnet publish -r osx-x64 -c Release
Obtenez tous les plugins actuels (facultatif):
../get-plugins.sh
Construisez la version CLI:
cd Il2CppInspector.CLI
dotnet publish -r linux-x64 -c Release
Obtenez tous les plugins actuels (facultatif):
../get-plugins.sh
Pour d'autres systèmes d'exploitation prenant en charge .NET Core, ajoutez -r xxx à la commande finale où xxx est un débarras de https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalogog
Le binaire de sortie pour l'utilisation de la ligne de commande est placé dans Il2CppInspector/Il2CppInspector.CLI/bin/Release/netcoreapp3.0/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
Le binaire de sortie pour Windows GUI est placé dans Il2CppInspector/Il2CppInspector.GUI/bin/Release/netcoreapp3.1/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
Le dossier plugins doit être placé dans le même dossier que Il2CppInspector.exe .
Exécutez Il2CppInspector.exe à l'invite de commande.
Le format de fichier et l'architecture sont automatiquement détectés.
Toutes les sorties sont générées par défaut. Pour générer uniquement des sorties spécifiques, utilisez le commutateur --select-outputs en combinaison avec les commutateurs de sélection de sortie.
-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.
Binaires universels Apple et APKS / XAPK avec des binaires pour plusieurs architectures : Lors de l'utilisation de la CLI, plusieurs fichiers de sortie seront générés, avec chaque nom de fichier en plus du premier suffixé par l'index de l'image dans le binaire. Des images non pris en charge seront ignorées.
Packages IPA : L'exécutable doit être décrypté en premier. Les binaires exécutables chiffrés ne sont pas pris en charge.
Packages APK divisés : lorsque vous utilisez la CLI, spécifiez une liste de fichiers APK avec une virgule entre chaque nom de fichier.
Binaires ELF Créés à partir de vidages de mémoire : spécifiez la base d'image (en hex) à l'aide --image-base . Si la base d'image fournie est incorrecte, l'application peut s'écraser.
GameGuardian Dumps (et autres vidages de carte de processus Linux) : Vous pouvez utiliser un fichier *-maps.txt à la place d'un binaire IL2CPP. IL2CPPInSpector scannera le dossier contenant le fichier MAPS pour la correspondance des fichiers .bin et remonte et réprimande automatiquement libil2cpp.so . Vous n'avez donc pas besoin de créer le fichier manuellement ou de fournir une adresse de base d'image lors de l'utilisation de ce type de vidage. Pour que cela fonctionne, ni le fichier texte ni aucun des fichiers binaires ne doivent être renommés, et tout doit être dans le même dossier.
Fichiers PE emballés (DLL) : AVERTISSEMENT: le chargement d'un fichier PE emballé entraînera l'exécution du point de saisie et des fonctions d'initialisation de la DLL. Ne chargez pas les DLL malveillants et n'exécutez jamais IL2CPPInSpector en tant qu'administrateur lors de la gestion des fichiers PE emballés. Utiliser à vos risques et périls.
IL2CPPInSpector peut créer des fichiers de stub de code C # avec des métadonnées de pointeur pour vous permettre d'explorer le binaire IL2CPP dans un format facile à lire.
Spécifiez le commutateur -c pour choisir le fichier ou le chemin de sortie C #.
Pour exclure les types de certains espaces de noms générés dans la sortie du fichier source C #, fournissez une liste séparée par des virgules des espaces de noms sensibles à la cas dans --exclude-namespaces . Les espaces de noms suivants seront exclus si aucun argument n'est spécifié:
System
Mono
Microsoft.Reflection
Microsoft.Win32
Internal.Runtime
Unity
UnityEditor
UnityEngine
UnityEngineInternal
AOT
JetBrains.Annotations
La fourniture d'un argument à --exclude-namespaces remplacera la liste par défaut. Pour sortir toutes les espaces de noms, utilisez --exclude-namespaces=none . Cela ne s'applique qu'à la sortie des prototypes C #.
Vous pouvez spécifier la disposition de sortie avec le commutateur --layout :
single - Tous types dans un seul fichiernamespace - un espace de noms par fichier (chaque fichier recevra le nom de l'espace de noms)assembly - un assemblage par fichier (chaque fichier recevra le nom de l'assemblage)class - une classe par fichiertree - Une classe par fichier dans une structure de dossiers en forme d'arbre avec des dossiers d'assemblage de niveau supérieur et des dossiers d'espace de noms de second niveau Vous pouvez spécifier la commande de type intra-fichier avec le commutateur --sort :
index - Trier par type Définition Index comme trouvé dans les métadonnées IL2CPPname - Triez par ordre alphabétique par nom de type Ce commutateur n'a aucun effet lors de l'utilisation class ou de la disposition tree .
L'interrupteur --flatten vous permet d'aplatir une hiérarchie d'espaces de noms imbriqués lorsque layout est class ou namespace , c'est-à-dire. Une série de sous-lameurs System/IO/Compression sera plutôt un System.IO.Compression unique de haut niveau.
Le commutateur --suppress-metadata vous permet de supprimer la sortie des commentaires, y compris les pointeurs de méthode, les décalages de champ et les indices de type. Ceci est utile lorsque vous souhaitez diffuser les modifications entre deux versions d'une application pour voir uniquement quels types ont changé.
Le commutateur --seperate-attributes dirige IL2CPPInspector pour mettre des attributs au niveau de l'assemblage dans leurs propres fichiers AssemblyInfo.cs plutôt que en haut du premier fichier généré pour chaque assemblage, lorsque layout est assembly ou tree .
Exécutez simplement IL2CPPInSpector avec le commutateur -p pour choisir le fichier de sortie de script IDA. Chargez votre fichier binaire dans IDA, appuyez sur ALT + F7 et sélectionnez le script généré. Observez la fenêtre de sortie tandis que IDA analyse le fichier - cela peut prendre beaucoup de temps.
Trois fichiers sont générés par IL2CPPInSpector pour idapython: le script Python lui-même, un fichier de métadonnées JSON et un fichier d'en-tête de type C ++ (il s'agit cpp/appdata/il2cpp-types.h par défaut si vous avez utilisé le CLI, ou il2cpp.h si vous avez utilisé la GUI). Ces fichiers doivent être présents pour que le script s'exécute avec succès.
Si vous savez avec quelle version d'Unity le binaire a été compilée, vous pouvez améliorer la sortie en spécifiant cela avec --unity-version , par exemple --unity-version 2019.3.1f1 . Vous pouvez également fournir n'importe quel fichier d'actifs à partir de l'application pour détecter la version Unity avec --unity-version-from-asset . Sinon, IL2CPPInspector fera une supposition éclairée basée sur le contenu du binaire.
IL2CPPInSpector génère les données suivantes pour les projets IDA:
Exemple de décompilation IDA C ++ après avoir appliqué IL2CPPInSpector (code d'initialisation omis pour la concision):

Exécutez IL2CPPInSpector avec le commutateur -p pour choisir le fichier de sortie de script Ghidra, et -t Ghidra (sensible à la casse) pour spécifier Ghidra comme type de script que vous souhaitez produire.
Trois fichiers sont générés par IL2CPPInspector pour Ghidra: le script Python lui-même, un fichier de métadonnées JSON et un fichier d'en-tête de type C ++. Ces fichiers doivent être présents pour que le script s'exécute avec succès.
Si vous savez avec quelle version d'Unity le binaire a été compilée, vous pouvez améliorer la sortie en spécifiant cela avec --unity-version , par exemple --unity-version 2019.3.1f1 . Vous pouvez également fournir n'importe quel fichier d'actifs à partir de l'application pour détecter la version Unity avec --unity-version-from-asset . Sinon, IL2CPPInspector fera une supposition éclairée basée sur le contenu du binaire.
Remarque: Pour les meilleurs résultats, choisissez non lorsque Ghidra demande si vous souhaitez effectuer une analyse automatique lorsque le binaire est chargé pour la première fois. Si vous recevez des Conflicting data exists at address lors de l'exécution du script ci-dessous, rechargez le binaire dans le projet et choisissez No à l'invite Auto-Analysis.
Remarque: Pour accélérer considérablement l'analyse pour les fichiers ELF, définissez la base d'image sur zéro ( 0x00000000 ) dans les options de chargement pour le binaire. Pour des raisons de compatibilité, l'exécution du script Ghidra Python sur un fichier ELF modifiera la base d'image du fichier en zéro pour vous si nécessaire, mais si la base d'image actuelle est non nul, cela peut prendre beaucoup de temps. D'autres formats de fichiers conserveront la même base d'image.
Pour importer des métadonnées dans un projet Ghidra existant:
Dans le navigateur de code , choisissez Fichier -> Parse C Source ...
Créez un nouveau profil et ajoutez le fichier d'en-tête de type C ++ généré. Il s'agit cpp/appdata/il2cpp-types.h par défaut si vous avez utilisé la CLI, ou il2cpp.h si vous avez utilisé l'interface graphique.
Assurez-vous que les options d'analyse sont définies exactement comme suit:
-D_GHIDRA_
Cliquez sur l'analyse pour programmer et accepter les avertissements. Cela peut prendre beaucoup de temps.
Ouvrez le Script Manager et ajoutez le dossier de sortie que vous avez choisi dans IL2CPPInSpector en tant que dossier de script.
Si vous avez utilisé des scripts d'IL2CPPInspector pour d'autres binaires, assurez-vous que les fichiers Python sont nommés différemment ou désactivez l'utilisation des dossiers de script précédents.
Cliquez sur actualiser pour faire apparaître le script dans Script Manager .
Cliquez avec le bouton droit sur le script et choisissez Exécuter . Cela peut prendre un certain temps pour terminer.

IL2CPPInSpector génère des données identiques pour les projets Ghidra comme pour IDA - voir la section ci-dessus pour plus de détails.
Exemple de décompilation Ghidra C ++ après avoir appliqué IL2CPPInSpector:

IL2CPPInSpector génère une série de fichiers source C ++ que vous pouvez utiliser de diverses manières, par exemple:
Exécutez IL2CPPInSpector avec le commutateur -h pour choisir le dossier de sortie C ++.
Si vous savez avec quelle version d'Unity le binaire a été compilée, vous pouvez améliorer la sortie en spécifiant cela avec --unity-version , par exemple --unity-version 2019.3.1f1 . Vous pouvez également fournir n'importe quel fichier d'actifs à partir de l'application pour détecter la version Unity avec --unity-version-from-asset . Sinon, IL2CPPInspector fera une supposition éclairée basée sur le contenu du binaire.
Vous pouvez cibler le compilateur C ++ que vous souhaitez utiliser les fichiers de sortie avec: spécifier --cpp-compiler MSVC pour Visual Studio et --cpp-compiler GCC pour GCC ou Clang.
IL2CPPInSpector effectue une résolution automatique des conflits de noms pour éviter l'utilisation de symboles prédéfinis et de mots clés en C ++, et pour gérer la redéfinition de symboles de même nom dans l'application.
Certains fichiers binaires IL2CPP ne contiennent qu'un ensemble partiel d'exportations d'API, ou aucune du tout. Pour ces cas, IL2CPPInspector créera des échafaudages en utilisant uniquement les exportations disponibles pour s'assurer que le projet se compile avec succès.

Les fichiers suivants sont générés:
appdata - Ce dossier contient des déclarations spécifiques à l'agnostique du projet: 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 pour la version IL2CPP utilisée par le binaire cibleLes fichiers ci-dessus contiennent toutes les données nécessaires pour une analyse dynamique dans un débogueur.
De plus, les fichiers suivants sont générés pour l'injection de DLL:
framework - Projet-Agnostic Binary-Amnostic Code et échafaudage:
dllmain.cpp :
init_il2cpp() (voir ci-dessous) et démarre Run() (voir ci-dessous) dans un nouveau fil helpers.cpp AND helpers.h :
helpers.h pour plus de détails. il2cpp-init.cpp , il2cpp-init.h et il2cpp-appdata.h :
void init_il2cpp() qui utilise tous les en-têtes ci-dessus pour générer des pointeurs de fonction et des pointeurs de classe utilisables qui sont cartographiés aux bons endroits de l'image en mémoire lors de l'exécution pch-il2cpp.cpp et pch-il2cpp.h :
appdata user - code utilisateur binaire spécifique au projet que vous pouvez modifier comme souhaité:
main.cpp et main.h :Run() qui désigne le point d'entrée de votre code injecté personnalisé. La fonction s'exécute dans un nouveau thread et ne bloque donc pas DllMain .Il s'agit du seul dossier dont vous devez modifier les fichiers .
Pour les utilisateurs de Visual Studio, les fichiers suivants sont également générés:
IL2CppDLL.vcxproj , Il2CppDLL.vcxproj.filters et Il2CppDLL.sln : Le main.cpp par défaut inclut le code commenté pour vous permettre d'écrire dans un journal ou d'ouvrir une nouvelle console en utilisant les fonctions de helpers.h . Pour spécifier une cible de fichier journal dans votre code source, utilisez extern const LPCWSTR LOG_FILE = L"my_log_file.txt" .
Astuce: Lorsqu'une nouvelle version de l'application cible est publiée, vous pouvez réaliser le projet d'échafaudage C ++ en place. Les dossiers appdata et framework seront remplacés mais le dossier user et les fichiers de projet / solution ne seront pas modifiés. Cela facilite la mise à jour de votre projet lorsque l'application cible a été mise à jour!
Compatibilité: il est recommandé d'utiliser Visual Studio 2019 (MSVC ++ Build Tools V142 ou version ultérieure). Les projets d'échafaudage ont été testés avec Visual Studio 2019 et Visual Studio 2017 (MSVC ++ Build Tools V141), mais un code d'assistance est omis lors de l'utilisation de Visual Studio 2017 afin de permettre à la compilation de réussir.
Il2CppDLL.sln ) dans Visual StudioRun() dans main.cppVous avez accès à tous les types et méthodes d'équivalents C # dans l'application, ainsi que toutes les fonctions API IL2CPP disponibles. Aucune déclaration de pointeur ou de type supplémentaire n'est requise.
Exemple (Créez un Vector3 et enregistrez sa coordonnée y à un fichier):
// 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 ));
}Des tutoriels plus détaillés peuvent être trouvés ici:
Comment créer, utiliser et déboguer les projets d'injection de DLL IL2CPP
Travailler avec le code dans les projets d'injection de DLL IL2CPP
IL2CPPInSpector peut créer un espace de travail Visual Studio complet avec un fichier de solution (.sln), des fichiers de projet (.csproj) et de la structure de dossiers de type arborescence de classe d'assembly-namespace. Chaque projet crée un seul assemblage.
Utilisez le commutateur --project pour générer un espace de travail de solution.
Pour que Il2CPPPInspector puisse créer des fichiers .csproj qui contiennent les références d'assemblage Unity correctes, vous devez fournir le chemin d'accès à un éditeur d'unité installé et un modèle de projet ou un dossier ScriptAssemblies d'un projet Unity existant.
Remarque: Les paramètres par défaut sélectionneront la dernière version installée d'Unity et la dernière version installée du modèle de projet 3D par défaut, s'ils ont été installés dans l'emplacement par défaut.
Emplacement typique de l'éditeur Unity (spécifié avec --unity-path ): C: Program Files Unity Hub Editor 20XX.YZ
Emplacement typique du modèle de projet Unity (spécifié avec --unity-assemblies ): C: Program Files Unity Hub Editor 20XX.YZ Editor Data Resources PackageManager ProjectTemplates Libcache <name-of-template>
Assemblages de script d'unité typique Emplacement dans le projet existant (spécifié avec --unity-aseemblies ): x: myproject bibliothèque scriptAssemblies
Remplacez X , Y et Z par votre numéro de version Unity. Remplacez <nom-of-template> par le modèle souhaité.
Remarque: vous pouvez utiliser le jildark Asterisk (*) une ou plusieurs fois lorsque vous spécifiez ces chemins. IL2CPPInSpector sélectionnera le dernier dossier correspondant dans l'ordre alphanumérique. Ceci est utile si vous avez plusieurs installations d'unité côte à côte et que vous souhaitez toujours sélectionner la dernière version ou modèle.
Dans le cas où les références d'assemblage ne sont pas correctement résolues la première fois que vous chargez une solution, fermez et rouvrez simplement la solution pour les forcer à être résolues.

IL2CPPInspector peut créer un fichier JSON contenant diverses métadonnées sur l'application.
Utilisez le commutateur -o pour spécifier le chemin de sortie JSON.
Le schéma de sortie est le suivant:
addressMap (objet)
Une carte d'adresse de tous les contenus liés à l'IL2CPP en binaire
methodDefinitions (tableau) L'adresse virtuelle, le symbole binaire, la signature de la fonction C ++ et la signature de la méthode .NET de chaque méthode .NET-équivalente dans le binaire
constructedGenericMethods (tableau) L'adresse virtuelle, le symbole binaire, la signature de la fonction C ++ et la signature de la méthode .NET de chaque méthode générique en béton .NET-équivalent dans le binaire
customAttributesGenerators (tableau) L'adresse virtuelle, le nom et la signature de la fonction C ++ de chaque fonction du générateur d'attributs personnalisés dans le binaire
methodInvokers (tableau) L'adresse virtuelle, le nom et la signature de la fonction C ++ de chaque méthode.
stringLiterals (Array) pour les versions d'unité inférieures à 5.3.2: Le ordinal, le nom et le texte de chaque chaîne littérale dans le binaire pour Unity version 5.3.2 et plus tard: l'adresse virtuelle, le nom et le texte de chaque chaîne littérale dans le binaire
typeInfoPointers (tableau) L'adresse virtuelle, le nom, le nom de type dérivé C ++ et le nom de type .NET équivalent de chaque pointeur de définition de classe ( Il2CppClass * ) dans le binaire
typeRefPointers (tableau) L'adresse virtuelle, le nom et le nom de type .net équivalent de chaque pointeur de référence ( Il2CppType * ) dans le binaire
methodInfoPointers (tableau) L'adresse virtuelle, le nom et la signature de la méthode .NET de chaque pointeur de définition de méthode d'exécution ( MethodInfo * ) dans le binaire
functionAddresses (Array) Les adresses virtuelles du début de toutes les fonctions connues du binaire, y compris tous ceux ci-dessus et les autres détectés mais non inclus dans les catégories ci-dessus
typeMetadata (Array) L'adresse virtuelle, le nom et le type C ++ Nom des éléments de métadonnées clés dans le binaire. Cela inclut Il2CppCodeRegistration et Il2CppMetadataRegistration , et en fonction de la version binaire peut également inclure un pointeur de chaque Il2CppCodeGenModule
arrayMetadata (tableau) L'adresse virtuelle, le nom, le nom de type C ++ et la taille des tableaux de métadonnées clés dans le binaire
functionMetadata (tableau) L'adresse virtuelle, le nom et la signature de la fonction C ++ des fonctions de métadonnées clés dans le binaire. Selon la façon dont le binaire a été analysé par IL2CPPInspector, cela peut inclure il2cpp_codegen_register .
apis (tableau) L'adresse virtuelle, le nom et la signature de la fonction C ++ de chaque fonction API IL2CPP identifiée dans le binaire
exports (tableau) l'adresse virtuelle et le nom de chaque exportation du binaire
symbols (tableau) L'adresse virtuelle, le nom et le type de symbole de chaque longueur nommée (longueur de nom non nul) et définition de fonction d'adresse non nulle, type, nom de champ et importation (pour ELF) définie dans le binaire. Pas actuellement pris en charge pour les fichiers PE.
Trois scripts PowerShell sont fournis pour permettre la construction et les tests faciles des binaires IL2CPP:
il2cpp.ps1 est le cheval de bataille principal et compile chaque fichier source C # spécifié dans TestSources (ou tous si aucun n'est fourni) en tant qu'assemblage séparé, et les publie à TestAssemblies . Il prend ensuite chaque assemblage spécifié dans TestAssemblies et compile chacun en tant que projet IL2CPP séparé pour chacune de ces architectures:
Ceux-ci sont placés dans le dossier TestBinaries . Le code source C ++ pour chaque version est placé dans le dossier TestCpp . Il appelle alors generate-tests.ps1 .
Spécifiez une liste de fichiers source séparée par des virgules (sans l'extension .cs ) pour traiter comme premier argument (ou -assemblies ).
Vous pouvez éventuellement spécifier une version Unity ou un chemin d'installation d'unité avec le 2ème argument (ou -unityVersion ). Si aucun n'est fourni, la dernière version d'unité installée sera utilisée. Vous pouvez également spécifier les jokers, par exemple. 2019* utilisera la dernière version installée d'Unity 2019, 2018.3* utilisera la dernière version installée d'Unity 2018.3 etc. Utilisez Unity Hub pour installer les versions souhaitées.
Par conséquent, avec une commande, vous pouvez générer une DLL d'assemblage, un code source C ++ et un binaire IL2CPP pour chaque architecture pour une liste donnée de fichiers source, un ensemble de sorties par fichier source, pour une version spécifiée d'unité.
generate-tests.ps1 génère un fichier appelé Tests.cs dans le projet Il2CppTests , contenant un test par projet IL2CPP dans TestBinaries . Ce fichier sera compilé par le projet Il2CppTests . Vous pourrez alors voir un test par projet IL2CPP dans l'explorateur de test de Visual Studio.
Les tests générés automatiquement génèrent des fichiers d'en-tête C #, JSON et C dans le dossier de test IL2CPP Binary dans TestBinaries (chaque nom de fichier préfixé avec test ) et les compare (insensible à l'espace blanc) avec les fichiers de nom de projet correspondants dans TestExpectedResults . De cette façon, vous pouvez vérifier les fichiers avec une structure connue que l'analyse est effectuée correctement, ou parcourir l'analyse de binaires spécifiques dans le débogueur sans avoir à modifier les arguments en ligne de commande du projet.
update-expected-results.ps1 Copie Tous les résultats de test de sortie de TestBinaries dans TestExpectedResults , mettant ainsi à jour les fichiers qui seront utilisés pour vérifier les résultats des tests corrects.
Exemple d'utilisations:
./il2cpp.ps1
Construit chaque fichier source C # ìNt une DLL d'assemblage .NET, un dossier source C ++ et un binaire IL2CPP par architecture prise en charge
./il2cpp.ps1 MyFirstTest
construit MyFirstTest.cs dans MyFirstTest.dll , crée un dossier source C ++ nommé MyFirstTest et un binaire IL2CPP pour chaque architecture prise en charge
./il2cpp.ps1 MyFirstTest,MySecondTest 2019.3.1f1
construit MyFirstTest.cs et MySecondTest.cs dans des DLL d'assemblage individuelles, des dossiers source C ++ et des binaires IL2CPP, en utilisant Unity 2019.3.1f1
./il2cpp.ps1 MyFirstTest,MySecondTest F:UnityHubEditor2019.3.1f1
Comme ci-dessus mais spécifie un chemin personnalisé pour votre installation d'unité.
La version Unity à prise en charge minimale est 2017.1.0f3.
Pour en savoir plus sur ces fonctionnalités, consultez la section intitulée Utilisation d'IL2CPPInspector pour générer du code IL2CPP dans IL2CPP Forme d'ingénierie de la partie 1.
Remarque: Les API IL2CPPInspector sont également disponibles en tant que package NuGet! (Recherche: NoisyCowStudios.il2cppInspector)
IL2CPPInSpector propose les API de bibliothèque de classe réutilisables suivantes:
Utilisez ces API pour interroger facilement les types IL2CPP, créer de nouveaux modules de sortie et intégrer IL2CPPInspector avec vos propres applications d'analyse statique.
Pour utiliser IL2CPPInSpector dans vos propres projets, ajoutez une référence à Il2CppInspector.Common.dll .
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. Par exemple:
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 | Soutien |
|---|---|---|
| 4.6.1+ | Première sortie | Unsupported |
| 5.2.x | 15 | Unsupported |
| 5.3.0-5.3.1 | 16 | Fonctionnement |
| 5.3.2 | 19 | Fonctionnement |
| 5.3.3-5.3.4 | 20 | Fonctionnement |
| 5.3.5-5.4.6 | 21 | Fonctionnement |
| 5.5.0-5.5.6 | 22 | Fonctionnement |
| 5.6.0-5.6.7 | 23 | Fonctionnement |
| 2017.1.0-2018.2.21 | 24 | Fonctionnement |
| 2018.3.0-2018.4.x | 24.1 | Fonctionnement |
| 2019.1.0-2019.3.6 | 24.2 | Fonctionnement |
| 2019.3.7-2019.4.14 | 24.3 | Fonctionnement |
| 2019.4.15-2019.4.20 | 24.4 | Fonctionnement |
| 2019.4.21-2019.4.x | 24.5 | Fonctionnement |
| 2020.1.0-2020.1.10 | 24.3 | Fonctionnement |
| 2020.1.11-2020.1.17 | 24.4 | Fonctionnement |
| 2020.2.0-2020.2.3 | 27 | Fonctionnement |
| 2020.2.4-2020.3.x | 27.1 | Fonctionnement |
| 2021.1.0-2021.1.x | 27.2 | Partiel |
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
Beaucoup d'amour! - 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.