Los problemas de la ofuscación de código
La ofuscación de código es la solución más antigua aplicada a la protección de código Java, y también es la solución más directa.
La ofuscación de código típicamente involucra los siguientes cuatro métodos:
- Conversión de nombres de paquetes, nombres de clases y nombres de variables
- Cambio de estructuras de control, como aplanamiento del flujo de control, adición de predicados inmutables, etc.
- Ofuscación o cifrado de cadenas
- Adición de código inútil
La ofuscación de código puede reducir significativamente la legibilidad del código decompilado y aumentar la dificultad del análisis estático, pero sin importar cómo se realice la ofuscación, la lógica de ejecución del programa no se alterará.
El bytecode JVM es un código intermedio con semántica muy clara y explícita, altamente legible. Para archivos class ofuscados, incluso si no pueden restaurarse a código fuente Java legible, aún pueden analizarse a nivel de bytecode. Debido a la alta naturaleza semántica del bytecode Java, este proceso es en realidad relativamente fácil.
Hemos desarrollado un motor de ejecución de bytecode JVM usando los lenguajes 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/es/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
Y usamos este motor para intentar crackear un código ofuscado bien conocido, el proceso específico puede consultarse en el siguiente artículo
http://protector4j.com/es/articles/deobfuscate-with-vlx-vmengine/
Conclusión
Del análisis anterior, se puede ver que debido a la alta semanticidad del bytecode JVM, es muy fácil de analizar y leer. La lógica de ejecución puede analizarse fácilmente mediante depuración dinámica. Escribir 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 confiable.