Es muy arrepentido de que tengo que anunciar que el trabajo de desarrollo en IL2CPPINSPETOR se ha detenido en el futuro previsible.
La razón de esto es que debido a la salud y los cambios en mi vida personal, simplemente no tengo tiempo para comprometerme a trabajar en el proyecto. Esto es muy frustrante para mí, pero hay poco que realmente pueda hacer al respecto.
¡No dude en bifurcar el proyecto y hacer mejoras! También puede continuar publicando problemas, ya que me gustaría tener un compendio de errores y problemas guardados en caso de que yo u otra persona tengamos la oportunidad de volver a trabajar en esto. Sin embargo, tenga en cuenta que no responderé a problemas o relaciones públicas en el futuro en el futuro previsible.
Si necesita herramientas de IL2CPP, le recomiendo el excelente proyecto CPP2IL de mi amigo y colega que es una herramienta de trabajo en progreso para convertir binarios de IL2CPP directamente en el código IL que se puede ver fácilmente en DNSPY, etc. Esta es una tarea gigantesca, así que vaya y apoye su trabajo en este increíble proyecto.
Feliz piratería,
Katy.
IL2CPPINSPECTOR le ayuda a revertir las aplicaciones IL2CPP de ingeniería, proporcionando el análisis más completo disponible actualmente.

