Red de conocimiento informático - Material del sitio web - Cómo utilizar el programa Java para implementar el cifrado de números de serieJava es un lenguaje interpretado multiplataforma. El "código de bytes" en medio de la compilación del código fuente de Java se almacena en archivos de clase. Los archivos de clase son códigos intermedios en forma de códigos de bytes. Los códigos de bytes contienen una gran cantidad de información del código fuente, como nombres de variables, nombres de métodos, etc. Por lo tanto, la descompilación del código intermedio de Java resulta muy sencilla. Actualmente, existen en el mercado muchos programas de descompilación comerciales gratuitos que pueden generar código fuente descompilado de alta calidad. Por tanto, cómo proteger los programas Java se ha convertido en un desafío muy importante para los desarrolladores. Este artículo primero analiza los métodos básicos para proteger programas Java, luego realiza un estudio en profundidad del problema de ofuscación del código y finalmente analiza cómo proteger programas Java en la práctica basándose en aplicaciones prácticas. La descompilación se convierte en el mayor desafío a la hora de proteger los programas Java. Normalmente, los programas desarrollados en lenguajes de programación como C y C se compilan en código objeto, es decir, código ejecutable binario nativo. Normalmente, todos los archivos fuente se compilan y vinculan en un único archivo ejecutable. En estos archivos ejecutables, el compilador eliminará información como nombres de variables y nombres de métodos en el programa, que generalmente están representados por direcciones de memoria. Por ejemplo, si es necesario utilizar una variable, generalmente se accede a ella a través de la dirección de la variable. . Por tanto, descompilar estos códigos objeto nativos es muy difícil. La aparición del lenguaje Java ha hecho que la descompilación sea muy fácil y eficaz. Las razones son las siguientes: 1. Debido a los requisitos multiplataforma, el conjunto de instrucciones de Java es más simple y versátil, lo que facilita la deducción de la información semántica del programa. 2. El compilador de Java compila cada clase en un archivo separado, que también simplifica el trabajo de descompilación; 3. Los archivos de clase Java aún conservan los nombres de todos los métodos y variables. El acceso a variables y métodos a través de estos nombres a menudo conlleva muchos símbolos semánticos. Debido a las características de los propios programas Java, el efecto de descompilación es muy bueno para los programas Java no procesados. Actualmente, existen muchas herramientas de descompilación de Java en el mercado, algunas son gratuitas, otras comerciales y otras de código abierto. La velocidad de descompilación y el efecto de estas herramientas son muy buenos. Un buen software de descompilación puede descompilar un programa que esté muy cerca del código fuente. Por tanto, con los descompiladores, los piratas informáticos pueden modificar estos programas o reutilizarlos. Por lo tanto, cómo proteger los programas Java para que no sean descompilados es una cuestión muy importante. Técnicas de protección comunes Debido al mayor nivel de abstracción del código de bytes de Java, es más fácil descompilarlo. Esta sección presentará varios métodos comúnmente utilizados para proteger el código de bytes de Java para que no sea descompilado. Normalmente, estos métodos no impiden por completo que un programa sea descompilado, sino que lo hacen más difícil, ya que cada método tiene sus propios antecedentes y debilidades. La forma más sencilla de aislar programas Java es evitar que los usuarios accedan a programas de clases Java. Este método es el más básico y existen varios métodos de implementación específicos. Por ejemplo, los desarrolladores pueden colocar clases Java importantes en el lado del servidor y el cliente obtiene servicios accediendo a las interfaces relevantes del servidor en lugar de acceder directamente al archivo de clase. De esta forma, los piratas informáticos no pueden descompilar los 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. Pero hay muchas aplicaciones que no son adecuadas para este tipo de protección. Por ejemplo, para los programas que se ejecutan en una sola máquina, los programas Java no se pueden aislar. Este método de protección se muestra en la Figura 1. Figura 1 Diagrama de programa Java aislado Cifrado de archivos de clase Para evitar que los archivos de clase se descompilen directamente, muchos desarrolladores cifrarán algunos archivos de clase clave, como clases relacionadas con códigos de registro, administración de números de serie, etc. Antes de utilizar estas clases de cifrado, el programa primero debe descifrarlas y luego cargarlas en la JVM. El descifrado de estas clases se puede realizar mediante hardware o software. Durante el proceso de implementación, los desarrolladores generalmente completan la carga de clases cifradas a través de clases ClassLoader personalizadas (por razones de seguridad, Applet no puede admitir ClassLoader personalizado).

