WIP Tool para reverter o processo de criação do IL2CPP da Unity para as DLLs gerenciadas originais.
As informações abaixo se aplicam quase inteiramente ao aplicativo da CLI disponível nos lançamentos do GitHub. Para documentação sobre o uso do módulo "Core" - que a CLI é apenas um invólucro - em seus próprios projetos, consulte Readme_Core.md
Usa libcpp2il para a análise e carregamento inicial das estruturas de metadados. O LIBCPP2IL é obtido com os artefatos de construção se você quiser fazer algo com os metadados do IL2CPP e for liberado sob a licença do MIT. O link acima o levará à documentação para libcpp2il.
Atualmente, o CPP2IL está passando por uma grande reescrita. Este ramo representa o trabalho em andamento e está sujeito a alterações.
As compilações de CI para desenvolvedores podem ser obtidas da minha alimentação NUGET.
A interface da linha de comando foi simplificada, passando de muitas opções de linha de comando para um conceito de formatos de saída e camadas de processamento. No entanto, muitos desses formatos e camadas ainda não foram implementados, portanto, a funcionalidade é limitada em comparação com as versões lançadas anteriormente.
Muitas opções, como --analysis-level , --skip-analysis , etc., foram removidas. Ignorando o fato de que a análise ainda não foi implementada, essas opções não voltarão. A análise será desativada por padrão e será ativada através do uso de uma camada de processamento.
Da mesma forma, opções como --supress-attributes , que anteriormente suprimiram os atributos CPP2ilInjected, foram substituídos por uma camada de processo -este é realmente implementado e é chamado de attributeinjector . Você pode ativar essa camada usando a opção --use-processor e pode listar outras opções usando --list-processors .
Os depósito de metadados e os despejos de métodos também serão seu próprio formato de saída, em vez de serem padrão e controlados por meio de uma opção dedicada. Atualmente, isso significa que você precisará executar o CPP2IL várias vezes se desejar os dois despejos, embora isso possa mudar no futuro se adicionarmos suporte à saída a vários formatos simultaneamente. Como as camadas de processamento, os formatos de saída podem ser listados através da opção --list-output-formats e são selecionados através da opção --output-as .
Sob o capô, o aplicativo foi quase completamente reescrito. Principalmente, isso era necessário devido ao grau de CPP2il dependente da biblioteca mono.Cecil, que tinha algumas limitações. Quando procuramos trocar, percebemos o quão dependente estávamos na biblioteca. Esse não é mais o caso - o aplicativo está escrito nos tipos de libcpp2il e nos novos objetos de contexto de análise, e a biblioteca Mono.Cecil não é mais usada, tendo sido substituído pelo ASMRESOLVER.DOTNET.
Além disso, estamos atualmente em processo de reimplementação de análises com base em uma representação intermediária chamada ISIL (linguagem independente de instrução), que permitirá um suporte muito mais fácil de novos conjuntos de instruções. O ISIL é então convertido em um gráfico de fluxo de controle, que pode ser analisado de maneira mais inteligente do que uma desmontagem bruta.
Também estamos trabalhando em um sistema de plug-in que permitirá que desenvolvedores de terceiros escrevam plugins para adicionar suporte para conjuntos de instruções personalizados, formatos binários e, eventualmente, carregar metadados ou arquivos binários ofuscados ou criptografados.
O uso mais simples deste aplicativo é para um jogo do Windows X86 ou X64 Unity. Nesse caso, você pode apenas executar Cpp2IL-Win.exe --game-path=C:PathToYourGame e cpp2il detectará sua versão da unidade, localizará os arquivos de que precisa e despejará a saída em uma pasta CPP2il_out onde quer que você executasse o comando.
Supondo que você tenha um único arquivo APK (não um APKM ou XAPK) e esteja executando pelo menos CPP2IL 2021.4.0, você pode usar o mesmo argumento acima, mas passar no caminho para o APK e o CPP2IL extrairá os arquivos necessários do APK.
| Opção | Exemplo de argumento | Descrição |
|---|---|---|
| --game-caminho | C: PATH TO GAME | Especifique o caminho para a pasta do jogo. Obrigatório. |
| --ex-name | TestGame | Especifique o nome do arquivo exe do jogo, caso a detecção automática falhe (porque existem outros arquivos exe no diretório de jogos) |
| --verbose | <None> | Registre mais informações sobre o que estamos fazendo |
| -Lista-processadores | <None> | Liste camadas de processamento disponíveis e depois saia. |
| --Use-processador | attributeInjector | Selecione uma camada de processamento a ser usada, que pode alterar os dados brutos antes da saída. Esta opção pode aparecer várias vezes. |
| --Processor-Config | chave = valor | Forneça opções de configuração para as camadas de processamento selecionadas. Estes serão documentados pelo plug -in, que adiciona a camada de processamento. |
| -List-output-formates | <None> | Liste formatos de saída disponíveis e depois saia. |
| --output-as | Dummydll | Especifique o formato de saída que você deseja usar. |
| --output-to | cpp2il_out | Diretório raiz para saída. Esse caminho será passado para o formato de saída selecionado, que pode criar subdiretos etc. dentro deste local. |
| -Faleiro-estrutura-estrutura | C: path to webgl.framework.js | Usado apenas em conjunto com binários WASM. Alguns deles têm exportações ofuscadas, mas podem ser recuperadas por meio de um arquivo estrutura.js, que você pode fornecer o caminho para usar esse argumento. |
Cada compromisso é criado para uma compilação de CI usando ações do GitHub - o arquivo de ação pode ser encontrado na pasta .github, se você deseja reproduzir as compilações. Esteja ciente de que isso pode não ser o mais estável - embora haja testes para garantir a compatibilidade com uma variedade de jogos, às vezes as coisas quebram! Estes são versionados pelo compromisso de onde foram construídos.
Os arquivos de liberação podem ser baixados da guia Ações se você estiver assinado no GitHub, ou você pode usar os seguintes links, que sempre apontam para a versão mais recente do CI bem -sucedida. Observe que a construção da estrutura .NET é fornecida para compatibilidade com vinho/próton.
Além disso, o lançamento manualmente de lançamento de "Milestone" sempre que acho que um grande conjunto de melhorias foi feito. Eles não são marcados como pré-liberação no Github e devem (pelo menos em teoria) ser estável e adequado para uso em uma variedade de jogos.
Desde o primeiro marco construir 2021.0 e, em diante, o CPP2IL agora produz dados mais rigidamente estruturados para o console. Isso inclui níveis de log (verbo, informações, aviso, falha) e cores associadas (cinza para verbo, azul para informações, amarelo para aviso, vermelho para falhar).
A partir do Milestone 2021.1, se o CPP2il é capaz de detectar que você está executando o vinho/próton, esses códigos de cores ANSI são desativados, pois não são suportados pelo vinho e parecem horríveis.
As mensagens verbais só serão registradas se o CPP2IL for iniciado com a opção --verbose , e seria útil se você pudesse relatar problemas com esse sinalizador ativado. Para operação normal, eles não devem ser necessários, a menos que você esteja curioso.
Se você não deseja que a saída seja colorida, defina a variável de ambiente NO_COLOR=true .
Este aplicativo é construído principalmente usando o .NET 9.0, mas uma estrutura .NET Framework 4.7.2 também é publicada para fins herdados.
Ele usa as seguintes bibliotecas, para as quais sou muito grato:
(Todos são licenciados do MIT além da Xunit, que é o Apache 2.0+MIT)
WasmDisassembler .A construção net472 usa as seguintes bibliotecas adicionais:
Alguns plugins também usam bibliotecas adicionais:
O CPP2IL é (muito vagamente, neste momento) com base no IL2CPPDUMPER, que eu bordo em 2018 e removi muito código, reescrevi muito e adicionei muito mais. Mas, em sua essência, ainda tem um pouco de dumper, principalmente no LibCPP2il.
Ele contém pedaços do Il2Cppinspector, tomado com permissão de Djkaty, e eu gostaria de expressar minha gratidão aqui por sua ajuda inestimável.
Gostaria de agradecer à comunidade Audica Modding e Discord pela inspiração inicial para este projeto, muito apoio nos primeiros dias e solicitações de recursos atualmente.
E, finalmente, confira alguns outros projetos legais que se conectam a este. Obviamente, mencionei ainda mais o IL2CPPIROP, mas também confira o MelonLoader, que usa o CPP2IL para geração DLL DUMMY.