Los problemas con la ofuscación de código
La ofuscación de código es la primera solución aplicada a la protección del código Java, y también es la solución más directa.
La ofuscación de código generalmente implica los siguientes cuatro métodos:
- Conversión de nombre de paquete, nombre de clase y nombre de variable
- Las estructuras de control cambian, como por ejemplo el aplanamiento del flujo de control, la adición de predicados inmutables, etc.
- Ofuscación o cifrado de cadenas
- Añadir código inútil
La ofuscación de código puede reducir significativamente la legibilidad del código descompilado y aumentar la dificultad del análisis estático, pero no importa cómo se realice la ofuscación de código, la lógica de ejecución del programa no se alterará.
El bytecode de la JVM es un código intermedio semántico muy claro y explícito, altamente legible. En el caso de los archivos de clase ofuscados, incluso si no se pueden restaurar a código fuente Java legible, sí se pueden analizar a nivel de bytecode. Debido a la alta semántica del bytecode de Java, este proceso es relativamente sencillo.
Hemos desarrollado un motor de ejecución de bytecode para JVM con Java y Kotlin. Los usuarios pueden usar este proyecto para depurar dinámicamente programas Java a nivel de bytecode en IntelliJ IDEA. Para más información, consulte el artículo a continuación.
https://protector4j.com/articles/motor-de-bytecode-jvm-escrito-con-java-y-kotlin/
Y usamos este motor para intentar descifrar un código ofuscado bien conocido, el proceso específico se puede consultar en el siguiente artículo.
http://protector4j.com/articles/desofuscar-con-vlx-vmengine/
Conclusión
Del análisis anterior se desprende que, debido a la alta semanticidad del bytecode de la JVM, es muy fácil de analizar y leer. La lógica en ejecución se puede analizar fácilmente mediante la depuración dinámica. Desarrollar herramientas de depuración dinámica no es una tarea muy compleja, por lo que la ofuscación no es una solución de protección fiable.