Cómo utilizar el programa Java para implementar el cifrado de números de serieJava es un lenguaje interpretado multiplataforma. El "código de bytes" en medio de la compilación del código fuente de Java se almacena en archivos de clase. Los archivos de clase son códigos intermedios en forma de códigos de bytes. Los códigos de bytes contienen una gran cantidad de información del código fuente, como nombres de variables, nombres de métodos, etc. Por lo tanto, la descompilación del código intermedio de Java resulta muy sencilla. Actualmente, existen en el mercado muchos programas de descompilación comerciales gratuitos que pueden generar código fuente descompilado de alta calidad. Por tanto, cómo proteger los programas Java se ha convertido en un desafío muy importante para los desarrolladores. Este artículo primero analiza los métodos básicos para proteger programas Java, luego realiza un estudio en profundidad del problema de ofuscación del código y finalmente analiza cómo proteger programas Java en la práctica basándose en aplicaciones prácticas. La descompilación se convierte en el mayor desafío a la hora de proteger los programas Java. Normalmente, los programas desarrollados en lenguajes de programación como C y C se compilan en código objeto, es decir, código ejecutable binario nativo. Normalmente, todos los archivos fuente se compilan y vinculan en un único archivo ejecutable. En estos archivos ejecutables, el compilador eliminará información como nombres de variables y nombres de métodos en el programa, que generalmente están representados por direcciones de memoria. Por ejemplo, si es necesario utilizar una variable, generalmente se accede a ella a través de la dirección de la variable. . Por tanto, descompilar estos códigos objeto nativos es muy difícil. La aparición del lenguaje Java ha hecho que la descompilación sea muy fácil y eficaz. Las razones son las siguientes: 1. Debido a los requisitos multiplataforma, el conjunto de instrucciones de Java es más simple y versátil, lo que facilita la deducción de la información semántica del programa. 2. El compilador de Java compila cada clase en un archivo separado, que también simplifica el trabajo de descompilación; 3. Los archivos de clase Java aún conservan los nombres de todos los métodos y variables. El acceso a variables y métodos a través de estos nombres a menudo conlleva muchos símbolos semánticos. Debido a las características de los propios programas Java, el efecto de descompilación es muy bueno para los programas Java no procesados. Actualmente, existen muchas herramientas de descompilación de Java en el mercado, algunas son gratuitas, otras comerciales y otras de código abierto. La velocidad de descompilación y el efecto de estas herramientas son muy buenos. Un buen software de descompilación puede descompilar un programa que esté muy cerca del código fuente. Por tanto, con los descompiladores, los piratas informáticos pueden modificar estos programas o reutilizarlos. Por lo tanto, cómo proteger los programas Java para que no sean descompilados es una cuestión muy importante. Técnicas de protección comunes Debido al mayor nivel de abstracción del código de bytes de Java, es más fácil descompilarlo. Esta sección presentará varios métodos comúnmente utilizados para proteger el código de bytes de Java para que no sea descompilado. Normalmente, estos métodos no impiden por completo que un programa sea descompilado, sino que lo hacen más difícil, ya que cada método tiene sus propios antecedentes y debilidades. La forma más sencilla de aislar programas Java es evitar que los usuarios accedan a programas de clases Java. Este método es el más básico y existen varios métodos de implementación específicos. Por ejemplo, los desarrolladores pueden colocar clases Java importantes en el lado del servidor y el cliente obtiene servicios accediendo a las interfaces relevantes del servidor en lugar de acceder directamente al archivo de clase. De esta forma, los piratas informáticos no pueden descompilar los 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. Pero hay muchas aplicaciones que no son adecuadas para este tipo de protección. Por ejemplo, para los programas que se ejecutan en una sola máquina, los programas Java no se pueden aislar. Este método de protección se muestra en la Figura 1. Figura 1 Diagrama de programa Java aislado Cifrado de archivos de clase Para evitar que los archivos de clase se descompilen directamente, muchos desarrolladores cifrarán algunos archivos de clase clave, como clases relacionadas con códigos de registro, administración de números de serie, etc. Antes de utilizar estas clases de cifrado, el programa primero debe descifrarlas y luego cargarlas en la JVM. El descifrado de estas clases se puede realizar mediante hardware o software. Durante el proceso de implementación, los desarrolladores generalmente completan la carga de clases cifradas a través de clases ClassLoader personalizadas (por razones de seguridad, Applet no puede admitir ClassLoader personalizado).

