Cómo evitar eficazmente que los programas Java sean descompilados y descifrados
1. Aislar programas Java
El método más simple es evitar que los usuarios accedan a programas Java. Este es el método más fundamental y se puede lograr de varias maneras. Por ejemplo, un desarrollador puede colocar una clase clave de Java en el lado del servidor y el cliente puede obtener servicios accediendo a las interfaces relevantes del servidor en lugar de acceder directamente al archivo de clase. Por tanto, los piratas informáticos no pueden descompilar archivos de clase. Actualmente, cada vez existen más estándares y protocolos para brindar servicios a través de interfaces, como HTTP, Web Service, RPC, etc. Sin embargo, muchas aplicaciones no son adecuadas para este tipo de protección. Por ejemplo, los programas Java no se pueden aislar de los programas que se ejecutan en una sola máquina.
2. Archivos de clase cifrados
Para evitar que los archivos de clase se descompilen directamente, muchos desarrolladores cifrarán algunos archivos de clase clave, como los relacionados con los códigos de registro y la gestión de números de serie. . clase. Antes de utilizar estas clases cifradas, el programa primero debe descifrarlas y luego cargarlas en la JVM. El descifrado de estas categorías se puede lograr mediante hardware o software.
En la implementación, los desarrolladores generalmente cargan clases de cifrado personalizando la clase ClassLoader (tenga en cuenta que, por razones de seguridad, Applet no admite ClassLoader personalizado). El cargador de clases personalizado primero encuentra la clase cifrada, luego la descifra y finalmente carga la clase descifrada en la JVM. En este modo protegido, el cargador de clases personalizado es una clase muy crítica. Como no hay cifrado, puede ser el primer objetivo de los piratas informáticos. Si se superan la clave y el algoritmo de descifrado relevantes, la clase cifrada se puede descifrar fácilmente.
3. Convertir a código local
Convertir el programa a código local también es una forma eficaz de evitar la descompilación. Porque el código nativo suele ser difícil de descompilar. Los desarrolladores pueden optar por convertir toda la aplicación a código nativo o pueden optar por convertir módulos clave. Si solo se convierten los módulos clave, el programa Java necesita usar la tecnología JNI para llamar cuando use estos módulos. Por supuesto, al utilizar esta tecnología para proteger programas Java, también sacrifica las características multiplataforma de Java. Para diferentes plataformas, necesitamos mantener diferentes versiones del código local, lo que aumentará el soporte y el trabajo de mantenimiento del software. Sin embargo, para algunos módulos críticos, a veces esta solución suele ser necesaria. Para garantizar que estos códigos nativos no puedan modificarse ni reemplazarse, normalmente es necesario firmarlos digitalmente. Estos códigos nativos a menudo deben certificarse antes de usarse para garantizar que no hayan sido modificados por piratas informáticos. Si se supera la verificación de firma, se llama al método JNI correspondiente.
4. Confusión de código
La ofuscación de código consiste en reorganizar y procesar archivos de clase para que el código procesado pueda completar la misma función (semántica) que el código preprocesado. Para el código ofuscado, es difícil descompilar, es decir, el código obtenido después de la descompilación es muy difícil de entender y oscuro, por lo que es difícil para el descompilador conocer la verdadera semántica del programa. En teoría, si un hacker tiene suficiente tiempo, aún se puede descifrar el código ofuscado e incluso se están desarrollando herramientas anti-ofuscación. Pero desde la situación real, debido al desarrollo diversificado de la tecnología de ofuscación y la madurez de la teoría de la ofuscación, aún se puede evitar que el código Java ofuscado sea descompilado. A continuación presentaremos la tecnología de ofuscación en detalle, porque la ofuscación es una tecnología importante para proteger los programas Java.