Os problemas da ofuscação de código
A ofuscação de código é a solução mais antiga aplicada à proteção de código Java, e também é a solução mais direta.
A ofuscação de código geralmente envolve os seguintes quatro métodos:
- Conversão de nomes de pacotes, classes e variáveis
- Alteração de estruturas de controle, como nivelamento de fluxo de controle, adição de predicados imutáveis, etc.
- Ofuscação ou criptografia de strings
- Adição de código inútil
A ofuscação de código pode reduzir significativamente a legibilidade do código descompilado e aumentar a dificuldade da análise estática, mas não importa como a ofuscação de código é realizada, a lógica de execução do programa não será alterada.
O bytecode JVM é um código intermediário semântico muito claro e explícito, com alta legibilidade. Para arquivos class ofuscados, mesmo que não possam ser restaurados para código-fonte Java legível, ainda podem ser analisados no nível do bytecode. Devido à alta natureza semântica do bytecode Java, este processo é na verdade relativamente fácil.
Desenvolvemos um mecanismo de execução de bytecode JVM usando as linguagens Java e Kotlin. Os usuários podem usar este projeto para depurar dinamicamente programas Java no nível do bytecode no IntelliJ IDEA. Para mais informações, consulte o artigo abaixo.
https://protector4j.com/pt/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
E usamos este mecanismo para tentar quebrar um código ofuscado bem conhecido, o processo específico pode ser consultado no seguinte artigo
http://protector4j.com/pt/articles/deobfuscate-with-vlx-vmengine/
Conclusão
Da análise acima, pode-se ver que devido à alta semântica do bytecode JVM, é muito fácil de ser analisado e lido. A lógica de execução pode ser facilmente analisada através de depuração dinâmica. Escrever ferramentas de depuração dinâmica não é uma tarefa muito complexa, portanto a ofuscação não é uma solução de proteção confiável.