É com grande arrependimento que tenho que anunciar que o trabalho de desenvolvimento no IL2cppinspetor foi interrompido no futuro próximo.
A razão para isso é que, devido à saúde e às mudanças na minha vida pessoal, simplesmente não tenho mais tempo para me comprometer a trabalhar no projeto. Isso é muito frustrante para mim, mas há pouco que eu realmente posso fazer sobre isso.
Por favor, sinta -se à vontade para gastar o projeto e fazer melhorias! Você também pode continuar postando problemas, pois eu gostaria de ter um compêndio de bugs e problemas salvos, caso eu ou outra pessoa tenha a oportunidade de voltar a trabalhar nisso. Observe que, no entanto, não responderei a problemas ou PRs no futuro próximo.
Se você precisar de ferramentas de IL2CPP, recomendo que o excelente projeto do meu amigo e o colega CPP2il, que é uma ferramenta de trabalho em andamento para converter os binários do IL2CPP diretamente de volta ao código da IL, que pode ser facilmente visualizado no DNSPY etc. Esta é uma tarefa gigantesca, por favor, faça suporte e apoie seu trabalho incrível!
Feliz hacking,
Katy.
O IL2Cppinspector ajuda você a reverter os aplicativos do engenheiro IL2CPP, fornecendo a análise mais completa atualmente disponível.

