Outil WIP pour inverser le processus de construction IL2CPP d'Unity aux DLL gérés d'origine.
Les informations ci-dessous s'appliquent presque entièrement à l'application CLI disponible sur les versions GitHub. Pour la documentation sur l'utilisation du module "Core" - que la CLI est juste un wrapper autour - dans vos propres projets, voir Readme_core.md
Utilise libcpp2il pour l'analyse initiale et le chargement des structures de métadonnées. Libcpp2il est disponible dans les artefacts de construction si vous voulez faire quelque chose vous-même avec les métadonnées IL2CPP et est libéré sous la licence MIT. Le lien ci-dessus vous amènera à la documentation de libcpp2il.
CPP2IL subit actuellement une réécriture majeure. Cette branche représente le travail en cours et est sujet à changement.
Les constructions CI pour les développeurs peuvent être obtenues à partir de mon flux NuGet.
L'interface de ligne de commande a été simplifiée, passant de nombreuses options de ligne de commande à un concept de formats de sortie et de couches de traitement. Cependant, beaucoup de ces formats et couches ne sont pas encore mis en œuvre, donc les fonctionnalités sont limitées par rapport aux versions publiées précédemment.
De nombreuses options, telles que --analysis-level , --skip-analysis , etc., ont été supprimées. Ignorant le fait que l'analyse n'est pas encore mise en œuvre, ces options ne reviendront pas. L'analyse sera désactivée par défaut et sera activée via l'utilisation d'une couche de traitement.
De même, des options comme --supress-attributes , qui supprimaient auparavant les attributs CPP2ilininted, ont été remplacés par une couche de processus - celle-ci est réellement implémentée et est appelée attributeinjector . Vous pouvez activer ce calque à l'aide de l'option --use-processor , et vous pouvez répertorier d'autres options à l'aide de --list-processors .
Les vidages de métadonnées et les vidages de méthode seront également leur propre format de sortie, au lieu d'être par défaut et contrôlé via une option dédiée. Actuellement, cela signifie que vous devrez exécuter CPP2IL plusieurs fois si vous voulez les deux vidages, bien que cela puisse changer à l'avenir si nous ajoutons la prise en charge de la sortie à plusieurs formats simultanément. Comme les couches de traitement, les formats de sortie peuvent être répertoriés via l'option --list-output-formats et sont sélectionnés via l'option --output-as .
Sous le capot, la demande a été presque complètement réécrite. Principalement, cela était nécessaire en raison du degré que le CPP2IL dépendait de la bibliothèque Mono.Cecil, qui avait certaines limites. Lorsque nous avons examiné le changement, nous avons réalisé à quel point nous étions détenus dans la bibliothèque. Ce n'est plus le cas - l'application est écrite autour des types libcpp2il et les nouveaux objets de contexte d'analyse, et la bibliothèque mono.cecil n'est plus utilisée, ayant été remplacée par Asmresolver.dotnet.
En plus de cela, nous sommes actuellement en train de réimplémenter l'analyse basée sur une représentation intermédiaire appelée ISIL (langue indépendante de l'ensemble d'instructions), ce qui permettra un support beaucoup plus facile de nouveaux ensembles d'instructions. L'ISIL est ensuite converti en un graphique de flux de contrôle, qui peut être analysé plus intelligemment qu'un démontage brut.
Nous travaillons également sur un système de plugin qui permettra aux développeurs tiers d'écrire des plugins pour ajouter la prise en charge des ensembles d'instructions personnalisés, des formats binaires et éventuellement de charger des métadonnées ou des fichiers binaires obscurcis ou cryptés.
L'utilisation la plus simple de cette application concerne un jeu Unity Windows X86 ou X64. Dans ce cas, vous pouvez simplement exécuter Cpp2IL-Win.exe --game-path=C:PathToYourGame et cpp2il détectera votre version d'unité, localisera les fichiers dont il a besoin et vider la sortie dans un dossier cpp2il_out partout où vous avez exécuté la commande.
En supposant que vous disposez d'un seul fichier APK (pas un APKM ou XAPK) et que vous exécutez au moins CPP2IL 2021.4.0, vous pouvez utiliser le même argument que ci-dessus mais passer dans le chemin d'accès à l'APK, et CPP2IL extraire les fichiers dont il a besoin de l'APK.
| Option | Exemple d'argument | Description |
|---|---|---|
| --mame-path | C: Path To Game | Spécifiez le chemin vers le dossier de jeu. Requis. |
| - nom | Testgame | Spécifiez le nom du fichier EXE du jeu au cas où la détection automatique échoue (car il y a d'autres fichiers EXE dans le répertoire du jeu) |
| --verbeux | <Aucun> | Enregistrez plus d'informations sur ce que nous faisons |
| - Processeurs de liste | <Aucun> | Liste des calques de traitement disponibles, puis sortez. |
| - utilisation-processeur | attributInjector | Sélectionnez une couche de traitement à utiliser, qui peut modifier les données brutes avant la sortie. Cette option peut apparaître plusieurs fois. |
| --processor-config | clé = valeur | Fournir des options de configuration aux couches de traitement sélectionnées. Ceux-ci seront documentés par le plugin qui ajoute la couche de traitement. |
| - Formats de sortie de liste | <Aucun> | Liste des formats de sortie disponibles, puis sortez. |
| --Utput-as | dummydll | Spécifiez le format de sortie que vous souhaitez utiliser. |
| --output-to | cpp2il_out | Répertoire racine à sortir vers. Ce chemin sera transmis au format de sortie sélectionné, qui peut ensuite créer des sous-répertoires, etc. dans cet emplacement. |
| --wasm-framework-file | C: path vers webgl.framework.js | Utilisé uniquement en conjonction avec les binaires WASM. Certains d'entre eux ont des exportations obscurcis, mais elles peuvent être récupérées via un fichier framework.js, que vous pouvez fournir le chemin d'accès à l'utilisation de cet argument. |
Chaque engagement est construit sur une version CI à l'aide d'actions GitHub - le fichier d'action peut être trouvé dans le dossier .github, si vous souhaitez reproduire les builds vous-même. Sachez que ceux-ci peuvent ne pas être les plus stables - bien qu'il existe des tests pour assurer la compatibilité avec une gamme de jeux, parfois les choses se cassent! Ceux-ci sont versés par le commit dont ils ont été construits.
Les fichiers de version peuvent être téléchargés à partir de l'onglet Actions si vous êtes connecté à GitHub, ou si vous pouvez utiliser les liens suivants, qui pointent toujours vers la dernière version CI réussie. Notez que la version .NET Framework est fournie pour la compatibilité avec le vin / proton.
En plus de cela, je libère manuellement les constructions de sortie "Milestone" chaque fois que je pense qu'un ensemble majeur d'améliorations a été apporté. Ceux-ci ne sont pas marqués comme des pré-sorties sur Github, et devraient (au moins en théorie) être stables et adaptés à une utilisation sur une gamme de jeux.
Depuis la première construction de jalons 2021.0, et à partir, CPP2IL fournit désormais des données plus structurées rigidement à la console. Cela inclut les niveaux de journal (verbe, info, avertissement, échec) et les couleurs associées (gris pour le verbe, bleu pour info, jaune pour avertir, rouge pour l'échec).
À partir de Milestone 2021.1, si CPP2IL est capable de détecter que vous courez dans le vin / proton, ces codes de couleur ANSI sont désactivés, car ils ne sont pas pris en charge par le vin et ont l'air horribles.
Les messages verbaux ne seront enregistrés que si CPP2IL est lancé avec l'option --verbose , et il serait utile que vous puissiez signaler les problèmes avec ce drapeau activé. Pour un fonctionnement normal, ils ne devraient pas être nécessaires, sauf si vous êtes curieux.
Si vous ne souhaitez pas que la sortie soit colorée, définissez la variable d'environnement NO_COLOR=true .
Cette application est construite principalement à l'aide de .NET 9.0, mais une version .NET Framework 4.7.2 est également publiée à des fins héritées.
Il utilise les bibliothèques suivantes, pour lesquelles je suis très reconnaissant:
(Tous sont sous licence MIT à part Xunit qui est Apache 2.0 + MIT)
WasmDisassembler .La version Net472 utilise les bibliothèques supplémentaires suivantes:
Certains plugins utilisent également des bibliothèques supplémentaires:
CPP2IL est (très vaguement, à ce stade) basé sur IL2CPPDUPER, que j'ai fourchu en 2018 et supprimé beaucoup de code, réécrit beaucoup et ajouté beaucoup plus. Mais à la base, il y a encore du dumper, principalement dans LibCPP2IL.
Il contient des morceaux d'IL2CPPInspector, pris avec la permission de Djkaty, et j'aimerais lui exprimer ma gratitude ici pour son aide inestimable.
Je tiens à remercier la communauté et la discorde du modding Audica pour l'inspiration initiale pour ce projet, beaucoup de soutien au début et les demandes de fonctionnalités de nos jours.
Et enfin, consultez d'autres projets sympas qui se connectent à celui-ci. Bien sûr, j'ai mentionné IL2CPPInterop plus haut, mais consultez également Melonloader, qui utilise CPP2IL pour la génération de DLL factice.