Skip to content

Ingeniería inversa

ingeniería inversa
Ingeniería concurrente
Es el proceso de construcción de especificaciones de un nivel más alto de abstracción del código fuente de un sistema de software o de cualquier otro producto (cualquier otro elemento de diseño puede ser utilizado como punto de partida. Estas especificaciones pueden reutilizarse para construir una nueva implementación del sistema utilizando, por ejemplo, técnicas de ingeniería directa.

¿Qué es la ingeniería a la inversa?

La ingeniería inversa es el proceso de descubrimiento de los principios tecnológicos de un objeto, herramienta, dispositivo o sistema, a través del razonamiento abductivo (haciendo suposiciones) de su estructura, función y funcionamiento.

En otras palabras, se trata de tomar algo, por ejemplo un dispositivo mecánico o electrónico, para analizar su funcionamiento en detalle, con el objetivo de crear un dispositivo que haga la misma o similar tarea sin copiar los detalles del original.

Chifofsky lo definió como “El análisis de un sistema para identificar sus componentes actuales y las dependencias que existen entre ellos, para extraer y crear abstracciones de ese sistema y la información de su diseño”.

Ingeniería inversa tipos

  • De datos: Se aplica en algún código de base de datos (aplicación, código SQL, etc.) para obtener los modelos relacionales o en el modelo relacional para obtener el diagrama entidad-relación
  • Lógica o proceso: Cuando se aplica la ingeniería inversa en el código de un programa para averiguar su lógica o en cualquier documento de diseño para obtener documentos de análisis o de requisitos.
  • Interfaces de usuario: Se aplica con el objetivo de mantener la lógica interna del programa para obtener los modelos y especificaciones que sirvieron de base para su construcción, con el fin de tomarlos como punto de partida en procesos de ingeniería directa que permitan la modificación de dicha interfaz.

Ingeniería inversa herramientas

Los depuradores

Un depurador es un programa que se usa para controlar otros programas. Permite recorrer el código, rastrear fallos, establecer puntos de control y observar las variables y el estado de la memoria en cualquier momento del programa que se está depurando. Los depuradores son muy valiosos para determinar el flujo lógico del programa.

Un punto de interrupción es una instrucción para el depurador que permite detener la ejecución del programa cuando se cumple una determinada condición. Por ejemplo, cuando un programa accede a una determinada variable o llama a una determinada función de la API, el depurador puede detener la ejecución del programa.

Depuradores de Windows

  • OllyDbg → es un poderoso depurador con un motor integrado de ensamblaje y desensamblaje. Tiene muchas otras características, incluyendo un precio de 0$. Muy útil para parchear, desensamblar y depurar.
  • WinDBG → es un software gratuito de Microsoft que puede ser usado para la depuración local en el modo de usuario, o incluso la depuración remota en el modo de Kernel.

Inyección de Bugs

Las herramientas que pueden proporcionar una entrada mal formateada e incorrecta a los procesos de software de destino para causar errores son una clase de herramientas de inserción de fallas. Los errores de programa pueden ser analizados para determinar si los errores existen en el software de destino. Algunos fallos tienen implicaciones de seguridad, como los fallos que permiten el acceso directo del asaltante a la computadora central o a la red.

Hay herramientas de inyección de errores basadas en el host que funcionan como depuradores y pueden alterar las condiciones del programa para observar los resultados y también hay inyectores basados en la red que manipulan el tráfico de la red para determinar el efecto en el dispositivo receptor. Desensambladores

Es una herramienta que convierte el código de la máquina en lenguaje ensamblador. El lenguaje ensamblador es una forma legible por el hombre del código máquina. Los desensambladores revelan qué instrucciones de la máquina se usan en el código. El código máquina es usualmente específico para una arquitectura de hardware dada. Así que los desensambladores son escritores expresamente para la arquitectura de hardware del software a ser desensamblado.

Ejemplos de desensambladores

  • IDA Pro → es un desensamblador profesional extremadamente poderoso. La parte mala es su alto precio.
  • PE Explorer → es un desensamblador que “se centra en la facilidad de uso, claridad y navegación”. No es tan completo como IDA Pro, pero tiene un precio más bajo.
  • IDA Pro Freeware 4.1 → se comporta casi como IDA Pro, pero sólo desensambla el código para los procesadores Intel x86 y sólo funciona en Windows.
  • Desensamblador Bastardo → es un desensamblador poderoso y programable para Linux y FreeBSD.
  • Ciasdis → esta herramienta basada en Forth permite construir conocimiento sobre un cuerpo de código de una manera interactiva e incremental. Es único en el sentido de que todo el código desensamblado puede ser reensamblado exactamente en el mismo código.

Compiladores inversos o descompiladores

Un descompilador es una herramienta que transforma el código ensamblador o el código máquina en código fuente de lenguaje de alto nivel. También hay descompiladores que transforman el código del lenguaje intermedio en código fuente del lenguaje de alto nivel. Estas herramientas son extremadamente útiles para determinar la lógica a un nivel superior como bucles o declaraciones if-then de los programas que son descompilados. Los descompiladores son similares a los desensambladores pero llevan el proceso un importante paso adelante.

Ejemplos de descompiladores

  • El Descompilador DCC → es una aproximación teórica exacta a la descompilación, pero el descompilador sólo soporta programas MSDOS.
  • El Proyecto Descompilador Boomerang → es un intento de construir un poderoso descompilador para varias máquinas y lenguajes.
  • Reverse Engineering Compiler (REC) → es un poderoso “descompilador” que descompila el código ensamblador en una representación del código de tipo C. El código está a medio camino entre el ensamblado y C, pero es mucho más legible que el ensamblado puro.

Las herramientas CASE

Las herramientas de Ingeniería de Sistemas Asistida por Ordenador (CASE) aplican la tecnología informática a las actividades, técnicas y metodologías de desarrollo de sistemas para automatizar o apoyar una o más fases del ciclo de vida del desarrollo de sistemas.

En el caso de la ingeniería inversa, este tipo de herramientas suele incluir una o más de las anteriores junto con otras que mejoran el rendimiento y la eficiencia.

Ingeniería inversa ventajas

La aplicación de ingeniería inversa nunca cambia la funcionalidad del software, pero permite obtener productos que indican cómo se ha construido el software. Permite obtener los siguientes beneficios:

  • Reducción de la complejidad del sistema: al tratar de comprender el software, se facilita su mantenimiento y se reduce la complejidad existente.
  • Generar diferentes alternativas: desde el punto de partida del proceso, principalmente el código fuente, se generan representaciones gráficas que facilitan la comprensión.
  • Recuperar y/o actualizar la información perdida (cambios que no fueron documentados en su momento): en la evolución del sistema se realizan cambios que no suelen actualizarse en las representaciones de mayor nivel de abstracción, para lo cual se utiliza la recuperación de diseños.
  • Detectar efectos laterales: los cambios que se pueden realizar en un sistema pueden provocar efectos no deseados. Esta serie de anomalías pueden ser detectadas mediante ingeniería inversa.
  • Facilitar la reutilización: mediante la ingeniería inversa se pueden detectar los componentes de una posible reutilización de los sistemas existentes, con lo que se aumenta la productividad y se reducen los costos y riesgos de mantenimiento.
  • El propósito de la ingeniería inversa es desentrañar los misterios y secretos de los sistemas en uso a partir del código. Para ello se utilizan una serie de herramientas que extraen información de los datos, procedimientos y arquitectura del sistema existente.