Definições de tipo IL2CPP de saída, metadados e indicadores de método como código de stub C#
Crie DLLs de calças de montagem .NET contendo a estrutura de aplicativos e metadados do IL2CPP para uso em descompiladores como ILSPY, DNSPY, Carregamento de ativos de unidade com AssetStudio ou geração de proxy gerenciada com Il2cpassinemblyunhollower
Crie andaimes C ++ para todos os tipos, métodos, ponteiros de função e funções de API em um aplicativo IL2CPP para uso em x64dbg, substrato de cydia etc.
Crie scripts de IDA e Ghidra Python para preencher informações de símbolo, função e tipo; Inclui ganchos de API para implementar scripts para outros alvos
Crie projetos de injeção de DLL do Visual Studio C ++ diretamente a partir de arquivos IL2CPP
Crie soluções Visual Studio C# Stub Solutions diretamente a partir de arquivos IL2CPP
Crie metadados JSON com um mapa de endereços completo diretamente dos arquivos IL2CPP.
Crie binários de il2cpp a partir do código -fonte arbitrário C# sem um projeto de unidade
Três APIs principais para uso em seus próprios projetos de análise estática personalizados para consultar metadados binários de baixo nível, o modelo do tipo .NET e todo o aplicativo C ++. Eles também estão disponíveis como um pacote Nuget.
O plugin SDK permite criar plug -ins personalizados para estender os recursos do IL2Cppinspector
Derrota certos tipos de ofuscação
Suporta todos os principais formatos de arquivo e arquiteturas de processador
Funciona no Windows, MacOS X e Linux. GUI integrada para usuários do Windows com suporte de arrastar e soltar
Testado com cada lançamento do IL2CPP desde a Unidade 5.3.0
Você pode ler mais sobre como o IL2CPP funciona na minha série IL2CPP Reverse Engineering:
Parte 1: Hello World and the Il2cpp Toolchain
Parte 2: Visão geral estrutural e encontrando os metadados
IL2CPPPINPEtor Plugin Development Wiki
Como criar, usar e depurar projetos de injeção de DLL IL2CPP
Trabalhando com código em projetos de injeção de DLL IL2CPP
Usando o modelo de tipo do Il2Cppinspector para extrair definições de rede do Protobuf (estudo de caso: pessoal do outono)
Encontrar carregadores para arquivos global-metadata.dat ofuscado-explica como encontrar o Código de Carregador, Deobfusência e/ou Decripção para global-metadata.dat em quase qualquer aplicativo IL2CPP
Ativar carregamento de League of Legends: Wild Rift - abrange a descriptografia XOR, a descriptografia XOR String, a descriptografia de rotação de exportação da API, a ofuscação de dados de metadados binários
Ativar carregamento do impacto de Honkai (3 partes) - abrange encontrando funções em uma imagem, ofuscação de dados de global -metadata.dat, técnicas de decompilador de IDA, como escrever um plug -in
VMProtect Control Flow Ofuscation in Honkai Impact - cobre extrapolando o caminho do código de uma função com o fluxo de controle achatando usando x64dbg e o decompilador de IDA
Impacto de genshin de engenharia reversa com PowerShell - abrange a escrita de um chicote de teste para encontrar uma função em um binário ofuscado por meio de força bruta / fuzz reversa
Formato de arquivo e suporte de arquitetura:
Bom ter:
using diretivas. O escopo e o nome dos conflitos são resolvidos automaticamente para produzir código que compila.Libraria de classe Targets .NET Core 3.1. Construído com o Visual Studio 2019.
NOTA : O IL2Cppinspector não é um decompilador. Ele pode fornecer a estrutura de um aplicativo e endereços de função para todos os métodos, para que você possa facilmente pular direto para métodos de interesse no seu desmontador. Ele não tenta recuperar todo o código -fonte do aplicativo.
git clone --recursive https://github.com/djkaty/Il2CppInspector
cd Il2CppInspector
Construa as versões da CLI e Windows GUI:
dotnet publish -c Release
Obtenha todos os plugins atuais (opcionais):
powershell -f get-plugins.ps1
Construa a versão da CLI:
cd Il2CppInspector.CLI
dotnet publish -r osx-x64 -c Release
Obtenha todos os plugins atuais (opcionais):
../get-plugins.sh
Construa a versão da CLI:
cd Il2CppInspector.CLI
dotnet publish -r linux-x64 -c Release
Obtenha todos os plugins atuais (opcionais):
../get-plugins.sh
Para outros sistemas operacionais que suportam o .NET Core, adicione -r xxx ao comando final em que xxx é um livro de https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog
O binário de saída para uso da linha de comando é colocado no Il2CppInspector/Il2CppInspector.CLI/bin/Release/netcoreapp3.0/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
O binário de saída para o Windows GUI é colocado no Il2CppInspector/Il2CppInspector.GUI/bin/Release/netcoreapp3.1/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
A pasta plugins deve ser colocada na mesma pasta que Il2CppInspector.exe .
Execute Il2CppInspector.exe no prompt de comando.
O formato e a arquitetura do arquivo são detectados automaticamente.
Todas as saídas são geradas por padrão. Para gerar apenas saídas específicas, use o switch --select-outputs em combinação com os comutadores de seleção de saída.
-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 Binários e APKS/XAPKS com binários para várias arquiteturas : Ao usar a CLI, vários arquivos de saída serão gerados, com cada nome de arquivo além do primeiro sufixo pelo índice da imagem no binário. Imagens não suportadas serão ignoradas.
Pacotes IPA : o executável deve ser descriptografado primeiro. Os binários executáveis criptografados não são suportados.
Pacotes APK divididos : ao usar a CLI, especifique uma lista de arquivos APK com uma vírgula entre cada nome de arquivo.
Binários de elfo criados a partir de dumps de memória : especifique a base de imagem (em hexadecimal) usando --image-base . Se a base de imagem fornecida estiver incorreta, o aplicativo poderá travar.
GameGuardian Dumps (e outros dumps de mapas de processo Linux) : você pode usar um arquivo *-maps.txt no lugar de um binário IL2CPP. O IL2CPPINSPEOR digitalizará a pasta que contém o arquivo MAPS para corresponder arquivos .bin e remontar e rebase libil2cpp.so automaticamente. Portanto, você não precisa criar o arquivo manualmente ou fornecer um endereço base de imagem ao usar esse tipo de despejo. Para que isso funcione, nem o arquivo de texto nem nenhum dos arquivos binários devem ser renomeados, e todos devem estar na mesma pasta.
Arquivos PE embalados (DLLs) : Aviso: Carregar um arquivo PE embalado fará com que o ponto de entrada da DLL e as funções de inicialização da DLL sejam executadas. Não carregue DLLs maliciosos e nunca execute o IL2Cppinspector como administrador ao manusear arquivos PE embalados. Use por sua conta e risco.
O IL2CPPINSPEOR pode criar arquivos C# Code Stub com metadados de ponteiro para permitir que você explore o binário IL2CPP em um formato de fácil leitura.
Especifique o comutador -c para escolher o arquivo ou caminho de saída C#.
Para excluir os tipos de determinados namespaces de serem gerados na saída do arquivo de origem C#, forneça uma lista separada por vírgula de namespaces sensíveis ao caso em --exclude-namespaces . Os seguintes espaços para nome serão excluídos se nenhum argumento for especificado:
System
Mono
Microsoft.Reflection
Microsoft.Win32
Internal.Runtime
Unity
UnityEditor
UnityEngine
UnityEngineInternal
AOT
JetBrains.Annotations
O fornecimento de um argumento para --exclude-namespaces substituirá a lista padrão. Para produzir todos os espaços para nomes, use --exclude-namespaces=none . Isso se aplica apenas à saída de protótipos C#.
Você pode especificar o layout de saída com o switch --layout :
single - todos os tipos em um único arquivonamespace - um espaço de nome por arquivo (cada arquivo receberá o nome de namespace)assembly - uma montagem por arquivo (cada arquivo receberá o nome da montagem)class - uma classe por arquivotree -uma classe por arquivo em uma estrutura de pastas semelhante a uma árvore com pastas de montagem de nível superior e pastas de namespace de segundo nível Você pode especificar o pedido do tipo intra-arquivo com o switch --sort :
index - Classificar por tipo de índice de definição, conforme encontrado nos metadados il2cppname - classificar em ordem alfabética por nome de tipo Esse interruptor não tem efeito ao usar o layout class ou tree .
O interruptor --flatten permite que você achate uma hierarquia de namespaces aninhados quando layout é class ou namespace , ou seja. Uma série de System/IO/Compression será um único sub-folder de nível superior System.IO.Compression .
O switch --suppress-metadata permite suprimir a saída de comentários, incluindo ponteiros de método, compensações de campo e índices de tipo. Isso é útil quando você deseja diferenciar as alterações entre duas versões de um aplicativo para ver apenas quais tipos foram alterados.
O switch --seperate-attributes direciona o IL2Cppinspector para colocar atributos no nível da montagem em seus próprios arquivos AssemblyInfo.cs , em vez de na parte superior do primeiro arquivo gerado para cada montagem, quando layout é assembly ou tree .
Simplesmente execute o IL2Cppinspector com a chave -p para escolher o arquivo de saída do script do IDA. Carregue seu arquivo binário no IDA, pressione Alt+F7 e selecione o script gerado. Observe a janela de saída enquanto a IDA analisa o arquivo - isso pode levar muito tempo.
Três arquivos são gerados pelo IL2Cppinspector para IDAPYTHON: O próprio script Python, um arquivo de metadados JSON e um arquivo de cabeçalho do tipo C ++ (este é cpp/appdata/il2cpp-types.h por padrão, se você usou o CLI ou il2cpp.h se você usou o Gui). Esses arquivos devem estar presentes para que o script seja executado com sucesso.
Se você souber qual versão da unidade o binário foi compilado, pode melhorar a saída especificando isso com --unity-version , por exemplo --unity-version 2019.3.1f1 . Você também pode fornecer qualquer arquivo de ativo do aplicativo para detectar a versão da unidade com --unity-version-from-asset . Caso contrário, o Il2Cppinspetor fará um palpite educado com base no conteúdo do binário.
O IL2Cppinspector gera os seguintes dados para projetos de IDA:
Exemplo de descompilação da IDA C ++ Após a aplicação do IL2Cppinspector (código de inicialização omitido por brevidade):