Salir definiciones de tipo IL2CPP, metadatos y punteros de método como código STUB C#
Cree DLL de capas de ensamblaje .NET que contienen la estructura de la aplicación IL2CPP y los metadatos para su uso en descompiladores como ILSPY, DNSPY, Unity Asset Carging con AssetStudio o generación de proxy administrada con IL2CPPAssemblyunhollower
Cree andamios C ++ para todos los tipos, métodos, punteros de funciones y funciones API en una aplicación IL2CPP para su uso en el sustrato X64DBG, Cydia, etc.
Cree scripts de Ida y Ghidra Python para llenar el símbolo, la función y el tipo de información; Incluye ganchos API para implementar scripts para otros objetivos
Crear proyectos de inyección DLL de Visual Studio C ++ DLL directamente a partir de archivos IL2CPP
Crear soluciones de stub de código C# Visual Studio directamente desde los archivos IL2CPP
Cree metadatos JSON con un mapa de dirección completo directamente a partir de archivos IL2CPP.
Crear binarios IL2CPP a partir del código fuente arbitrario de C# sin un proyecto de unidad
Tres API principales para su uso en sus propios proyectos de análisis estático personalizados para consultar metadatos binarios de bajo nivel, el modelo de tipo .NET y toda la aplicación C ++. Estos también están disponibles como un paquete Nuget.
Plugin SDK le permite crear complementos personalizados para extender las capacidades de IL2CPPINSPECTOR
Derrota ciertos tipos de ofuscación
Admite todos los formatos de archivo y arquitecturas de procesadores principales
Funciona en Windows, MacOS X y Linux. GUI integrado para usuarios de Windows con soporte de arrastrar y soltar
Probado con cada liberación de IL2CPP desde Unity 5.3.0
Puede leer más sobre cómo funciona IL2CPP en mi serie IL2CPP Ingeniería inversa:
Parte 1: Hello World y la cadena de herramientas IL2CPP
Parte 2: Descripción general estructural y encontrar los metadatos
IL2CPPINSPEDROR DE DESARROLLO DE CULGINOS
Cómo crear, usar y depurar proyectos de inyección de DLL IL2CPP
Trabajar con código en proyectos de inyección de DLL IL2CPP
Uso del modelo de tipo de IL2CPPINSPETOR para extraer definiciones de ProtoBuf-Net (estudio de caso: chicos de otoño)
Encontrar cargadores para archivos ofuscados de metadata.dat: explica cómo encontrar el código de cargador, desobfuscación y/o descifrado para global-metadata.dat en casi cualquier aplicación IL2CPP
Habilitar la carga de League of Legends: Wild Rift: cubre el descifrado de XOR, descifrado de cadenas XOR, descifrado de podredumbre de exportación de API, ofuscación de datos de metadatos binarios
Habilitar la carga de Honkai Impact (3 partes): cubre funciones de búsqueda en una imagen, ofuscación de datos de Global -Metadata.dat, técnicas de descomposición de Ida, cómo escribir un complemento
VMProtect Control Flow Ofuscation en Honkai Impact: cubre que extrapolan la ruta del código de una función con aplanamiento del flujo de control usando x64dbg y el descompilador de IDA
Ingeniería inversa Genshin Impacto con PowerShell: cubre escribir un arnés de prueba para encontrar una función en un binario ofuscado a través de ataque de fuerza bruta / fuzzing inverso
Formato de archivo y soporte de arquitectura:
Encantado de tener:
using . El alcance y los conflictos de nombre de tipo se resuelven automáticamente para producir un código que se compila.Objetivos de biblioteca de clases .NET Core 3.1. Construido con Visual Studio 2019.
Nota : IL2Cppinspector no es un descompilador. Puede proporcionarle la estructura de una aplicación y direcciones de funciones para cada método para que pueda saltar fácilmente a los métodos de interés en su desmontador. No intenta recuperar todo el código fuente de la aplicación.
git clone --recursive https://github.com/djkaty/Il2CppInspector
cd Il2CppInspector
Construya las versiones CLI y Windows GUI:
dotnet publish -c Release
Obtenga todos los complementos actuales (opcional):
powershell -f get-plugins.ps1
Construye la versión CLI:
cd Il2CppInspector.CLI
dotnet publish -r osx-x64 -c Release
Obtenga todos los complementos actuales (opcional):
../get-plugins.sh
Construye la versión CLI:
cd Il2CppInspector.CLI
dotnet publish -r linux-x64 -c Release
Obtenga todos los complementos actuales (opcional):
../get-plugins.sh
Para otros sistemas operativos que admiten .NET Core, agregue -r xxx al comando final donde xxx es un RID de https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog
El binario de salida para el uso de la línea de comandos se coloca en Il2CppInspector/Il2CppInspector.CLI/bin/Release/netcoreapp3.0/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
El binario de salida para Windows GUI se coloca en Il2CppInspector/Il2CppInspector.GUI/bin/Release/netcoreapp3.1/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
La carpeta plugins debe colocarse en la misma carpeta que Il2CppInspector.exe .
Ejecute Il2CppInspector.exe en el símbolo del sistema.
El formato de archivo y la arquitectura se detectan automáticamente.
Todas las salidas se generan de forma predeterminada. Para generar solo salidas específicas, use el interruptor --select-outputs en combinación con los interruptores de selección de salida.
-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 binarios y apks/xapks con binarios para múltiples arquitecturas : cuando se usa la CLI, se generarán múltiples archivos de salida, con cada nombre de archivo además del primer sufijo por el índice de la imagen en el binario. Se omitirán imágenes no compatibles.
Paquetes IPA : el ejecutable debe descifrarse primero. Los binarios ejecutables cifrados no son compatibles.
PAQUETES DE APK dividido : al usar la CLI, especifique una lista de archivos APK con una coma entre cada nombre de archivo.
Binarios de elfos creados a partir de vertederos de memoria : especifique la base de imágenes (en hex) usando --image-base . Si la base de imagen suministrada es incorrecta, la aplicación puede bloquearse.
GameGuardian Dumps (y otros volcados de mapa de proceso de Linux) : puede usar un archivo *-maps.txt en lugar de un binario IL2CPP. IL2CPPINSPECTOR escaneará la carpeta que contiene el archivo MAPS para los archivos .bin coincidentes y vuelva a armar y rebase libil2cpp.so automáticamente. Por lo tanto, no necesita crear el archivo manualmente o proporcionar una dirección base de imagen cuando use este tipo de volcado. Para que esto funcione, ni el archivo de texto ni ninguno de los archivos binarios deben cambiarse, y todos deben estar en la misma carpeta.
Archivos PE empaquetados (DLLS) : Advertencia: Cargar un archivo PE empaquetado hará que se ejecuten el punto de entrada de la DLL y las funciones de inicialización. No cargue DLL maliciosos y nunca ejecute IL2CPPINSPECTOR como administrador al manejar archivos de PE empaquetados. Use bajo su propio riesgo.
IL2CPPINSPECTOR puede crear archivos de código de código C# con metadatos de puntero para permitirle explorar el binario IL2CPP en un formato fácil de leer.
Especifique el interruptor -c para elegir el archivo o ruta de salida C#.
Para excluir los tipos de ciertos espacios de nombres a partir de la generación de la salida del archivo de origen C#, proporcione una lista separada por comas de espacios de nombres sensibles a los casos en --exclude-namespaces . Se excluirán los siguientes espacios de nombres si no se especifica ningún argumento:
System
Mono
Microsoft.Reflection
Microsoft.Win32
Internal.Runtime
Unity
UnityEditor
UnityEngine
UnityEngineInternal
AOT
JetBrains.Annotations
Proporcionar un argumento a --exclude-namespaces anulará la lista predeterminada. Para emitir todos los espacios de nombres, use --exclude-namespaces=none . Esto solo se aplica a la salida de prototipos de C#.
Puede especificar el diseño de salida con el interruptor --layout :
single : todos los tipos en un solo archivonamespace : un espacio de nombres por archivo (cada archivo recibirá el nombre del espacio de nombres)assembly : un ensamblaje por archivo (cada archivo se le dará el nombre de la ensamblaje)class : una clase por archivotree : una clase por archivo en una estructura de carpeta con forma de árbol con carpetas de ensamblaje de nivel superior y carpetas de segundo nivel Puede especificar el pedido de tipo intra-archivo con el interruptor --sort :
index - Ordenar el índice de definición de tipo como se encuentra en los metadatos de IL2CPPname : ordene alfabéticamente por tipo de nombre Este interruptor no tiene efecto al usar el diseño class o tree .
El interruptor --flatten le permite aplanar una jerarquía de espacios de nombres anidados cuando layout es class o namespace , es decir. En cambio, una serie de System/IO/Compression de Sub-Folders será un único System.IO.Compression subterráneo de nivel superior.
El interruptor --suppress-metadata le permite suprimir la salida de comentarios, incluidos los punteros del método, las compensaciones de campo e índices de tipo. Esto es útil cuando desea difundir los cambios entre dos versiones de una aplicación para ver solo qué tipos han cambiado.
El interruptor --seperate-attributes ordena a IL2CPPINSPECTOR para colocar atributos de nivel de ensamblaje en sus propios archivos AssemblyInfo.cs en sus archivos en lugar de en la parte superior del primer archivo generado para cada ensamblaje, cuando layout es assembly o tree .
Simplemente ejecute IL2CPPINSPECTOR con el conmutador -p para elegir el archivo de salida del script IDA. Cargue su archivo binario en IDA, presione Alt+F7 y seleccione el script generado. Observe la ventana de salida mientras ADA analiza el archivo: esto puede llevar mucho tiempo.
Tres archivos son generados por IL2CPPINSSPITOR para IdapyThon: el script de Python en sí, un archivo de metadatos JSON y un archivo de encabezado de tipo C ++ (este es cpp/appdata/il2cpp-types.h de forma predeterminada si usó el CLI, o il2cpp.h si usa el GUI). Estos archivos deben estar presentes para que el script se ejecute correctamente.
Si sabe con qué versión de Unity se compiló el binario, puede mejorar la salida especificando esto con --unity-version , por ejemplo --unity-version 2019.3.1f1 . También puede suministrar cualquier archivo de activos de la aplicación para detectar la versión de Unity con --unity-version-from-asset . De lo contrario, IL2CPPINSPECTOR hará una suposición educada basada en el contenido del binario.
IL2CPPINSPECTOR genera los siguientes datos para proyectos de IDA:
Ejemplo de descompilación de IDA C ++ después de aplicar IL2CPPINSPECTOR (código de inicialización omitido para brevedad):

