Ofuscación de código - norman-ipn/Ofuscador GitHub Wiki

Ofuscación de código

En del desarrollo de software, ofuscación se refiere a generar código útil o funcional que además resulta difícil de comprender para una persona. El objetivo de la ofuscación puede ser ocultar el propósito o el funcionamiento del código para tener un grado de seguridad, complicar intentos de ingeniería inversa, etc.

En la ofuscación se ocupan diversos métodos que se pueden clasificar por la información que alteran de la siguiente manera:

  • Ofuscación del diseño: Se ocupa de la disposición o diseño del código, como el formato del código, nombres de variables y comentarios
  • Ofuscación de datos: Altera las estructuras de datos empleadas por el programa. Puede ser cambiando la ubicación de almacenamiento, el orden, la forma de agrupación, etc.
  • Ofuscación de control: Modifica el flujo del programa, e.g. estructuras de control, orden de ejecución, código inútil.
  • Prevención de transformación: Procura que el código ofuscado sea más difícil de romper, particularmente por desofuscadores (otros programas)

Entre los parámetros para evaluar la calidad de un método de ofuscación destacan:

  • Potencia: Qué tan complicado es el código resultante
  • Resistencia: Qué tan difícil es para un desofuscador automatizado romper el código
  • Sigilo: Qué tan bien se mezcla con el resto del código (i.e. ¿pasa desapercibido?)
  • Costo: A comparación del código original, cómo se comparan los recursos que consume su ejecución

Estrategias

Para el caso específico del código en lenguaje C, existen ya algunas estrategias de ofuscación, como declarar y emplear constantes en lugar de fragmentos de código, remover/agregar espacios o saltos de línea de forma aleatoria, etc.

Propuestas para el desarrollo del ofuscador

Para poder ofuscar un código fuente es necesario comprender la estructura del mismo, no basta con conocer algunos de los elementos que lo componen. Por esto, las expresiones regulares (y con ellas, el trabajo realizado en la primer práctica) quedan cortas para desarrollar un ofuscador automatizado en la mayoría de las técnicas de ofuscación. De los temas que hemos visto en la materia, el más adecuado a aplicar es el de Gramáticas Libres de Contexto, ya que es mucho más poderoso. Un ejemplo claro es el de decidir si un conjunto de juegos de paréntesis anidados y/o concatenados es válido. Este ejercicio no puede ser completado únicamente con expresiones regulares (hasta donde tengo entendido).

Propongo como primer tarea a realizar el describir al lenguaje C en gramáticas libres, para posteriormente idear maneras de modificar algunos de sus elementos para hacer confuso el código.

Me parece que con el ejemplo que mencionas (juego de paréntesis), ya nos estaríamos refiriendo a corrección de código. A mi se me ocurre usar las gramáticas para identificar el inicio y el fin de las funciones, sin embargo, considero que si podemos apoyarnos de la práctica 1 para realizar el proyecto, y que, no es necesario describir el lenguaje c completo ahora en gramáticas.

El profesor menciono que casi todos los proyectos funcionaran con un archivo flex y otro bison, por lo cual, no deberíamos excluir a las expresiones regulares.