Execute o IL2Cppinspector com o comutador -p para escolher o arquivo de saída de script Ghidra e -t Ghidra (sensível ao caso) para especificar Ghidra como o tipo de script que você deseja produzir.
Três arquivos são gerados pelo IL2Cppinspector para Ghidra: o próprio script Python, um arquivo de metadados JSON e um arquivo de cabeçalho do tipo C ++. Esses arquivos devem estar presentes para que o script seja executado com sucesso.
Se você souber qual versão da unidade o binário foi compilado, pode melhorar a saída especificando isso com --unity-version , por exemplo --unity-version 2019.3.1f1 . Você também pode fornecer qualquer arquivo de ativo do aplicativo para detectar a versão da unidade com --unity-version-from-asset . Caso contrário, o Il2Cppinspetor fará um palpite educado com base no conteúdo do binário.
Nota: Para obter melhores resultados, escolha NÃO quando Ghidra perguntar se você deseja realizar a análise automática quando o binário for carregado pela primeira vez. Se você receber Conflicting data exists at address ao executar o script abaixo, relembre o binário no projeto e escolha não no prompt de análise automática.
Nota: Para acelerar significativamente a análise para arquivos ELF, defina a base de imagem como zero ( 0x00000000 ) nas opções de carga para o binário. Por razões de compatibilidade, a execução do script Ghidra Python em um arquivo ELF alterará a base de imagem do arquivo para zero para você, se necessário, no entanto, se a base de imagem atual for diferente de zero, isso pode levar muito tempo para ser concluído. Outros formatos de arquivo reterão a mesma base de imagem.
Para importar metadados para um projeto Ghidra existente:
No navegador de código , escolha Arquivo -> Parse C Fonte ...
Crie um novo perfil e adicione o arquivo de cabeçalho do tipo C ++ gerado. Isso é cpp/appdata/il2cpp-types.h por padrão, se você usou a CLI, ou il2cpp.h se você usou a GUI.
Verifique se as opções de análise estão definidas exatamente as seguintes:
-D_GHIDRA_
Clique em Parse para programar e aceitar quaisquer avisos. Isso pode levar muito tempo para ser concluído.
Abra o gerenciador de scripts e adicione a pasta de saída que você escolheu no IL2CppinSpector como uma pasta de script.
Se você usou scripts do IL2Cppinspector para outros binários, verifique se os arquivos Python são nomeados de maneira diferente ou desativam o uso da (s) pasta (s) de script anterior.
Clique em Atualizar para fazer o script aparecer no Script Manager .
Clique com o botão direito do mouse no script e escolha Run . Isso pode demorar um pouco para completar.

