fbpx
Wikipedia

Ofuscación

La ofuscación se refiere a encubrir el significado de una comunicación haciéndola más confusa y complicada de interpretar.

Informática

En computación, la ofuscación se refiere al acto deliberado de realizar un cambio no destructivo, ya sea en el código fuente de un programa informático, en el código intermedio (bytecodes) o en el código máquina cuando el programa está en forma compilada o binaria. Es decir, se cambia el código se "enrevesa" manteniendo el funcionamiento original, para dificultar su entendimiento. De esta forma se dificulta los intentos de ingeniería inversa y desensamblado que tienen la intención de obtener una forma de código fuente cercana a la forma original.

A las herramientas que realizan procesos de ofuscación se les llama ofuscadores. Los ofuscadores pueden actuar sobre el código fuente, sobre el código objeto o sobre ambos.

Como un efecto lateral, la ofuscación, en ocasiones, hace que los programas resultantes sean más pequeños (aunque puede hacer que los programas sean más grandes en otros casos).

Algunos lenguajes tienden más a la ofuscación que otros. C, C++ y Perl son los más citados como fácilmente ofuscables. Las macros de preprocesador son usadas a menudo para crear código complicado de leer enmascarando la gramática y sintaxis estándar del lenguaje del cuerpo principal de código.

Además, a veces, también se puede buscar que el código fuente resulte una obra de ascii art. Existen otros programas ofuscados llamados quine que al ejecutarse la salida debe ser el código fuente del programa.

Motivación

La motivación inmediata de la ofuscación es dificultar el entendimiento del código y por tanto dificultar la ingeniería inversa. El motivo original puede ser por:[1]

  • Por seguridad. No queremos que un atacante comprenda el funcionamiento del código para que no lo altere con malos propósitos. Por ejemplo, si un programa contiene un control de licencias, nos puede interesar que nadie lo modifique para saltarse dicho control. O bien nos puede interesar que un software cliente no envíe peticiones malintencionadas al servidor. Hay que tener en cuenta que esto sólo consigue seguridad por oscuridad: el sistema es seguro simplemente porque nadie sabe cómo funciona. Pero si alguien consigue entender su funcionamiento mediante el análisis, toda la seguridad se va al traste. Por tanto, usar ofuscación con este propósito sólo tiene sentido como medida adicional para poner las cosas más difíciles a un atacante, porque no es infalible en absoluto.
  • Ocultar código malicioso. Esta ocultación se realiza en dos ámbitos:[2]
    • Dificulta la ingeniería inversa estática de malware haciendo más difícil encontrar las secciones de código más importante.
    • Hace que las firmas estáticas utilizadas por los vendedores de antivirus no puedan detectar malware, ya que las firmas se basan en secuencias de bytes específicas en el binario
  • Protección de la propiedad intelectual. Quizás no quieres que tu competencia copie cierto algoritmo que has utilizado.
  • Como efecto colateral de otros procesos. Un ejemplo es la minificación: la transformación del código fuente de un programa con el propósito de reducir el número de bytes que ocupa. En lenguajes interpretados como JavaScript esto reduce el espacio de almacenamiento y el tiempo necesario para descargar un script por Internet. También hay quién dice que la optimización de código de un compilador consigue, en cierto modo, un cierto nivel de ofuscación al modificar el programa para mejorar su rendimiento.
  • Pura diversión. Entender cómo funciona un programa ofuscado es como un rompecabezas, y un programa difícil de entender puede llegar a ser una obra de arte. Por ejemplo, el lenguaje de programación esotérico Brainfuck fue diseñado específicamente para hacer difícil la comprensión de sus programas. Y hay un concurso muy popular, el IOCCC (International Obfuscated C Code Contest), cuyo propósito es concebir un programa «útil» de la forma más incomprensible posible.
  • Evitar o dificultar la decompilación. Algunos lenguajes, como por ejemplo Java, compilan a un lenguaje intermedio de bytecodes. Este código intermedio puede ser fácilmente decompilado debido a que el bytecode contiene gran parte de la información del código fuente original. Para diferentes motivos (ingeniería inversa, sabotajes, piratería de software....) a veces es necesario ofuscar el código intermedio para impedir la decompilación o que esta obtenga un código incomprensible.[3]

Ejemplos

Un ejemplo simple de ofuscación es llamar a las variables o funciones con palabras reservadas del lenguaje añadiendo algún símbolo

int int_; 

Con esta línea se define una variable de tipo entero.

long int _int(int int_){return int_-int_}; 

Con esta línea definimos una función con un parámetro entero que devuelve un valor long int, que por otra parte siempre será 0.

_int-_int; 

Esto equivale a poner 0.

(_int-_int)!; 

