Herramienta WIP para revertir el proceso de compilación de IL2CPP de Unity de regreso a las DLL administradas originales.
La información a continuación se aplica casi por completo a la aplicación CLI disponible en las versiones de GitHub. Para la documentación sobre el uso del módulo "Core", con el cual la CLI es solo un envoltorio, en sus propios proyectos, consulte ReadMe_Core.md
Utiliza libcpp2il para el análisis inicial y la carga de estructuras de metadatos. LibCpp2il se puede obtener de los artefactos de construcción si desea hacer algo usted mismo con los metadatos de IL2CPP, y se lanza bajo la licencia MIT. El enlace de arriba lo llevará a la documentación de LibCPP2IL.
CPP2IL está actualmente experimentando una importante reescritura. Esta rama representa el trabajo en progreso y está sujeta a cambios.
Las compilaciones de CI para desarrolladores se pueden obtener de mi alimentación nuget.
La interfaz de línea de comandos se ha simplificado, pasando de muchas opciones de línea de comando a un concepto de formatos de salida y capas de procesamiento. Sin embargo, muchos de estos formatos y capas aún no se implementan, por lo que la funcionalidad es limitada en comparación con las versiones publicadas previamente.
Se han eliminado muchas opciones, como --analysis-level , --skip-analysis , etc. Ignorando el hecho de que el análisis aún no se ha implementado, estas opciones no volverán. El análisis estará apagado de forma predeterminada y se habilitará mediante el uso de una capa de procesamiento.
Igualmente, las opciones como --supress-attributes , que suprimieron previamente los atributos CPP2ilinyected, se han reemplazado con una capa de proceso: esta realmente se implementa y se llama attributeinjector . Puede habilitar esta capa utilizando la opción --use-processor , y puede enumerar otras opciones usando --list-processors .
Los volcados de metadatos y los volcados de métodos también serán su propio formato de salida, en lugar de ser predeterminado, y controlados a través de una opción dedicada. Actualmente esto significa que deberá ejecutar CPP2IL varias veces si desea ambos volcados, aunque esto puede cambiar en el futuro si agregamos soporte para la salida a múltiples formatos simultáneamente. Al igual que las capas de procesamiento, los formatos de salida se pueden enumerar a través de la opción --list-output-formats , y se seleccionan a través de la opción --output-as .
Debajo del capó, la aplicación ha sido casi completamente reescritada. Principalmente, esto era necesario debido al grado CPP2IL dependía de la biblioteca Mono.Cecil, que tenía algunas limitaciones. Cuando buscamos cambiar, nos dimos cuenta de lo confiables que éramos en la biblioteca. Este ya no es el caso: la aplicación está escrita en torno a los tipos de libcpp2il y los nuevos objetos de contexto de análisis, y la biblioteca mono.cecil ya no se usa, ya que ha sido reemplazada por asmresolver.dotnet.
Además de eso, actualmente estamos en el proceso de reimplemento del análisis basado en una representación intermedia llamada ISIL (lenguaje independiente del conjunto de instrucciones), que permitirá un soporte mucho más fácil de nuevos conjuntos de instrucciones. El ISIL se convierte en un gráfico de flujo de control, que se puede analizar de manera más inteligente que un desmontaje en bruto.
También estamos trabajando en un sistema de complementos que permitirá a los desarrolladores de terceros escribir complementos para agregar soporte para conjuntos de instrucciones personalizados, formatos binarios y, finalmente, cargar metadatos o archivos binarios ofuscados o cifrados.
El uso más simple de esta aplicación es para un juego de Unity Windows X86 o X64. En ese caso, simplemente puede ejecutar Cpp2IL-Win.exe --game-path=C:PathToYourGame y cpp2il detectará su versión de unidad, localizará los archivos que necesita y descargará la salida en una carpeta CPP2IL_Out donde sea que ejecute el comando desde.
Suponiendo que tiene un solo archivo APK (no un APKM o XAPK), y está ejecutando al menos CPP2IL 2021.4.0, puede usar el mismo argumento que anteriormente, pero pasar en la ruta al APK, y CPP2IL extraerá los archivos que necesita del APK.
| Opción | Ejemplo de argumento | Descripción |
|---|---|---|
| --Game-Path | C: Path to Game | Especifique el camino a la carpeta del juego. Requerido. |
| -exe-Nombre | Juego de prueba | Especifique el nombre del archivo EXE del juego en caso de que la detección automática falle (porque hay otros archivos EXE en el directorio de juegos) |
| --verboso | <No None> | Registre más información sobre lo que estamos haciendo |
| --Procesadores de la lista | <No None> | Lista de capas de procesamiento disponibles, luego salga. |
| -uso procesador | atributeinjector | Seleccione una capa de procesamiento para usar, que puede cambiar los datos sin procesar antes de la salida. Esta opción puede aparecer varias veces. |
| --processor-config | clave = valor | Proporcione opciones de configuración a las capas de procesamiento seleccionadas. Estos serán documentados mediante el complemento que agrega la capa de procesamiento. |
| -formatos de salida-salida | <No None> | Lista de formatos de salida disponibles, luego salga. |
| --output-as | muñeco | Especifique el formato de salida que desea usar. |
| -output-to | cpp2il_out | Directorio raíz a la salida a. Esta ruta se pasará al formato de salida seleccionado, que luego puede crear subdirectorios, etc. dentro de esta ubicación. |
| --File de trabajo de Wass-Wasm | C: Path a Webgl.framework.js | Solo se usa junto con binarios WASM. Algunos de estos han ofuscado exportaciones, pero pueden recuperarse a través de un archivo Framework.js, que puede proporcionar la ruta para usar este argumento. |
Cada confirmación se construye para una compilación de CI utilizando acciones de GitHub: el archivo de acción se puede encontrar en la carpeta .github, si desea reproducir las compilaciones usted mismo. Tenga en cuenta que estos pueden no ser los más estables, mientras que hay pruebas para garantizar la compatibilidad con una variedad de juegos, ¡a veces las cosas se rompen! Estos son versados por el compromiso del que fueron construidos.
Los archivos de lanzamiento se pueden descargar desde la pestaña Acciones si se registra en GitHub, o puede usar los siguientes enlaces, que siempre apuntan a la última compilación de CI exitosa. Tenga en cuenta que la compilación .NET Framework se proporciona para la compatibilidad con el vino/protón.
Además de esto, lento manualmente las compilaciones de lanzamiento de "Milestone" cada vez que creo que se ha realizado un conjunto importante de mejoras. Estos no están marcados como preliminares en GitHub, y deberían (al menos en teoría) ser estables y adecuados para su uso en una variedad de juegos.
Desde el primer hito, la compilación 2021.0, y en adelante, CPP2IL ahora genera datos más rígidamente estructurados a la consola. Esto incluye niveles de registro (verbo, información, advertencia, fallas) y colores asociados (gris para verbo, azul para información, amarillo para advertencia, rojo para fallas).
A partir de Milestone 2021.1, si CPP2IL puede detectar que está corriendo en vino/protón, estos códigos de color ANSI están deshabilitados, ya que no son compatibles con el vino y se ven horribles.
Los mensajes verbales solo se registrarán si CPP2IL se inicia con la opción --verbose , y sería útil si pudiera informar problemas con este indicador habilitado. Para el funcionamiento normal, no deberían ser necesarios, a menos que tengas curiosidad.
Si no desea que la salida se coloree, establezca la variable de entorno NO_COLOR=true .
Esta aplicación se crea principalmente utilizando .NET 9.0, pero una compilación .NET Framework 4.7.2 también se publica para fines heredados.
Utiliza las siguientes bibliotecas, para las cuales estoy muy agradecido:
(Todos tienen licencia MIT aparte de Xunit, que es Apache 2.0+MIT)
WasmDisassembler .La compilación Net472 utiliza las siguientes bibliotecas adicionales:
Algunos complementos también usan bibliotecas adicionales:
CPP2IL se basa (muy libremente, en este punto) en IL2CPPDUMPER, que bifurcé en 2018 y eliminé mucho código, reescribió mucho y agregué mucho más. Pero en esencia, todavía le queda algo de dumper, principalmente en libcpp2il.
Contiene bits y piezas del IL2Cppinspector, tomado con permiso de Djkaty, y me gustaría expresarle mi gratitud aquí por su ayuda invaluable.
Me gustaría agradecer a la comunidad de Audica Modding y Discord por la inspiración inicial para este proyecto, mucho apoyo en los primeros días y las solicitudes de funciones en estos días.
Y finalmente, consulte otros proyectos interesantes que se conectan con este. Por supuesto, mencioné IL2CPPinterop más arriba, pero también revisé MelonLoader, que usa CPP2IL para la generación de DLL Dummy.