O IL2Cppinspetor gera dados idênticos para projetos de Ghidra, como para a IDA - consulte a seção acima para obter detalhes.
Exemplo Ghidra C ++ Decompilação Após aplicar o IL2Cppinspector:

O IL2Cppinspector gera uma série de arquivos de origem C ++ que você pode usar de várias maneiras, por exemplo:
Execute o IL2Cppinspector com o comutador -h para escolher a pasta de saída C ++.
Se você souber qual versão da unidade o binário foi compilado, pode melhorar a saída especificando isso com --unity-version , por exemplo --unity-version 2019.3.1f1 . Você também pode fornecer qualquer arquivo de ativo do aplicativo para detectar a versão da unidade com --unity-version-from-asset . Caso contrário, o Il2Cppinspetor fará um palpite educado com base no conteúdo do binário.
Você pode segmentar qual compilador C ++ você deseja usar os arquivos de saída: especificar --cpp-compiler MSVC para Visual Studio e --cpp-compiler GCC para GCC ou CLANG.
O IL2Cppinspector executa resolução automática de conflitos para evitar o uso de símbolos e palavras-chave predefinidos no C ++ e para lidar com a refinição de símbolos com o mesmo nome no aplicativo.
Alguns arquivos binários do IL2CPP contêm apenas um conjunto parcial de exportações de API, ou nenhum. Para esses casos, o IL2Cppinspector criará andaimes usando apenas as exportações disponíveis para garantir que o projeto seja compilado com sucesso.

