Cómo evitar que se descompilen programas de Android
La ofuscación de código se refiere a convertir el código de un programa de computadora en un equivalente funcional. La llamada equivalencia funcional significa que sus funciones son iguales o similares antes y después de la transformación. La explicación es la siguiente: el programa P se transforma en P' mediante ofuscación. Si P no termina o termina con un error, entonces P' no puede terminar o termina con un error y el resultado del programa P' debería tener el mismo resultado; como programa P. De lo contrario, P' no es una ofuscación válida de P.
La clasificación actual de ofuscación se basa generalmente en la teoría de Collberg y se divide en ofuscación de diseño, ofuscación de datos, ofuscación de control y ofuscación preventiva).
1. Ofuscación del diseño
La ofuscación del diseño se refiere a eliminar u ofuscar información de texto auxiliar en el código fuente del software o en el código intermedio que es irrelevante para la ejecución, lo que dificulta que los atacantes lean y entender el código. El texto de los comentarios y la información de depuración en el código fuente del software se pueden eliminar directamente, y también se pueden eliminar los métodos y clases no utilizados y otros códigos o estructuras de datos. Esto no solo puede dificultar que los atacantes comprendan la semántica del código. reducir el tamaño del software y mejorar la eficiencia del software. Eficiencia de carga y ejecución del software. Las reglas de denominación y los significados literales de los identificadores, como nombres de constantes, nombres de variables, nombres de clases y nombres de métodos en el código de software, son útiles para que los atacantes comprendan el código. La ofuscación del diseño aumenta la dificultad para que los atacantes comprendan el código de software al confundir estos identificadores. . Existen muchos métodos de ofuscación de identificadores, como la denominación de funciones hash, el intercambio de identificadores y la inducción de sobrecarga. La denominación de la función hash simplemente reemplaza la cadena de identificación original con el valor hash de la cadena, de modo que la cadena de identificación no está relacionada con el código de software. El intercambio de identificadores significa primero recopilar todos los identificadores en las cadenas de caracteres del código de software y luego asignarlos aleatoriamente; a diferentes identificadores. Este método no es fácil de detectar para los atacantes; la inducción de sobrecarga se refiere a aprovechar algunas características de las reglas de nomenclatura del lenguaje de programación de alto nivel. el software utiliza la misma cadena tanto como sea posible, lo que dificulta que los atacantes comprendan el código fuente del software. La ofuscación del diseño es el método de ofuscación más simple, que no cambia el código ni el proceso de ejecución del software.
2. Ofuscación de datos
La ofuscación de datos consiste en modificar el campo de datos en el programa sin procesar el segmento de código. Los métodos de ofuscación de datos más utilizados incluyen fusionar variables, dividir variables, reorganizar matrices, cifrar cadenas, etc.
Fusionar variables consiste en fusionar varias variables en un solo dato. Cada variable original ocupa una de las áreas, similar a una gran estructura de datos. Dividir variables significa dividir una variable en dos variables, proporcionar una relación de mapeo antes y después de la división y convertir operaciones en una variable en operaciones en las dos variables después de la división.
La reorganización de matrices incluye dividir, fusionar, plegar y suavizar matrices. Dividir es dividir una matriz en 2 o más matrices de las mismas dimensiones; fusionar es lo opuesto; plegar es aumentar la dimensionalidad de la matriz;
En los archivos ELF, las variables globales y las cadenas constantes se almacenan en el segmento de datos, y las herramientas de desmontaje pueden encontrar fácilmente la relación de referencia entre las cadenas y el código. En el descifrado de software, puede encontrar fácilmente las declaraciones clave del código a través de algunas cadenas de mensajes para descifrar el software. El cifrado de cadenas puede cifrar y almacenar estas cadenas obvias y luego descifrarlas cuando sea necesario.
3. Confusión de control
La confusión de control también se denomina confusión de proceso. Cambia el flujo de ejecución del programa, interrumpiendo así las ideas de seguimiento de los analistas inversos y logrando el propósito de proteger el sistema. software. Las técnicas más utilizadas incluyen la inserción de instrucciones, declaraciones condicionales disfrazadas, puntos de interrupción, etc. La declaración condicional disfrazada es cuando el programa se ejecuta secuencialmente de A a B, y después de la confusión, se agrega un juicio condicional entre A y B, de modo que después de ejecutar A, se genera VERDADERO o FALSO, pero no importa cómo se genere. , B definitivamente será ejecutado.
Para controlar la ofuscación, se utilizan comúnmente métodos como predicados difusos, conexiones externas integradas y ruptura de orden.
Los predicados difusos utilizan el principio de asimetría del mensaje. Al agregar predicados difusos, el ofuscador conoce sus valores, pero es difícil de inferir para el antiofuscador. Por lo tanto, agregarlo interferirá con el análisis del valor por parte del desensamblador.
El uso de predicados difusos generalmente es para insertar algún código muerto o irrelevante (código falso), o para insertarlo en bucles o declaraciones de rama para interrumpir el flujo de ejecución del programa.
Inline (en línea) es incrustar un pequeño programa en cada punto del programa que se llama. Esquema (out-line) es abstraer un fragmento de código sin ninguna conexión lógica en un fragmento de código que. se puede llamar. Un programa que se llama varias veces.
Romper el orden se refiere a romper las dependencias locales del programa. Dado que los programadores tienden a juntar códigos relacionados, cambiar la estructura del espacio del programa rompiendo el orden aumentará el salto de pensamiento del cracker.
4. Prevenir confusión
Prevenir confusión generalmente está diseñado para descompiladores especiales, con el propósito de evitar la descompilación por parte de dichos descompiladores. Está especialmente diseñado para explotar las debilidades de un descompilador o desofuscador específico. Prevenir la confusión es muy eficaz para descompiladores específicos, por lo que las características de varios descompiladores deben utilizarse de manera integral al diseñar.