Ejecute IL2CPPINSPECTOR con el interruptor -p para elegir el archivo de salida del script Ghidra y -t Ghidra (sensible a la caja) para especificar GHIDRA como el tipo de script que desea producir.
Tres archivos son generados por IL2CPPinspector para Ghidra: el script de Python en sí, un archivo de metadatos JSON y un archivo de encabezado de tipo C ++. Estos archivos deben estar presentes para que el script se ejecute correctamente.
Si sabe con qué versión de Unity se compiló el binario, puede mejorar la salida especificando esto con --unity-version , por ejemplo --unity-version 2019.3.1f1 . También puede suministrar cualquier archivo de activos de la aplicación para detectar la versión de Unity con --unity-version-from-asset . De lo contrario, IL2CPPINSPECTOR hará una suposición educada basada en el contenido del binario.
Nota: Para obtener los mejores resultados, elija No cuando Ghidra le pregunta si desea realizar un análisis automático cuando el binario se carga por primera vez. Si recibe Conflicting data exists at address al ejecutar el script a continuación, vuelva a cargar el binario en el proyecto y elija No en el aviso de análisis automático.
Nota: Para acelerar significativamente el análisis para los archivos ELF, configure la base de la imagen en cero ( 0x00000000 ) en las opciones de carga para el binario. Por razones de compatibilidad, ejecutar el script de Ghidra Python en un archivo ELF cambiará la base de imagen del archivo a cero para usted si es necesario, sin embargo, si la base de imagen actual no es cero, esto puede llevar mucho tiempo completar. Otros formatos de archivo retendrán la misma base de imagen.
Para importar metadatos en un proyecto Ghidra existente:
Desde el navegador de código , elija Archivo -> PARSE C Fuente ...
Cree un nuevo perfil y agregue el archivo de encabezado de tipo C ++ generado. Este es cpp/appdata/il2cpp-types.h de forma predeterminada si usó CLI o il2cpp.h si usó la GUI.
Asegúrese de que las opciones de análisis se establezcan exactamente de la siguiente manera:
-D_GHIDRA_
Haga clic en Pase para programar y acepte cualquier advertencia. Esto puede tardar mucho tiempo en completarse.
Abra el Administrador de script y agregue la carpeta de salida que eligió en IL2CPPINSPECTOR como una carpeta de script.
Si ha usado scripts de IL2CPPINSPECTOR para otros binarios, asegúrese de que los archivos de Python se denominen de manera diferente, o deshabiliten el uso de las carpetas de script anteriores.
Haga clic en Actualizar para que el script aparezca en Script Manager .
Haga clic derecho en el script y elija Ejecutar . Esto puede tardar un tiempo en completarse.

