Cómo evitar eficazmente que los programas Java sean descompilados y descifrados
1. Aislar programas Java
El método más simple es hacer que los programas de clase Java sean inaccesibles para los usuarios. Este es el método más básico y se puede lograr de muchas maneras. Por ejemplo, los desarrolladores pueden colocar clases clave de Java en el lado del servidor y el cliente obtiene servicios accediendo a las interfaces relevantes del servidor en lugar de acceder directamente a los archivos de clases. De esta forma, los piratas informáticos no pueden descompilar dichos archivos. Actualmente, cada vez existen más estándares y protocolos para brindar servicios a través de interfaces, como HTTP, Web Service, RPC, etc. Pero hay muchas aplicaciones que no son adecuadas para este tipo de protección. Por ejemplo, un programa Java no puede aislarse como un programa independiente.
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. . amable. Antes de utilizar estas clases cifradas, el programa primero debe descifrarlas y luego cargarlas en la JVM. El descifrado de estas clases se puede realizar mediante hardware o software.
Durante la implementación, los desarrolladores normalmente cargan clases criptográficas a través de una clase ClassLoader personalizada (tenga en cuenta que los applets no admiten ClassLoaders personalizados por razones de seguridad). El ClassLoader personalizado primero encuentra la clase cifrada, luego la descifra y finalmente carga la clase descifrada en la JVM. El ClassLoader personalizado es la clase clave para este método protegido. Como no está cifrado, puede ser el primer objetivo de los piratas informáticos. Las clases cifradas también se pueden descifrar fácilmente si se filtran las claves y algoritmos de descifrado relevantes.
3. Convertir a código nativo
Convertir el programa a código nativo también es una forma eficaz de evitar la descompilación. Esto se debe a que 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 las partes clave de los módulos, el programa Java necesita usar la tecnología JNI para llamarlas 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á la carga de trabajo de soporte y 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 locales no puedan modificarse ni reemplazarse, normalmente es necesario firmarlos digitalmente. Antes de utilizar estos códigos nativos, suele ser necesario verificarlos para asegurarse de 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. Ofuscación de código
La ofuscación de código es el proceso de reorganizar y procesar archivos de clase para que el código procesado pueda realizar las mismas funciones (semántica) que el código preprocesado. Sin embargo, el código ofuscado es difícil de descompilar, es decir, el código descompilado es muy difícil de entender y oscuro, por lo que es difícil para los descompiladores obtener la verdadera semántica del programa. En teoría, si un hacker tiene suficiente tiempo, todavía es posible descifrar el código ofuscado, y algunas personas incluso están desarrollando herramientas anti-ofuscación. Pero, de hecho, debido al desarrollo diversificado de la tecnología de ofuscación y la madurez de la teoría de la ofuscación, el código Java ofuscado aún puede estar bien protegido contra la descompilación. 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.