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 ).
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);
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 , "_". : "|" ];}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).
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.
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.
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.
Proteger el código fuente para que no sea editado con fines de lucro.
El código de ofuscación puede volverse más dependiente de la plataforma o del compilador.
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.
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).
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.
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.