IL2CPPINSSPECTOR genera datos idénticos para proyectos de Ghidra como lo hace para IDA: consulte la sección anterior para más detalles.
Ejemplo de descompilación de Ghidra C ++ después de aplicar IL2CPPINSPECTOR:

IL2CPPINSPECTOR genera una serie de archivos fuente de C ++ que puede usar de varias maneras, por ejemplo:
Ejecute IL2CPPINSSPECTOR con el interruptor -h para elegir la carpeta de salida C ++.
Si sabe con qué versión de Unity se compiló el binario, puede mejorar la salida especificando esto con --unity-version , por ejemplo --unity-version 2019.3.1f1 . También puede suministrar cualquier archivo de activos de la aplicación para detectar la versión de Unity con --unity-version-from-asset . De lo contrario, IL2CPPINSPECTOR hará una suposición educada basada en el contenido del binario.
Puede orientar qué compilador C ++ desea usar los archivos de salida con: Especificar --cpp-compiler MSVC para Visual Studio y --cpp-compiler GCC para GCC o CLANG.
IL2CPPINSPECTOR realiza una resolución de conflicto de nombre automático para evitar el uso de símbolos y palabras clave predefinidas en C ++, y para manejar la redefinición de símbolos de los mismos nombrados en la aplicación.
Algunos archivos binarios IL2CPP contienen solo un conjunto parcial de exportaciones de API, o ninguna. Para estos casos, IL2CPPINSPECTOR construirá andamios utilizando solo las exportaciones disponibles para garantizar que el proyecto se compile con éxito.