Esto equivale a poner 1.

(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))|(!(int_-int_)<<!(int_-int_))); 

Esto equivale a poner 10.

Técnicas

Hay distintas técnicas para realizar ofuscación. Estas técnicas se pueden clasificar según se aplican al diseño, a datos, a instrucciones o al flujo de control del programa.[4][5]

Técnicas de ofuscación del diseño

Algunas de las técnicas de ofuscación de diseño son:

  • Unión de clases (en inglés class merging). Se usa en lenguajes orientados a objetos y consiste en la unión de una o más clases del programa en una sola clase.[4]
  • División de clases (en inglés class splitting).Se usa en lenguajes orientados a objetos y consiste en dividir una clase de un determinado programa en varias clases.[4]
  • Tipos ocultos (en inglés type hiding).Se usan en lenguajes orientados a objetos y consiste en utilizar los interfaces para oscurecer le intención final del diseño del programa[4]

Técnicas de ofuscación de datos

Estas técnicas se basan en aplicar diversas transformaciones a las variables, las constantes y las estructuras que forman parte de un programa.[4]​ Algunas de las ofuscaciones de datos son:

  • Cegar constantes (en inglés constant blinding). En lugar de tener un valor en claro como constante, esta técnica sustituye los valores de las constantes, generalmente mediante una XOR con un valor aleatorio, por datos aparentemente sin sentido.[5]
  • Cambio de la codificación de las variables. Cambiando la codificación de las variables se busca ocultar el valor original de la variable, por ejemplo podemos cambiar la codificación de un string, por su valor equivalente en otra codificación, por ejemplo codificación a Base64 o a un cifrado sencillo mediante XOR, ROT13 etc.[5]
  • Conversión de datos estáticos en procesos. Consiste en conviertir un dato en un proceso que generará ese mismo dato.[4]
  • Cambio del tiempo de vida de variables Consiste en convertir variable global en variable/s local/es.[4]
  • Agregación de variables (en inglés merging variable. Consiste en agrupar variables en estructuras más complejas, por ejemplo juntando enteros en un mismo struct.[5]
  • Separación de variables (en inglés splitting variable). En contraposición a la agregación de variables, la separación de variables consiste en dividir las variables en unidades más pequeñas, por ejemplo transformando un int de 4 bytes en dos shorts de 2 bytes.[5]
  • Agregación de arrays (en inglés merging array. Consiste en agrupar varios arrays en uno solo.[4]
  • Separación de arrays (en inglés splitting array). Consiste en dividir arrays y representar un único array mediante varios de ellos.[4]
  • Aplanamiento de arrays (en inglés flatten array). Consiste en utilizar una variable de array de menor dimensión para representar un array de mayor dimensión.[4]
  • Despliegue de arrays (en inglés fold array). Consiste en utilizar una variable de array de mayor dimensión para representar un array de menor dimensión.[4]

Técnicas de ofuscación de flujo de control

Consisten en una serie de transformaciones que alteran el flujo de ejecución de un programa. El flujo de ejecución de un programa se puede representar por un grafo de control de flujo (CFG), en el que los nodos son los bloques básicos de ejecución del programa, y las aristas son los saltos entre bloques básicos de ejecución (conjuntos de instrucciones que se ejecutan secuencialmente, en los que la primera instrucción es el único acceso al bloque y la última instrucción es la única de salida).[4]

Algunas de las ofuscaciones de control de flujo son:

  • Inserción de código muerto (en inglés dead code insertion). Consiste en insertar código en el programa que no aporta funcionalidad. Los ejemplos más sencillos son la inserción de nops, guardar el valor de una variable, hacer operaciones matemáticas con ella para luego restaurar el valor original etc.[5]
  • Uso de predicados opacos. Un predicado es una expresión lógica que se evalúa a true o false, y que generalmente se usa para dirigir el flujo de un programa. Un predicado es opaco si su valor en tiempo de ejecución es conocido durante el proceso de ofuscación. Estos predicados son aprovechables para ofuscar porque un atacante que quiera ver como funciona el programa, no sabe en tiempo de compilación el valor que tendrá el predicado. De esta forma se generan más ramas en el flujo de control y se molesta en la ingeniería inversa.[5][3]​ Por ejemplo si tenemos un bloque de instrucciones A;B y el predicado opaco P que siempre va a ser TRUE. Podemos crear la secuencia de control equivalente "A;IF P THEN B ELSE C". De esta forma un análisis estático de código no puede saber que A y B se ejecutan siempre de forma consecutiva.[3]
  • Aplanado del flujo de control (en inglés control flow flattening). Consiste en modificar y reordenar los bloques básicos de un programa (basic block, BB) de forma que, en vez de tener en el CFG una estructura de decisión if-else típica en la que se sigue la ejecución a un BB o se salta a otro BB dependiendo del valor de los flags, se pasa a una estructura aplanada, en la que un BB llamado dispatcher decide a qué BB saltar en base al valor de una variable artificial. Cada BB de las ramas de decisión tiene el dispatcher como predecesor y sucesor, dificultando así averiguar la lógica del programa detrás del CFG aplanado.[5]
  • Desenroscado de bucles (en inglés loop unrolling). Consiste en transformaciones de código que evitan tener instrucciones de salto condicional y variables para emular bucles. Esta técnica, además de ser computacionalmente menos costosa, genera bloques de instrucciones muy parecidos entre ellos, lo que aumenta la confusión en el análisis estático del código.[5]
  • Inlining. Consiste en sustituir una llamada a un método por una copia del código del método.[4]
  • Outlining. Consiste en la creación artificial de métodos mediante secciones de código no relacionadas, las cuales añaden un nivel de fingida abstracción.[3]
  • Transformación de interpretación de tabla (en inglés table interpretation). Consiste en romper una secuencia de código en múltiples trozos pequeños y construir un bucle que a través de una secuencia de condiciones decide a cual de las secuencias de código se salta en cada momento.[6]

Técnicas de ofuscación de instrucciones

Consiste en sustituir la instrucción original por otra serie de instrucciones equivalentes más complicadas, generalmente mediante el uso de operaciones matemáticas. Por ejemplo Obfuscator-LLVM es una suit de compilación sobre LLVM que permite ofuscar el programa. [5]

Técnicas de ofuscación de layout

Buscan oscurecer y alterar la estructura léxica del software introduciendo cambios en el formato del código fuente. Por ejemplo renombrando variables o borrando información del debugger.[4]

Técnicas de ofuscación con virtualización de código

La virtualización de código, o ofuscación basada en máquina virtual (en inglés obfuscation VM-based), es un método para la ofuscación.[7]​ La técnica consiste en reemplazar instrucciones del programa con instrucciones virtuales con las que el atacante no está familiarizado. Posteriormente estas instrucciones serán traducidos a código de la máquina nativa en tiempo de ejecución para ser ejecutado por el hardware[7]

La ofuscación de código basada en máquinas virtuales de proceso se está convirtiendo en una técnica muy utilizada.[8]​ Se han creado varias herramientas que utilizan este tipo de ofuscación, como por ejemplo VMProtect, WProtect[9]​, Code Virtualizer y Themida.[8]​ En estas herramientas es frecuente que el código se ejecute en una máquina virtual que sea marcadamente diferente de las CPU tradicionales, y en las que el conjunto de comandos es diferente para cada archivo protegido.[10][11][9]

Técnicas de ofuscación de código intermedio

Algunos lenguajes, como por ejemplo Java, compilan a un lenguaje intermedio de bytecodes. Este código intermedio pueden ser fácilmente decompilado para así obtener casi el mismo código fuente original. Por diferentes motivos (ingeniería inversa, sabotajes, piratería de software....) a veces es necesario ofuscar el código intermedio para impedir la decompilación o hacer que esta obtenga un código incomprensible.[3]

Por ejemplo para los bytecodes de Java se usa las siguientes técnicas de ofuscación:[12]

  • Eliminar la información de depuración, como los nombres de las variables y la información del número de línea (ofuscación de layout).
  • Manipulación de nombres de variables, métodos, nombres de paquetes y clases (ofuscación de layout).
  • Codificación de literales de cadena y proporcione una función para decodificarlos (ofuscación de datos). Esto no afecta la salida final del ejecutable, pero el código descompilado se ve bastante feo y no es inmediatamente comprensible. Tal codificación se puede hacer para otros literales también como enteros y flotantes literales .
  • Introducir código que sea equivalente en funcionalidad pero que sea razonablemente más complicado haciendo uso de declaraciones goto, condiciones verdaderas irrazonables en las declaraciones, bucles expandidos con algunas declaraciones basura válidas entre ellas (ofuscación de flujo de control).
  • Insertar declaraciones no compilables en el código de bytes que no afectan la interpretación del código de bytes pero hace que fallen los descompiladores ya que no pueden descompilar dicho código defectuoso (ofuscación de flujo de control). La ejecución del código de bytes no se ve afectada debido a la inserción de este código defectuoso porque los intérpretes de código de bytes suelen estar muy relajados en la verificación de errores, suponiendo que el compilador ya hubiera hecho esa parte.
  • Insertar código extra no utilizado (ofuscación de flujo de control).
  • Utilizar sobrecarga de funciones y proporcionar el mismo nombre a todas las funciones con diferentes firmas(ofuscación de layout).
  • Cambiar la información del número de línea (ofuscación de layout). La información del número de línea está presente en bytecode para ayudar a depurar un programa y los decompiladores usan esta información para construir con mayor precisión el código fuente original. Entonces los ofuscadores destruyen esta información para confundir aún más a los descompiladores.

Aportando seguridad

Las técnicas de ofuscación también pueden servir para dar seguridad. Por ejemplo, PointGuard es una extensión de GCC para proteger punteros. PointGuard cifra los valores de los punteros cuando estos están en memoria aplicando una XOR con una clave generada aleatoriamente cuando el proceso del programa arranca. Cuando un puntero se va a desreferenciar se descifra el valor del puntero, de esta forma, si un atacante consigue sobrescribir el valor del puntero, cuando este se desreferencie y por PointGuard se descifre, el atacante estará accediendo a una dirección de memoria aleatoria, y muy posiblemente si el acceso no es válido hará que el programa falle, frustrando así la explotación del programa.[5]

Herramientas

Hay multitud de herramientas para ofuscar, cada una aplicable a un lenguaje distintos. Ejemplos de este tipo de herramientas son:

  • Para bytecodes java: Proguard, Javaguard, Retroguard, Jobfuscate, Jshrink, Jzipper, Marvin Obfuscator, Smokescreen, Yguard, Zelix KlassMaster, CafeBabe.[3]
  • Para ofuscar javascript: Thicket, Jasob 2, Javascript Obfuscator, Stunnix JavaScript Obfuscator, JCE Pro, Scripts Encryptor (ScrEnc), Shane Ng’s GPL-licenced obfuscator, Dean Edwards JavaScript Compressor/Obfuscator, ESC, Jammer, JSCruncher Pro, Strong JS, JavaScript Scrambler, Javascript Encoder from scriptasylum.com.[13]
  • Para .NET: pc-guard-net64, Phoenix Protector, obfuscar, Dotfuscator
  • Para python: pyobfuscate, Intensio-Obfuscator, OBFAU3 (Autoit-Obfuscator).
  • Para scripts de PHP: HideMyPHP.

Otros objetivos

La ofuscación puede servir para otros propósitos. Los médicos han sido acusados de usar una jerga para encubrir hechos desagradables de un paciente. El autor y doctor Michael Crichton ha afirmado que la escritura médica es un "intento altamente capacitado y calculado de confundir al lector". [1] De forma similar, el lenguaje basado en texto, como gyaru-moji y algunas formas de leet speak es ofuscado para hacerlo incomprensible a terceras personas.

Referencias

  1. Ofuscación de código: te reto a que entiendas este programa. robert. Universitat Oberta de Catalunya. 26 de octubre de 2015
  2. Metodologías de ofuscación de código de malware para evasión de antivirus. Alisa Esage. noticiasseguridad.com
  3. Estudio y Prueba de una Métrica para los Ofuscadores de Java. Ángel Miralles Arévalo. Proyecto Fin de Carrera. Universidad de Sevilla. Mayo de 2005
  4. Estudio de técnicas de inserción de marcas de agua sobre software. Marc Jáimez Moruno. Universidad Politécnica de Catalunya. 10 de junio de 2008
  5. Crea un binario ilegible con estas técnicas. Irene Díez. deusto.es. 23 de junio de 2017
  6. Reversing: secrets of reverse Engineering. Eldad Eilam. Ed. Wiley. 1 de abril de 2005
  7. Enhance virtual-machine-based code obfuscation security through dynamic bytecode scheduling. Kaiyuan Kuang et ali. 29 de marzo de 2017. Elsevier
  8. VMGuards: A Novel Virtual Machine Based Code Protection System with VM Security as the First Class Design Concern. Zhanyong Tang et ali. mdpi.com. 12 de Mayo de 2018
  9. Explained: Packer, Crypter, and Protector. Pieter Arntz. malwarebytes.com. 27 de marzo de 2017
  10. Five Reasons To Use VMProtect
  11. Code Virtualizer Overview
  12. Code Obfuscation
  13. Lista de ofuscadores para Javascript. Luis sentidoweb.com. 11 de octubre de 2006

Enlaces externos

  • Competición de código ofuscado en C
  • Protección en línea de librerías javascript (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
  • - Ofuscador de Código PHP online
  • Análisis de ofuscación de código en Javscript
  •   Datos: Q2616305

ofuscación, ofuscación, refiere, encubrir, significado, comunicación, haciéndola, más, confusa, complicada, interpretar, Índice, informática, motivación, ejemplos, técnicas, técnicas, ofuscación, diseño, técnicas, ofuscación, datos, técnicas, ofuscación, flujo. La ofuscacion se refiere a encubrir el significado de una comunicacion haciendola mas confusa y complicada de interpretar Indice 1 Informatica 1 1 Motivacion 1 2 Ejemplos 1 3 Tecnicas 1 3 1 Tecnicas de ofuscacion del diseno 1 3 2 Tecnicas de ofuscacion de datos 1 3 3 Tecnicas de ofuscacion de flujo de control 1 3 4 Tecnicas de ofuscacion de instrucciones 1 3 5 Tecnicas de ofuscacion de layout 1 3 6 Tecnicas de ofuscacion con virtualizacion de codigo 1 4 Tecnicas de ofuscacion de codigo intermedio 1 5 Aportando seguridad 1 6 Herramientas 2 Otros objetivos 3 Referencias 4 Enlaces externosInformatica EditarEn computacion la ofuscacion se refiere al acto deliberado de realizar un cambio no destructivo ya sea en el codigo fuente de un programa informatico en el codigo intermedio bytecodes o en el codigo maquina cuando el programa esta en forma compilada o binaria Es decir se cambia el codigo se enrevesa manteniendo el funcionamiento original para dificultar su entendimiento De esta forma se dificulta los intentos de ingenieria inversa y desensamblado que tienen la intencion de obtener una forma de codigo fuente cercana a la forma original A las herramientas que realizan procesos de ofuscacion se les llama ofuscadores Los ofuscadores pueden actuar sobre el codigo fuente sobre el codigo objeto o sobre ambos Como un efecto lateral la ofuscacion en ocasiones hace que los programas resultantes sean mas pequenos aunque puede hacer que los programas sean mas grandes en otros casos Algunos lenguajes tienden mas a la ofuscacion que otros C C y Perl son los mas citados como facilmente ofuscables Las macros de preprocesador son usadas a menudo para crear codigo complicado de leer enmascarando la gramatica y sintaxis estandar del lenguaje del cuerpo principal de codigo Ademas a veces tambien se puede buscar que el codigo fuente resulte una obra de ascii art Existen otros programas ofuscados llamados quine que al ejecutarse la salida debe ser el codigo fuente del programa Motivacion Editar La motivacion inmediata de la ofuscacion es dificultar el entendimiento del codigo y por tanto dificultar la ingenieria inversa El motivo original puede ser por 1 Por seguridad No queremos que un atacante comprenda el funcionamiento del codigo para que no lo altere con malos propositos Por ejemplo si un programa contiene un control de licencias nos puede interesar que nadie lo modifique para saltarse dicho control O bien nos puede interesar que un software cliente no envie peticiones malintencionadas al servidor Hay que tener en cuenta que esto solo consigue seguridad por oscuridad el sistema es seguro simplemente porque nadie sabe como funciona Pero si alguien consigue entender su funcionamiento mediante el analisis toda la seguridad se va al traste Por tanto usar ofuscacion con este proposito solo tiene sentido como medida adicional para poner las cosas mas dificiles a un atacante porque no es infalible en absoluto Ocultar codigo malicioso Esta ocultacion se realiza en dos ambitos 2 Dificulta la ingenieria inversa estatica de malware haciendo mas dificil encontrar las secciones de codigo mas importante Hace que las firmas estaticas utilizadas por los vendedores de antivirus no puedan detectar malware ya que las firmas se basan en secuencias de bytes especificas en el binario Proteccion de la propiedad intelectual Quizas no quieres que tu competencia copie cierto algoritmo que has utilizado Como efecto colateral de otros procesos Un ejemplo es la minificacion la transformacion del codigo fuente de un programa con el proposito de reducir el numero de bytes que ocupa En lenguajes interpretados como JavaScript esto reduce el espacio de almacenamiento y el tiempo necesario para descargar un script por Internet Tambien hay quien dice que la optimizacion de codigo de un compilador consigue en cierto modo un cierto nivel de ofuscacion al modificar el programa para mejorar su rendimiento Pura diversion Entender como funciona un programa ofuscado es como un rompecabezas y un programa dificil de entender puede llegar a ser una obra de arte Por ejemplo el lenguaje de programacion esoterico Brainfuck fue disenado especificamente para hacer dificil la comprension de sus programas Y hay un concurso muy popular el IOCCC International Obfuscated C Code Contest cuyo proposito es concebir un programa util de la forma mas incomprensible posible Evitar o dificultar la decompilacion Algunos lenguajes como por ejemplo Java compilan a un lenguaje intermedio de bytecodes Este codigo intermedio puede ser facilmente decompilado debido a que el bytecode contiene gran parte de la informacion del codigo fuente original Para diferentes motivos ingenieria inversa sabotajes pirateria de software a veces es necesario ofuscar el codigo intermedio para impedir la decompilacion o que esta obtenga un codigo incomprensible 3 Ejemplos Editar Un ejemplo simple de ofuscacion es llamar a las variables o funciones con palabras reservadas del lenguaje anadiendo algun simbolo int int Con esta linea se define una variable de tipo entero long int int int int return int int Con esta linea definimos una funcion con un parametro entero que devuelve un valor long int que por otra parte siempre sera 0 int int Esto equivale a poner 0 int int Esto equivale a poner 1 int int lt lt int int lt lt int int lt lt int int int int lt lt int int Esto equivale a poner 10 Tecnicas Editar Hay distintas tecnicas para realizar ofuscacion Estas tecnicas se pueden clasificar segun se aplican al diseno a datos a instrucciones o al flujo de control del programa 4 5 Tecnicas de ofuscacion del diseno Editar Algunas de las tecnicas de ofuscacion de diseno son Union de clases en ingles class merging Se usa en lenguajes orientados a objetos y consiste en la union de una o mas clases del programa en una sola clase 4 Division de clases en ingles class splitting Se usa en lenguajes orientados a objetos y consiste en dividir una clase de un determinado programa en varias clases 4 Tipos ocultos en ingles type hiding Se usan en lenguajes orientados a objetos y consiste en utilizar los interfaces para oscurecer le intencion final del diseno del programa 4 Tecnicas de ofuscacion de datos Editar Estas tecnicas se basan en aplicar diversas transformaciones a las variables las constantes y las estructuras que forman parte de un programa 4 Algunas de las ofuscaciones de datos son Cegar constantes en ingles constant blinding En lugar de tener un valor en claro como constante esta tecnica sustituye los valores de las constantes generalmente mediante una XOR con un valor aleatorio por datos aparentemente sin sentido 5 Cambio de la codificacion de las variables Cambiando la codificacion de las variables se busca ocultar el valor original de la variable por ejemplo podemos cambiar la codificacion de un string por su valor equivalente en otra codificacion por ejemplo codificacion a Base64 o a un cifrado sencillo mediante XOR ROT13 etc 5 Conversion de datos estaticos en procesos Consiste en conviertir un dato en un proceso que generara ese mismo dato 4 Cambio del tiempo de vida de variables Consiste en convertir variable global en variable s local es 4 Agregacion de variables en ingles merging variable Consiste en agrupar variables en estructuras mas complejas por ejemplo juntando enteros en un mismo struct 5 Separacion de variables en ingles splitting variable En contraposicion a la agregacion de variables la separacion de variables consiste en dividir las variables en unidades mas pequenas por ejemplo transformando un int de 4 bytes en dos shorts de 2 bytes 5 Agregacion de arrays en ingles merging array Consiste en agrupar varios arrays en uno solo 4 Separacion de arrays en ingles splitting array Consiste en dividir arrays y representar un unico array mediante varios de ellos 4 Aplanamiento de arrays en ingles flatten array Consiste en utilizar una variable de array de menor dimension para representar un array de mayor dimension 4 Despliegue de arrays en ingles fold array Consiste en utilizar una variable de array de mayor dimension para representar un array de menor dimension 4 Tecnicas de ofuscacion de flujo de control Editar Consisten en una serie de transformaciones que alteran el flujo de ejecucion de un programa El flujo de ejecucion de un programa se puede representar por un grafo de control de flujo CFG en el que los nodos son los bloques basicos de ejecucion del programa y las aristas son los saltos entre bloques basicos de ejecucion conjuntos de instrucciones que se ejecutan secuencialmente en los que la primera instruccion es el unico acceso al bloque y la ultima instruccion es la unica de salida 4 Algunas de las ofuscaciones de control de flujo son Insercion de codigo muerto en ingles dead code insertion Consiste en insertar codigo en el programa que no aporta funcionalidad Los ejemplos mas sencillos son la insercion de nops guardar el valor de una variable hacer operaciones matematicas con ella para luego restaurar el valor original etc 5 Uso de predicados opacos Un predicado es una expresion logica que se evalua a true o false y que generalmente se usa para dirigir el flujo de un programa Un predicado es opaco si su valor en tiempo de ejecucion es conocido durante el proceso de ofuscacion Estos predicados son aprovechables para ofuscar porque un atacante que quiera ver como funciona el programa no sabe en tiempo de compilacion el valor que tendra el predicado De esta forma se generan mas ramas en el flujo de control y se molesta en la ingenieria inversa 5 3 Por ejemplo si tenemos un bloque de instrucciones A B y el predicado opaco P que siempre va a ser TRUE Podemos crear la secuencia de control equivalente A IF P THEN B ELSE C De esta forma un analisis estatico de codigo no puede saber que A y B se ejecutan siempre de forma consecutiva 3 Aplanado del flujo de control en ingles control flow flattening Consiste en modificar y reordenar los bloques basicos de un programa basic block BB de forma que en vez de tener en el CFG una estructura de decision if else tipica en la que se sigue la ejecucion a un BB o se salta a otro BB dependiendo del valor de los flags se pasa a una estructura aplanada en la que un BB llamado dispatcher decide a que BB saltar en base al valor de una variable artificial Cada BB de las ramas de decision tiene el dispatcher como predecesor y sucesor dificultando asi averiguar la logica del programa detras del CFG aplanado 5 Desenroscado de bucles en ingles loop unrolling Consiste en transformaciones de codigo que evitan tener instrucciones de salto condicional y variables para emular bucles Esta tecnica ademas de ser computacionalmente menos costosa genera bloques de instrucciones muy parecidos entre ellos lo que aumenta la confusion en el analisis estatico del codigo 5 Inlining Consiste en sustituir una llamada a un metodo por una copia del codigo del metodo 4 Outlining Consiste en la creacion artificial de metodos mediante secciones de codigo no relacionadas las cuales anaden un nivel de fingida abstraccion 3 Transformacion de interpretacion de tabla en ingles table interpretation Consiste en romper una secuencia de codigo en multiples trozos pequenos y construir un bucle que a traves de una secuencia de condiciones decide a cual de las secuencias de codigo se salta en cada momento 6 Tecnicas de ofuscacion de instrucciones Editar Consiste en sustituir la instruccion original por otra serie de instrucciones equivalentes mas complicadas generalmente mediante el uso de operaciones matematicas Por ejemplo Obfuscator LLVM es una suit de compilacion sobre LLVM que permite ofuscar el programa 5 Tecnicas de ofuscacion de layout Editar Buscan oscurecer y alterar la estructura lexica del software introduciendo cambios en el formato del codigo fuente Por ejemplo renombrando variables o borrando informacion del debugger 4 Tecnicas de ofuscacion con virtualizacion de codigo Editar La virtualizacion de codigo o ofuscacion basada en maquina virtual en ingles obfuscation VM based es un metodo para la ofuscacion 7 La tecnica consiste en reemplazar instrucciones del programa con instrucciones virtuales con las que el atacante no esta familiarizado Posteriormente estas instrucciones seran traducidos a codigo de la maquina nativa en tiempo de ejecucion para ser ejecutado por el hardware 7 La ofuscacion de codigo basada en maquinas virtuales de proceso se esta convirtiendo en una tecnica muy utilizada 8 Se han creado varias herramientas que utilizan este tipo de ofuscacion como por ejemplo VMProtect WProtect 9 Code Virtualizer y Themida 8 En estas herramientas es frecuente que el codigo se ejecute en una maquina virtual que sea marcadamente diferente de las CPU tradicionales y en las que el conjunto de comandos es diferente para cada archivo protegido 10 11 9 Tecnicas de ofuscacion de codigo intermedio Editar Algunos lenguajes como por ejemplo Java compilan a un lenguaje intermedio de bytecodes Este codigo intermedio pueden ser facilmente decompilado para asi obtener casi el mismo codigo fuente original Por diferentes motivos ingenieria inversa sabotajes pirateria de software a veces es necesario ofuscar el codigo intermedio para impedir la decompilacion o hacer que esta obtenga un codigo incomprensible 3 Por ejemplo para los bytecodes de Java se usa las siguientes tecnicas de ofuscacion 12 Eliminar la informacion de depuracion como los nombres de las variables y la informacion del numero de linea ofuscacion de layout Manipulacion de nombres de variables metodos nombres de paquetes y clases ofuscacion de layout Codificacion de literales de cadena y proporcione una funcion para decodificarlos ofuscacion de datos Esto no afecta la salida final del ejecutable pero el codigo descompilado se ve bastante feo y no es inmediatamente comprensible Tal codificacion se puede hacer para otros literales tambien como enteros y flotantes literales Introducir codigo que sea equivalente en funcionalidad pero que sea razonablemente mas complicado haciendo uso de declaraciones goto condiciones verdaderas irrazonables en las declaraciones bucles expandidos con algunas declaraciones basura validas entre ellas ofuscacion de flujo de control Insertar declaraciones no compilables en el codigo de bytes que no afectan la interpretacion del codigo de bytes pero hace que fallen los descompiladores ya que no pueden descompilar dicho codigo defectuoso ofuscacion de flujo de control La ejecucion del codigo de bytes no se ve afectada debido a la insercion de este codigo defectuoso porque los interpretes de codigo de bytes suelen estar muy relajados en la verificacion de errores suponiendo que el compilador ya hubiera hecho esa parte Insertar codigo extra no utilizado ofuscacion de flujo de control Utilizar sobrecarga de funciones y proporcionar el mismo nombre a todas las funciones con diferentes firmas ofuscacion de layout Cambiar la informacion del numero de linea ofuscacion de layout La informacion del numero de linea esta presente en bytecode para ayudar a depurar un programa y los decompiladores usan esta informacion para construir con mayor precision el codigo fuente original Entonces los ofuscadores destruyen esta informacion para confundir aun mas a los descompiladores Aportando seguridad Editar Las tecnicas de ofuscacion tambien pueden servir para dar seguridad Por ejemplo PointGuard es una extension de GCC para proteger punteros PointGuard cifra los valores de los punteros cuando estos estan en memoria aplicando una XOR con una clave generada aleatoriamente cuando el proceso del programa arranca Cuando un puntero se va a desreferenciar se descifra el valor del puntero de esta forma si un atacante consigue sobrescribir el valor del puntero cuando este se desreferencie y por PointGuard se descifre el atacante estara accediendo a una direccion de memoria aleatoria y muy posiblemente si el acceso no es valido hara que el programa falle frustrando asi la explotacion del programa 5 Herramientas Editar Hay multitud de herramientas para ofuscar cada una aplicable a un lenguaje distintos Ejemplos de este tipo de herramientas son Para bytecodes java Proguard Javaguard Retroguard Jobfuscate Jshrink Jzipper Marvin Obfuscator Smokescreen Yguard Zelix KlassMaster CafeBabe 3 Para ofuscar javascript Thicket Jasob 2 Javascript Obfuscator Stunnix JavaScript Obfuscator JCE Pro Scripts Encryptor ScrEnc Shane Ng s GPL licenced obfuscator Dean Edwards JavaScript Compressor Obfuscator ESC Jammer JSCruncher Pro Strong JS JavaScript Scrambler Javascript Encoder from scriptasylum com 13 Para NET pc guard net64 Phoenix Protector obfuscar Dotfuscator Para python pyobfuscate Intensio Obfuscator OBFAU3 Autoit Obfuscator Para scripts de PHP HideMyPHP Otros objetivos EditarLa ofuscacion puede servir para otros propositos Los medicos han sido acusados de usar una jerga para encubrir hechos desagradables de un paciente El autor y doctor Michael Crichton ha afirmado que la escritura medica es un intento altamente capacitado y calculado de confundir al lector 1 De forma similar el lenguaje basado en texto como gyaru moji y algunas formas de leet speak es ofuscado para hacerlo incomprensible a terceras personas Referencias Editar Ofuscacion de codigo te reto a que entiendas este programa robert Universitat Oberta de Catalunya 26 de octubre de 2015 Metodologias de ofuscacion de codigo de malware para evasion de antivirus Alisa Esage noticiasseguridad com a b c d e f Estudio y Prueba de una Metrica para los Ofuscadores de Java Angel Miralles Arevalo Proyecto Fin de Carrera Universidad de Sevilla Mayo de 2005 a b c d e f g h i j k l m n Estudio de tecnicas de insercion de marcas de agua sobre software Marc Jaimez Moruno Universidad Politecnica de Catalunya 10 de junio de 2008 a b c d e f g h i j k Crea un binario ilegible con estas tecnicas Irene Diez deusto es 23 de junio de 2017 Reversing secrets of reverse Engineering Eldad Eilam Ed Wiley 1 de abril de 2005 a b Enhance virtual machine based code obfuscation security through dynamic bytecode scheduling Kaiyuan Kuang et ali 29 de marzo de 2017 Elsevier a b VMGuards A Novel Virtual Machine Based Code Protection System with VM Security as the First Class Design Concern Zhanyong Tang et ali mdpi com 12 de Mayo de 2018 a b Explained Packer Crypter and Protector Pieter Arntz malwarebytes com 27 de marzo de 2017 Five Reasons To Use VMProtect Code Virtualizer Overview Code Obfuscation Lista de ofuscadores para Javascript Luis sentidoweb com 11 de octubre de 2006Enlaces externos EditarCompeticion de codigo ofuscado en C Proteccion en linea de librerias javascript enlace roto disponible en Internet Archive vease el historial la primera version y la ultima The International Obfuscated C Code Contest Concurso internacional de codigo en C ofuscado Como proteger codigo en Java por medio de la ofuscacion de codigo Ofuscador de Codigo PHP online FOPO Free Online PHP Obfuscator Analisis de ofuscacion de codigo en Javscript Datos Q2616305Obtenido de https es wikipedia org w index php title Ofuscacion amp oldid 133914540 Inform C3 A1tica, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos