Ofuscación (software)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 10 de febrero de 2019; las comprobaciones requieren 19 ediciones .

Ofuscación (del latín  ofuscare  - oscurecer, oscuro; e inglés  ofuscate  - hacer no obvio, confuso, confuso) u ofuscación de código  - llevar el código fuente o el código ejecutable del programa a una forma que conserva su funcionalidad, pero lo hace difícil de analizar, comprender los algoritmos de trabajo y modificación durante la descompilación .

La "ofuscación" del código se puede llevar a cabo tanto a nivel de los nombres de los componentes del programa como a nivel de los algoritmos del programa . Para crear texto de ensamblador ofuscado, se pueden usar compiladores especializados que usan características no obvias o no documentadas del entorno de ejecución del programa . También hay programas especiales que producen ofuscación, llamados ofuscadores ( eng.  ofuscator ).

Objetivos de ofuscación

Dificultad para descompilar / depurar y examinar programas para descubrir la funcionalidad;

Dificultad para descompilar software propietario para evitar la ingeniería inversa o eludir los sistemas de verificación de licencias y DRM ;

software de craqueo de dificultad ;

Optimización del programa para reducir el tamaño del código en ejecución y (si se usa un lenguaje no compilado ) para acelerar el trabajo;

Demostración de las posibilidades no obvias del lenguaje y las calificaciones del programador (si se hace manualmente y no con herramientas);

Tecnología

A nivel de fuente

En JavaScript , VBScript y lenguajes de programación similares , el código fuente del programa está disponible para el usuario . En este caso, formatear el texto y reemplazar nombres puede hacer que el texto sea menos legible.

Texto fuente en lenguaje C :

int CONTAR = 100 ; float TASA_DE IMPUESTO = 0.2 ; para ( int i = 0 ; i < CONTAR ; i ++ ) { impuesto [ i ] = orig_price [ i ] * TAX_RATE ; precio [ i ] = precio_origen [ i ] + impuesto [ i ]; }

Código después de la ofuscación [1] :

for ( int a = 0 ; a < 100 ; a ++ ){ b [ a ] ​​​​= c [ a ] ​​* 0.2 ; re [ a ] ​​= c [ a ] ​​+ b [ a ];}

Ejemplo más complejo:

char * M , A , Z , E = 40 , J [ 40 ], T [ 40 ]; principal ( C ){ para ( * J = A = scanf ( M = "%d" , & C ); --E ; _ J [ mi ] = T [ E ] = E ) printf ( "._" ); para (;( A -= Z =! Z ) || ( printf ( " \n |" ) , A = 39 , C -- ) ; Z || printf ( M )) M [ Z ] = Z [ A - ( E = A [ J - Z ]) &&! C & UN == T [ UN ] | 6 << 27 < rand () ||! C &! ¿ Z ? J [ T [ E ] = T [ A ]] = E , J [ T [ A ] = A - Z ] = A , "_". : "|" ];}

A nivel de código máquina

Por regla general, la ofuscación a nivel de código máquina reduce la velocidad de ejecución y, en consecuencia, aumenta el tiempo de ejecución del programa. Por lo tanto, se usa en lugares del programa críticos para la seguridad , pero no para la velocidad, como verificar el código de registro [2] .

La forma más sencilla de ofuscar el código máquina  es insertar construcciones inactivas en él (como or ax, ax).

En el nivel de código intermedio

A diferencia de los lenguajes de programación convencionales como C++ o Pascal que compilan a código máquina , el lenguaje Java , NetP y los lenguajes de plataforma .NET compilan el código fuente en código intermedio ( bytecode ) que contiene suficiente información para reconstruir adecuadamente el código fuente. Por esta razón, la ofuscación de código intermedio se usa para estos lenguajes.

Cita

Complicando la investigación del código

Como se mencionó anteriormente, descompilar programas Java y .NET es bastante fácil. En este caso, el ofuscador brinda una ayuda invaluable a quienes desean ocultar su código de miradas indiscretas. A menudo, después de la ofuscación, el código descompilado no se vuelve a compilar.

La ofuscación de HTML ayuda a los spammers : en un cliente de correo electrónico que es capaz de mostrar HTML, el texto se lee, pero el filtro antispam , que se ocupa del archivo HTML original, pasa el mensaje no deseado sin reconocer la línea prohibida en él.

El ejemplo más simple de HTML ofuscado:

< b > Mash </ b >< b > ina </ b >

Al visualizar, el usuario verá la palabra " Máquina ", mientras que en el código fuente se disecciona y se percibe como dos palabras separadas.

Optimización

En los lenguajes interpretados , el código ofuscado ocupa menos espacio que el código fuente y, a menudo, se ejecuta más rápido que el código fuente. Los ofuscadores modernos también reemplazan constantes con números, optimizan el código de inicialización de matriz y realizan otras optimizaciones que son problemáticas o imposibles en el nivel de origen.

El problema de la reducción de tamaño es importante, por ejemplo, cuando se programa para teléfonos celulares en J2ME , donde el tamaño del programa está severamente limitado. La ofuscación de JavaScript reduce el tamaño de los archivos HTML y, por lo tanto, acelera la carga.

Protección de software propietario

Proteger el código fuente para que no sea editado con fines de lucro.

Desventajas

Pérdida de flexibilidad del código

El código de ofuscación puede volverse más dependiente de la plataforma o del compilador.

Dificultades de depuración

El ofuscador evita que un extraño descubra qué está haciendo el código, pero también evita que el desarrollador lo depure. Al depurar, debe desactivar el ofuscador.

Seguridad insuficiente

Si bien la ofuscación ayuda a que un sistema distribuido sea más seguro, no debe limitarse a eso. La ofuscación es seguridad a través de la oscuridad . Ninguno de los ofuscadores existentes garantiza la complejidad de la descompilación y no brinda seguridad al nivel de los esquemas criptográficos modernos. Es bastante probable que la protección efectiva sea imposible (al menos en alguna clase particular de problemas a resolver).

Errores en ofuscadores

Un ofuscador moderno es un paquete de software complejo. A menudo, a pesar de un diseño y pruebas cuidadosos , los errores se infiltran en los ofuscadores. Por lo tanto, existe una posibilidad distinta de cero de que el código pasado a través del ofuscador no funcione en absoluto. Y cuanto más complejo sea el programa que se está desarrollando, mayor será esta probabilidad.

Llamar a una clase por su nombre

La mayoría de los lenguajes de código intermedios pueden crear o llamar objetos por sus nombres de clase . Los ofuscadores modernos le permiten evitar el cambio de nombre de estas clases, pero tales restricciones reducen la flexibilidad de los programas.

Véase también

Notas

  1. En este caso, se puede llamar minificación .
  2. 10.2. Métodos para comprobar los códigos de registro . www.rfcmd.ru Consultado el 2 de febrero de 2016. Archivado desde el original el 12 de diciembre de 2016.

Literatura

  • Boytsev O. M. Proteja su computadora al 100% contra virus y piratas informáticos. - Pedro, 2008. - ISBN 9785388003478 .

Enlaces