El ClassLoader personalizado primero encuentra la clase cifrada, luego la descifra y finalmente carga la clase descifrada en la JVM. En esta protección, el ClassLoader personalizado es una clase muy importante. Como no hay cifrado, podría ser el primer objetivo de los piratas informáticos. Las clases cifradas se pueden descifrar fácilmente si se filtran la clave y el algoritmo de descifrado. En la Figura 2 se muestra un diagrama esquemático de este método de protección. Figura 2 Diagrama esquemático del cifrado de archivos de clase Conversión a código nativo La conversión del programa a código nativo 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 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á 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 locales no puedan modificarse ni reemplazarse, normalmente es necesario firmarlos digitalmente. Estos códigos nativos a menudo deben verificarse 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. Este método de protección se muestra en la Figura 3. Ofuscación de código Figura 3 Diagrama esquemático de código convertido a código nativo La ofuscación de código es la reorganización y procesamiento de archivos de clase para que el código procesado pueda realizar la misma función (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, y es difícil para los descompiladores descubrir la verdadera semántica del programa. En teoría, si los piratas informáticos tienen suficiente tiempo, el código ofuscado aún puede descifrarse y algunas personas incluso están desarrollando herramientas anti-ofuscación. Pero, de hecho, debido a la diversificación 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 específicamente la tecnología de ofuscación, porque la ofuscación es una tecnología importante para proteger los programas Java. La Figura 4 es un diagrama esquemático de ofuscación de código. Figura 4 Diagrama esquemático de ofuscación de código Resumen de varias tecnologías Los entornos de aplicación de las tecnologías anteriores son diferentes y cada uno tiene sus propias debilidades. La Tabla 1 es una comparación de características relacionadas. Introducción a la ofuscación Tabla 1 Comparación de diferentes tecnologías de protección Hasta ahora, la ofuscación sigue siendo el método de protección más básico para la protección de programas Java. La mayoría de ellos ofuscan archivos de clase, pero también hay algunas herramientas que procesan primero el código fuente y luego la clase, aumentando así el proceso de ofuscación. Actualmente, las herramientas de ofuscación comercialmente exitosas incluyen la serie 1stBarrier de JProof, JShrink de Eastridge y SourceGuard de 4thpass.com. Dependiendo de los objetivos de la ofuscación, las principales técnicas de ofuscación se pueden dividir en las siguientes categorías: ofuscación léxica, ofuscación de datos, ofuscación de control y prevención de conversión. Confusión de símbolos En una clase hay mucha información que no tiene nada que ver con la ejecución del programa en sí, como nombres de métodos, nombres de variables, etc. Los nombres de estos símbolos suelen tener ciertos significados. Por ejemplo, si el nombre de un método es getKeyLength(), entonces este método probablemente se use para devolver la longitud de una clave. La ofuscación de símbolos consiste en convertir esta información en expresiones sin sentido, como numerar todas las variables a partir de vairant_001 y numerar todos los métodos a partir de método_001; Esto puede causar algunas dificultades en la descompilación. Para funciones privadas y variables locales, normalmente es posible cambiar sus símbolos sin afectar el funcionamiento del programa. Pero para algunos nombres de interfaz, funciones públicas y variables miembro, si otros módulos externos necesitan hacer referencia a estos símbolos, a menudo necesitamos conservar estos nombres; de lo contrario, los módulos externos no pueden encontrar los métodos y variables con estos nombres. Por lo tanto, la mayoría de las herramientas de ofuscación ofrecen ricas opciones de ofuscación de símbolos, lo que permite a los usuarios elegir si ofuscar los símbolos y cómo hacerlo.