Os seguintes arquivos são gerados:
appdata -Esta pasta contém declarações específicas binárias agnósticas do projeto: 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 a versão IL2CPP usada pelo binário de destinoOs arquivos acima contêm todos os dados necessários para análise dinâmica em um depurador.
Além disso, os seguintes arquivos são gerados para injeção de DLL:
framework -Código de caldeira binária-agnóstico do projeto e andaimes:
dllmain.cpp :
init_il2cpp() (veja abaixo) e inicia Run() (veja abaixo) em um novo thread helpers.cpp e helpers.h :
helpers.h para detalhes. il2cpp-init.cpp , il2cpp-init.h e il2cpp-appdata.h :
void init_il2cpp() que usa todos os cabeçalhos acima para gerar ponteiros de função utilizável e ponteiros de classe que são mapeados para os lugares corretos na imagem na memória no tempo de execução pch-il2cpp.cpp e pch-il2cpp.h :
appdata user -Código de usuário binário-agnóstico específico do projeto que você pode modificar conforme desejado:
main.cpp e main.h :Run() que indica o ponto de entrada para o seu código injetado personalizado. A função é executada em um novo thread e, portanto, não bloqueia DllMain .Esta é a única pasta cujos arquivos você deve editar .
Para usuários do Visual Studio, os seguintes arquivos também são gerados:
IL2CppDLL.vcxproj , Il2CppDLL.vcxproj.filters e Il2CppDLL.sln : O padrão main.cpp inclui código comentado para permitir que você escreva em um log ou abra um novo console usando as funções do helpers.h . Para especificar um destino de arquivo de log no seu código -fonte, use extern const LPCWSTR LOG_FILE = L"my_log_file.txt" .
Dica: quando uma nova versão do aplicativo de destino é lançada, você pode remover novamente o projeto de andaime C ++ no local. As pastas appdata e framework serão substituídas, mas a pasta user e os arquivos de projeto/solução não serão alterados. Isso facilita a atualização do seu projeto quando o aplicativo de destino for atualizado!
Compatibilidade: é recomendável usar o Visual Studio 2019 (Ferramentas de construção MSVC ++ V142 ou posterior). Os projetos de andaimes foram testados com o Visual Studio 2019 e o Visual Studio 2017 (MSVC ++ Build Tools V141), no entanto, algum código auxiliar é omitido ao usar o Visual Studio 2017 para permitir que a compilação seja bem -sucedida.
Il2CppDLL.sln ) no Visual StudioRun() em main.cppVocê tem acesso a todos os tipos e métodos equivalentes a C#no aplicativo, além de todas as funções da API do IL2CPP disponíveis. Não são necessárias declarações de ponteiro ou tipo de função adicionais.
Exemplo (crie um Vector3 e registre sua coordenada y em um arquivo):
// 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 ));
}Tutoriais mais detalhados podem ser encontrados aqui:
Como criar, usar e depurar projetos de injeção de DLL IL2CPP
Trabalhando com código em projetos de injeção de DLL IL2CPP
O IL2Cppinspector pode criar um espaço de trabalho completo do Visual Studio com um arquivo Solution (.sln), arquivos do projeto (.csproj) e estrutura de pasta semelhante a uma classe de classe Namespace. Cada projeto cria uma única montagem.
Use o switch --project para gerar um espaço de trabalho de solução.
Para que o IL2Cppinspector possa criar arquivos .csproj que contêm as referências corretas de montagem da unidade, você deve fornecer o caminho para um editor de unidade instalado e um modelo de projeto ou pasta de ScriptAssemblies de um projeto de unidade existente.
NOTA: As configurações padrão selecionarão a versão mais recente do Unity e a versão mais recente instalada do modelo de projeto 3D padrão, se tiverem sido instaladas no local padrão.
Localização do editor de unidade típica (especificado com --unity-path ): C: Arquivos de Programas Unity Hub Editor 20xx.yz
Localização do modelo de projeto de unidade típica (especificado com --unity-assemblies ): C: Arquivos de Programas Unity Hub Editor 20xx.yz Editor Data Resources PackageManager ProjectTemplates Libcache <Name-of-Template>
Localização típica de montagens de scripts de unidade no projeto existente (especificado com --unity-aseemblies ): x: myProject biblioteca scriptAssemblies
Substitua X , Y e Z pelo seu número de versão da unidade. Substitua <Name-of-Template> pelo modelo desejado.
Nota: Você pode usar o curinga asterisk (*) uma ou mais vezes ao especificar esses caminhos. O IL2Cppinspector selecionará a última pasta correspondente em ordem alfanumérica. Isso é útil se você tiver várias instalações de unidade lado a lado e desejar sempre selecionar a versão ou modelo mais recente.
Caso as referências de montagem não sejam resolvidas corretamente na primeira vez em que você carrega uma solução, basta fechar e reabrir a solução para forçá-las a serem resolvidas.