Se generan los siguientes archivos:
appdata : esta carpeta contiene declaraciones binarias binarias agnósticas del proyecto: 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 para la versión IL2CPP utilizada por el binario objetivoLos archivos anteriores contienen todos los datos necesarios para el análisis dinámico en un depurador.
Además, se generan los siguientes archivos para la inyección de DLL:
framework -Código de calderas y andamios agnóstico binario agnóstico del proyecto: andamios:
dllmain.cpp :
init_il2cpp() (ver más abajo) y comienza Run() (ver más abajo) en un nuevo hilo helpers.cpp y helpers.h :
helpers.h para más detalles. il2cpp-init.cpp , il2cpp-init.h e il2cpp-appdata.h :
void init_il2cpp() que utiliza todos los encabezados anteriores para generar punteros de función utilizables y punteros de clase que se asignan a los lugares correctos en la imagen en memoria en tiempo de ejecución pch-il2cpp.cpp y pch-il2cpp.h :
appdata user -Código de usuario de agnóstico binario específico del proyecto que puede modificar según lo desee:
main.cpp y main.h :Run() que denota el punto de entrada para su código inyectado personalizado. La función se ejecuta en un nuevo hilo y, por lo tanto, no bloquea DllMain .Esta es la única carpeta cuyos archivos debe editar .
Para los usuarios de Visual Studio, también se generan los siguientes archivos:
IL2CppDLL.vcxproj , Il2CppDLL.vcxproj.filters e Il2CppDLL.sln : El main.cpp predeterminado incluye código comentado para permitirle escribir en un registro o abrir una nueva consola utilizando las funciones de helpers.h . Para especificar un destino de archivo de registro en su código fuente, use extern const LPCWSTR LOG_FILE = L"my_log_file.txt" .
Consejo: Cuando se lanza una nueva versión de la aplicación de destino, puede reutilizar el proyecto de andamio C ++ en el lugar. Las carpetas appdata y framework se sobrescribirán, pero la carpeta user y los archivos de proyecto/solución no se cambiarán. ¡Esto facilita la actualización de su proyecto cuando la aplicación de destino se ha actualizado!
Compatibilidad: se recomienda usar Visual Studio 2019 (MSVC ++ Build Tools V142 o posterior). Los proyectos de andamios se han probado con Visual Studio 2019 y Visual Studio 2017 (MSVC ++ Build Tools V141), sin embargo, se omite algún código auxiliar cuando se usa Visual Studio 2017 para permitir que la compilación tenga éxito.
Il2CppDLL.sln ) en Visual StudioRun() en main.cppTiene acceso a todos los tipos y métodos equivalentes de C#en la aplicación, además de todas las funciones de API IL2CPP disponibles. No se requieren declaraciones de puntero o tipo de función adicional.
Ejemplo (cree un Vector3 y registre su coordenada y en un archivo):
// 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 ));
}Se pueden encontrar tutoriales más detallados aquí:
Cómo crear, usar y depurar proyectos de inyección de DLL IL2CPP
Trabajar con código en proyectos de inyección de DLL IL2CPP
IL2CPPINSPECTOR puede crear un espacio de trabajo completo de Visual Studio con un archivo de solución (.SLN), archivos Project (.csproj) y estructura de carpeta de árbol de clase de ensamblaje. Cada proyecto crea un solo ensamblaje.
Use el interruptor --project para generar un espacio de trabajo de solución.
Para que IL2CPPINSPECTOR pueda crear archivos .csproj que contengan las referencias correctas de ensamblaje de la unidad, debe proporcionar la ruta a un editor de unidad instalado y una plantilla de proyecto o carpeta ScriptAssemblies de un proyecto de unidad existente.
Nota: La configuración predeterminada seleccionará la última versión instalada de Unity y la última versión instalada de la plantilla de proyecto 3D predeterminada, si se han instalado en la ubicación predeterminada.
Ubicación típica del editor de la unidad (especificada con --unity-path ): c: archivos de programa unity hub editor 20xx.yz
Ubicación típica de la plantilla de proyecto Unity (especificada con --unity-assemblies ): c: archivos de programa unity hub editor 20xx.yz editor data recursos packagemanager ProjectTemplates libcache <name-of-tempplate>
Ubicación típica de los conjuntos de script de unidad en el proyecto existente (especificado con --unity-aseemblies ): x: myproject biblioteca scripssemblies
Reemplace X , Y y Z con su número de versión de Unity. Reemplace <Name-of-Template> con la plantilla deseada.
Nota: Puede usar el comodín de Asterisk (*) una o más veces al especificar estas rutas. IL2CPPINSPECTOR seleccionará la última carpeta coincidente en orden alfanumérico. Esto es útil si tiene múltiples instalaciones de unidad de lado a lado y desea siempre seleccionar la última versión o plantilla.
En el caso de que las referencias del ensamblaje no se resuelvan correctamente la primera vez que carga una solución, simplemente cierre y vuelva a abrir la solución para obligarlos a resolver.