O IL2Cppinspector pode criar um arquivo JSON contendo vários metadados sobre o aplicativo.
Use o comutador -o para especificar o caminho de saída JSON.
O esquema de saída é o seguinte:
addressMap (objeto)
Um mapa de endereço de todo o conteúdo relacionado ao IL2CPP em binário
methodDefinitions (Array) O endereço virtual, símbolo binário, assinatura da função C ++ e assinatura do .NET de todo método .NET equivalente no binário
constructedGenericMethods (Array) do Endereço Virtual, Símbolo Binário, Assinatura da Função C ++ e Método .NET Método de todo.
customAttributesGenerators (Array) O endereço virtual, Nome e C ++ Signature de cada função de gerador de atributos personalizados no binário
methodInvokers (Array) O endereço virtual, nome e C ++ Assinatura da função de todos os métodos.invoke Thunk Função no binário
stringLiterals (Array) para versões da unidade inferior a 5.3.2: O ordinal, nome e texto de cada string literal no binário para a unidade versão 5.3.2 e posterior: o endereço virtual, o nome e o texto de cada string literal no binário
typeInfoPointers (Array) O endereço virtual, nome, C ++ Nome do tipo derivado e nome .NET Nome equivalente a cada ponteiro de definição de classe ( Il2CppClass * ) no binário
typeRefPointers (Array) O endereço virtual, nome e .NET Nome equivalente a todos os tipos de referência de referência ( Il2CppType * ) no binário
methodInfoPointers (Array) O endereço virtual, nome e .NET Method Signature de cada ponteiro de definição do método de tempo de execução ( MethodInfo * ) no binário
functionAddresses (Array) Os endereços virtuais do início de todas
typeMetadata (Array) O endereço virtual, nome e C ++ Nome dos itens de metadados -chave no binário. Isso inclui Il2CppCodeRegistration e Il2CppMetadataRegistration , e dependendo da versão binária também pode incluir um ponteiro para cada Il2CppCodeGenModule
arrayMetadata (Array) O endereço virtual, nome, C ++ Nome e tamanho de matrizes de metadados -chave no binário
functionMetadata (Array) O endereço virtual, nome e assinatura da função C ++ das funções dos metadados -chave no binário. Dependendo de como o binário foi analisado pelo IL2Cppinspector, isso pode incluir il2cpp_codegen_register .
apis (Array) O endereço virtual, nome e assinatura da função C ++ de cada função da API IL2CPP identificada no binário
exports (matriz) o endereço virtual e o nome de todas as exportações no binário
symbols (Array) O endereço virtual, nome e símbolo Tipo de todos os nomes (comprimento do nome diferente de zero) e definição de função de endereço diferente de zero, tipo, nome de campo e importação (para ELF) definidos no binário. Atualmente não suportado para arquivos PE.
Três scripts do PowerShell são fornecidos para permitir a fácil construção e teste de binários de IL2CPP:
il2cpp.ps1 é o principal cavalo de trabalho e compila cada arquivo de origem C# especificado em TestSources (ou todos eles, se nenhum fornecido) como uma montagem separada e os produz para TestAssemblies . Em seguida, leva todas as montagens especificadas em TestAssemblies e compila cada um como um projeto IL2CPP separado para cada uma dessas arquiteturas:
Estes são colocados na pasta TestBinaries . O código -fonte C ++ para cada compilação é colocado na pasta TestCpp . Em seguida, ele chama generate-tests.ps1 .
Especifique uma lista separada por vírgula de arquivos de origem (sem a extensão .cs ) para processar como o primeiro argumento (ou -assemblies ).
Opcionalmente, você pode especificar um caminho de instalação de unidade ou unidade com o segundo argumento (ou -unityVersion ). Se nenhum for fornecido, a versão mais recente da unidade instalada será usada. Você também pode especificar curingas, por exemplo. 2019* usará a versão mais recente instalada do Unity 2019, 2018.3* usará a versão mais recente do Unity 2018.3 etc. Use o Unity Hub para instalar as versões desejadas.
Portanto, com um comando, você pode gerar uma DLL de montagem, código -fonte C ++ e binário de IL2CPP para cada arquitetura para qualquer lista de arquivos de origem, um conjunto de saídas por arquivo de origem, para uma versão especificada da unidade.
generate-tests.ps1 gera um arquivo chamado Tests.cs no projeto Il2CppTests , contendo um teste de projeto de IL2CPP no TestBinaries . Este arquivo será compilado pelo projeto Il2CppTests . Você poderá ver um teste de acordo com o projeto IL2CPP no Test Explorer do Visual Studio.
Os testes gerados automaticamente geram arquivos de cabeçalho C#, JSON e C na pasta do teste do Binário do Il2CPP em TestBinaries (cada nome do arquivo prefixado com test ) e os compara (insensível a espaço de branco) com os arquivos de nome do projeto correspondentes em TestExpectedResults . Dessa forma, você pode verificar os arquivos com estrutura conhecida se a análise está sendo realizada corretamente ou passar pela análise de binários específicos no depurador sem precisar alterar os argumentos da linha de comando do projeto.
update-expected-results.ps1 copia todos os resultados dos testes de saída de TestBinaries em TestExpectedResults , atualizando, portanto, os arquivos que serão usados para verificar os resultados corretos dos testes.
Exemplo de uso:
./il2cpp.ps1
Construa cada arquivo de origem C# ìno uma DLL de montagem .NET, uma pasta de origem C ++ e um binário de Il2cpp por arquitetura suportada
./il2cpp.ps1 MyFirstTest
Construa MyFirstTest.cs no MyFirstTest.dll , cria uma pasta de origem C ++ chamada MyFirstTest e um binário IL2CPP para cada arquitetura suportada
./il2cpp.ps1 MyFirstTest,MySecondTest 2019.3.1f1
Construa MyFirstTest.cs e MySecondTest.cs em DLLs de montagem individuais, pastas de origem C ++ e binários de IL2CPP, usando o Unity 2019.3.1f1
./il2cpp.ps1 MyFirstTest,MySecondTest F:UnityHubEditor2019.3.1f1
Como acima, mas especifica um caminho personalizado para sua instalação de unidade.
A versão mínima da unidade suportada é 2017.1.0f3.
Para saber mais sobre esses recursos, consulte a seção intitulada usando o IL2Cppinspector para gerar o código IL2CPP na engenharia reversa do IL2CPP Parte 1.
NOTA: As APIs do IL2CPPINPORTOR também estão disponíveis como um pacote NUGET! (Pesquisa: NoisyCowStudios.il2cppinspector)
O IL2Cppinspector oferece as seguintes APIs de biblioteca de classes reutilizáveis:
Use essas APIs para consultar facilmente os tipos de IL2CPP, criar novos módulos de saída e integrar o IL2CPPINSPEOR com seus próprios aplicativos de análise estática.
Para utilizar o IL2Cppinspector em seus próprios projetos, adicione uma referência ao 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. Por exemplo:
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 | Apoiar |
|---|---|---|
| 4.6.1+ | First release | Unsupported |
| 5.2.x | 15 | Unsupported |
| 5.3.0-5.3.1 | 16 | Trabalhando |
| 5.3.2 | 19 | Trabalhando |
| 5.3.3-5.3.4 | 20 | Trabalhando |
| 5.3.5-5.4.6 | 21 | Trabalhando |
| 5.5.0-5.5.6 | 22 | Trabalhando |
| 5.6.0-5.6.7 | 23 | Trabalhando |
| 2017.1.0-2018.2.21 | 24 | Trabalhando |
| 2018.3.0-2018.4.x | 24.1 | Trabalhando |
| 2019.1.0-2019.3.6 | 24.2 | Trabalhando |
| 2019.3.7-2019.4.14 | 24.3 | Trabalhando |
| 2019.4.15-2019.4.20 | 24.4 | Trabalhando |
| 2019.4.21-2019.4.x | 24.5 | Trabalhando |
| 2020.1.0-2020.1.10 | 24.3 | Trabalhando |
| 2020.1.11-2020.1.17 | 24.4 | Trabalhando |
| 2020.2.0-2020.2.3 | 27 | Trabalhando |
| 2020.2.4-2020.3.x | 27.1 | Trabalhando |
| 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.