IL2CPPINSPECTOR puede crear un archivo JSON que contenga varios metadatos sobre la aplicación.
Use el interruptor -o para especificar la ruta de salida JSON.
El esquema de salida es el siguiente:
addressMap (objeto)
Un mapa de dirección de todo el contenido relacionado con IL2CPP en binario
methodDefinitions (Array) La dirección virtual, símbolo binario, firma de función C ++ y firma del método .NET de cada método equivalente .NET en el binario binario
constructedGenericMethods (Array) La dirección virtual, símbolo binario, firma de función C ++ y firma del método .NET de cada método genérico concreto equivalente .NET en el binario binario
customAttributesGenerators (Array) La dirección virtual, nombre y firma de la función C ++ de cada función del generador de atributos personalizados en el binario
methodInvokers (Array) La dirección virtual, el nombre y la firma de la función C ++ de cada método. Invoca la función Thunk en el binario
stringLiterals (Array) para versiones de Unity inferiores a 5.3.2: el ordinal, el nombre y el texto de cada cadena literal en el binario para la versión de Unity 5.3.2 y posterior: la dirección virtual, el nombre y el texto de cada cadena literal en el binario
typeInfoPointers (Array) La dirección virtual, nombre, nombre de tipo derivado C ++ y nombre de tipo .NET Nombre equivalente de cada puntero de definición de clase ( Il2CppClass * ) en el binario
typeRefPointers (Array) La dirección virtual, nombre y tipo .NET Nombre de tipo equivalente de cada puntero de referencia de tipo ( Il2CppType * ) en el binario
methodInfoPointers (Array) La dirección virtual, nombre y firma del método .NET de cada puntero de definición de método de tiempo de ejecución ( MethodInfo * ) en el binario
functionAddresses (Array) Las direcciones virtuales del inicio de cada función conocida en el binario, incluidos todos los anteriores más detectados pero no incluidos en las categorías anteriores
typeMetadata (matriz) La dirección virtual, el nombre y el nombre de C ++ tipo de los elementos de metadatos clave en el binario. Esto incluye Il2CppCodeRegistration y Il2CppMetadataRegistration , y dependiendo de la versión binaria también puede incluir un puntero a cada Il2CppCodeGenModule
arrayMetadata (Array) La dirección virtual, nombre, nombre de tipo C ++ y tamaño de matrices de metadatos clave en el binario
functionMetadata (array) La dirección virtual, nombre y firma de la función C ++ de las funciones de metadatos clave en el binario. Dependiendo de cómo el binario fue analizado por IL2CPPINSpector, esto puede incluir il2cpp_codegen_register .
apis (Array) La dirección virtual, el nombre y la firma de la función C ++ de cada función API IL2CPP identificada en el binario
exports (matriz) La dirección virtual y el nombre de cada exportación en el binario
symbols (matriz) La dirección virtual, el nombre y el tipo de símbolo de cada definición de función de la dirección no nombrada (no cero) y la función de la dirección distinta de cero, tipo, nombre de campo e importación (para elf) definidos en el binario. Actualmente no es compatible con archivos PE.
Se proporcionan tres scripts de PowerShell para permitir una construcción fácil y prueba de binarios IL2CPP:
il2cpp.ps1 es el principal caballo de batalla y compila cada archivo de origen C# especificado en TestSources (o todos si no se suministran) como un ensamblaje separado, y los lleva a TestAssemblies . Luego toma cada ensamblaje especificado en TestAssemblies y compila cada uno como un proyecto IL2CPP separado para cada una de estas arquitecturas:
Estos se colocan en la carpeta TestBinaries . El código fuente de C ++ para cada compilación se coloca en la carpeta TestCpp . Luego llama generate-tests.ps1 .
Especifique una lista separada por comisión de archivos fuente (sin la extensión .cs ) para procesar como el primer argumento (o -assemblies ).
Opcionalmente, puede especificar una versión de Unidad o Ruta de instalación de Unity con el segundo argumento (o -unityVersion ). Si no se suministra ninguno, se utilizará la última versión de Unity instalada. También puede especificar comodines, por ejemplo. 2019* utilizará la última versión instalada de Unity 2019, 2018.3* utilizará la última versión instalada de Unity 2018.3, etc. Utilice Unity Hub para instalar las versiones deseadas.
Por lo tanto, con un comando puede generar un DLL de ensamblaje, código fuente de C ++ y binario IL2CPP para cada arquitectura para cualquier lista dada de archivos fuente, un conjunto de salidas por archivo de origen, para una versión especificada de Unity.
generate-tests.ps1 genera un archivo llamado Tests.cs en el proyecto Il2CppTests , que contiene una prueba por proyecto IL2CPP en TestBinaries . Este archivo será compilado por el proyecto Il2CppTests . Luego podrá ver una prueba por proyecto IL2CPP en el Explorador de pruebas de Visual Studio.
Las pruebas generadas automáticamente generan archivos de encabezado C#, JSON y C en la carpeta Test IL2CPP Binary en TestBinaries (cada nombre de archivo prefijado con test ) y los compara (inyectable en blanco) con los archivos de nombre del proyecto correspondientes en TestExpectedResults . De esta manera, puede verificar los archivos con estructura conocida que el análisis se realiza correctamente, o atravesar el análisis de binarios específicos en el depurador sin tener que cambiar los argumentos de la línea de comandos del proyecto.
update-expected-results.ps1 Copia todos los resultados de las pruebas de salida de TestBinaries en TestExpectedResults , por lo tanto, actualizando los archivos que se utilizarán para verificar los resultados correctos de las pruebas.
Ejemplo de usos:
./il2cpp.ps1
Construye cada archivo fuente de C# ìnto a .NET ensamblaje DLL, una carpeta fuente C ++ y un binario binario IL2CPP por arquitectura compatible
./il2cpp.ps1 MyFirstTest
construye MyFirstTest.cs en MyFirstTest.dll , crea una carpeta fuente de C ++ llamada MyFirstTest y un binario IL2CPP para cada arquitectura compatible
./il2cpp.ps1 MyFirstTest,MySecondTest 2019.3.1f1
construye MyFirstTest.cs y MySecondTest.cs en dlls de ensamblaje individual, carpetas de origen C ++ y binarios IL2CPP, utilizando Unity 2019.3.1f1
./il2cpp.ps1 MyFirstTest,MySecondTest F:UnityHubEditor2019.3.1f1
Como se indicó anteriormente, pero especifica una ruta personalizada para su instalación de Unity.
La versión mínima de Unity compatible es 2017.1.0F3.
Para obtener más información sobre estas características, consulte la sección Titulada con IL2CPPINSPECTOR para generar el código IL2CPP en IL2CPP Investigación inversa Parte 1.
Nota: ¡Las API IL2CPPINSPETOR también están disponibles como un paquete Nuget! (Búsqueda: NoisyCowStudios.IL2Cppinspector)
IL2CPPINSPECTOR ofrece las siguientes API de biblioteca de clase reutilizable:
Use estas API para consultar fácilmente los tipos de IL2CPP, crear nuevos módulos de salida e integrar IL2CPPINSSPECTOR con sus propias aplicaciones de análisis estático.
Para utilizar IL2CPPINSPECTOR en sus propios proyectos, agregue una referencia a Il2CppInspector.Common.dll .
Incluya lo siguiente using directivas:
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. Por ejemplo:
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 | Apoyo |
|---|---|---|
| 4.6.1+ | Primer lanzamiento | Unsupported |
| 5.2.x | 15 | Unsupported |
| 5.3.0-5.3.1 | 16 | Laboral |
| 5.3.2 | 19 | Laboral |
| 5.3.3-5.3.4 | 20 | Laboral |
| 5.3.5-5.4.6 | 21 | Laboral |
| 5.5.0-5.5.6 | 22 | Laboral |
| 5.6.0-5.6.7 | 23 | Laboral |
| 2017.1.0-2018.2.21 | 24 | Laboral |
| 2018.3.0-2018.4.x | 24.1 | Laboral |
| 2019.1.0-2019.3.6 | 24.2 | Laboral |
| 2019.3.7-2019.4.14 | 24.3 | Laboral |
| 2019.4.15-2019.4.20 | 24.4 | Laboral |
| 2019.4.21-2019.4.x | 24.5 | Laboral |
| 2020.1.0-2020.1.10 | 24.3 | Laboral |
| 2020.1.11-2020.1.17 | 24.4 | Laboral |
| 2020.2.0-2020.2.3 | 27 | Laboral |
| 2020.2.4-2020.3.x | 27.1 | Laboral |
| 2021.1.0-2021.1.x | 27.2 | Parcial |
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
Much love! - 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.