Ilustración de una persona trabajando en un ordenador con código en la pantalla. El título "Ingeniería Inversa: ¿Qué es y para qué sirve?" se superpone a la imagen.
Descubre qué es la ingeniería inversa y cómo se aplica en diferentes campos.

Ingeniería Inversa: ¿Qué es y Para qué Sirve?

Si de niño te gustaba desmontar juguetes, es posible que seas un experto nato en ingeniería inversa, pero aún no lo sepas. Porque hacen aproximadamente lo mismo, solo que en lugar de juguetes, ellos tienen programas y tecnología, y en lugar de un martillo y un destornillador, usan aplicaciones especiales.

Te explicamos los fundamentos de la ingeniería inversa y te mostramos cómo los especialistas en ciberseguridad analizan los virus. Al final del artículo, intentaremos desmontar un sencillo programa en C++ para que puedas entender cómo se ve este proceso desde dentro.

Te advertimos: lo que vas a aprender ahora puede provocar la tentación de pasarte al lado oscuro. No lo hagas: es mejor que te conviertas en un hacker blanco y ayudes a las empresas a combatir la ciberdelincuencia.

¿Qué es la ingeniería inversa?

Imagina que trabajas como programador en una empresa que fabrica coches autónomos. Tu jefe de desarrollo te dice: “Hemos conseguido un prototipo del programa de nuestro principal competidor. Aquí tienes un archivo en formato EXE. ¿Puedes averiguar cómo funciona?“. ¿Qué harías?

Resolver el problema no es tan sencillo si piensas en la programación convencional (directa). Esta consiste en:

  1. El programador escribe código en un lenguaje que entiende, como Java, Python o C++.
  2. Luego, entrega el archivo al compilador, que convierte el código de un formato legible para humanos a un archivo binario para que lo pueda leer la computadora.
  3. El usuario descarga el programa compilado, por ejemplo, en el formato EXE mencionado, y lo ejecuta en su computadora.

El archivo binario, o como también se le llama, archivo ejecutable, es un conjunto de ceros y unos, código máquina. Una persona normal no podrá leerlo, y por lo tanto, entender el funcionamiento del programa.

Para no quedarse atascado en estas situaciones, se inventó la ingeniería inversa. La palabra “inversa” significa que el proceso de desarrollo se realiza al revés: es decir, el archivo binario se traduce de nuevo a un formato legible para humanos. Así es como funciona:

  1. El desarrollador recibe un archivo binario que solo entiende la computadora.
  2. Luego, pasa este archivo a través de un programa especial y lo convierte en código en un lenguaje de programación que conoce.
  3. A continuación, el programador estudia este archivo e intenta comprender el funcionamiento interno del programa.

El proceso de ingeniería inversa puede parecer sencillo, pero es una ilusión. Incluso los expertos en desarrollo inverso pueden analizar el mismo programa durante meses. Y no hay garantía de que se pueda descifrar completamente.

¿Por qué se necesita la ingeniería inversa?

Con la ingeniería inversa podemos comprender cómo funciona un programa, qué datos utiliza, a dónde y qué envía, así como cuáles son sus puntos débiles y cómo reacciona ante situaciones de emergencia. Todo esto nos ayudará a mejorar nuestro producto y superar a la competencia.

Aviso legal: Cabe mencionar que casi todos los desarrolladores prohíben descifrar el código de sus programas en el acuerdo de licencia. Por lo tanto, la ingeniería inversa debe utilizarse bajo tu propio riesgo o después de haberlo acordado previamente con las empresas proveedoras.

Captura de pantalla del desensamblador IDA Pro mostrando código de máquina ensamblado después de un proceso de ingeniería inversa.
Ejemplo de código de máquina desensamblado a través de ingeniería inversa usando IDA Pro. Así se ve el código de un programa que ha pasado por ingeniería inversa

Veamos algunos ejemplos más de áreas en las que es útil el desarrollo inverso:

  • Análisis de virus y búsqueda de vulnerabilidades. Los especialistas en ciberseguridad llevan mucho tiempo utilizando los métodos de ingeniería inversa para analizar software malicioso. Por ejemplo, pueden descargar virus a propósito, infectar sus ordenadores con ellos y averiguar cómo funcionan para luego desarrollar medios de protección.
  • Desarrollo de modificaciones para juegos. En el desarrollo de videojuegos, el desarrollo inverso permite crear modificaciones para juegos y cambiar el proceso del juego: añadir nuevas funciones y contenido. Por ejemplo, así se crearon las modificaciones para los juegos The Elder Scrolls V: Skyrim y Grand Theft Auto 5.
  • Estudio de tecnologías antiguas. A veces, la documentación original de las aplicaciones se pierde o el programa está escrito para ordenadores antiguos que ya no se fabrican. Por lo tanto, los desarrolladores tienen que recrear el código de las aplicaciones desde cero.

Métodos y etapas del diseño inverso: cómo hackear un programa

Bien, la ingeniería inversa es la ciencia de cómo convertir el código máquina en un lenguaje comprensible para los humanos. Ya hemos entendido esto. Pero, ¿cómo se realiza exactamente el desarrollo inverso? Hay tres maneras.

1️⃣ Traducir el archivo binario a código en un lenguaje de alto nivel. Para ello existen programas especiales: los desensambladores. Entienden cómo está organizado el código máquina y pueden traducirlo sin problemas a un lenguaje de programación cómodo para nosotros, como C++.

El único inconveniente del trabajo del desensamblador es que el código resultante a menudo carece de nombres de variables y comentarios, por lo que después del procedimiento, el desarrollador tendrá que pasar bastante tiempo para entender a qué se refieren los bloques de código individuales.

2️⃣ Traducir el archivo binario a código en lenguaje ensamblador. El ensamblador es un lenguaje de nivel ligeramente superior al código máquina, pero mucho más bajo que los JavaScript y Python que nos resultan familiares. Cualquier procesador puede trabajar con ensamblador, por lo que para un ordenador este método de descifrado de archivos binarios es el más sencillo.

Para leer el código escrito en ensamblador, hay que entender cómo funciona el procesador, qué comandos utiliza y cómo funciona en general. Por lo tanto, sin preparación será difícil analizar un programa.

3️⃣ Estudiar los datos que el programa transfiere a través de la red o dentro del ordenador. Normalmente, los programas intercambian datos a través de Internet o dentro del sistema operativo. Por lo tanto, para comprender cómo funciona un programa, los ingenieros inversos utilizan analizadores de red especiales.

Por ejemplo, existe un analizador de red integrado directamente en Google Chrome. Para abrirlo, debes acceder a las herramientas de desarrollo (tecla F12) y acceder a la pestaña “Red”.

Captura de pantalla de la pestaña "Network" en las herramientas de desarrollador de Google Chrome, mostrando una lista de solicitudes de red con detalles como nombre, estado, tipo, iniciador, tamaño y tiempo de respuesta.
Analizador de Red con la pestaña Network de Chrome DevTools.

Ahora que conocemos los principales métodos de desarrollo inverso, pasemos al propio proceso: las etapas de la ingeniería inversa. En total hay cuatro.

  1. Realizar una investigación preliminar. Primero hay que estudiar detenidamente el programa: pulsar todos los botones, utilizar todas las funciones. Esto ayudará a obtener una imagen completa del funcionamiento de la aplicación.
  2. Comenzar el desmontaje o desensamblado. Ahora debemos mirar dentro del programa y ver cómo está organizado. Para ello, aplicamos uno de los métodos de desarrollo inverso y luego estudiamos el código obtenido.
  3. Realizar el análisis. Una vez que hayamos entendido qué algoritmos y estructuras de datos hay en el programa, es hora de reunir todo. Estudiamos todas las partes e intentamos comprender cómo funcionan juntas. Por ejemplo, vemos en qué secuencia se ejecutan los métodos en el código y cómo la aplicación interactúa con el entorno externo.
  4. Crear la documentación. Una vez que hemos entendido todo, es hora de documentar la funcionalidad. Es necesario escribir qué hacen las funciones, qué variables aceptan y a dónde envían los datos. Y luego documentarlo todo cuidadosamente para que no surjan dudas sobre qué hacen las partes individuales del código.

Recordemos una vez más que el proceso puede llevar mucho tiempo. Y para entender cómo funciona un programa, necesitas tener experiencia en programación; de lo contrario, será difícil. Aunque vale la pena intentarlo.

Cómo dominar la ingeniería inversa: primeros pasos

Supongamos que has decidido probarte en el difícil camino de la ingeniería inversa. ¿Adónde ir, qué pulsar?

❗️ Queremos recordar que la piratería informática (hacking) es ilegal en ciertos países. Por ello, no te dediques al hacking, dedícate a la ciberseguridad.

Lo mejor es estudiar el desarrollo inverso en tus propios proyectos o resolver problemas en sitios web especiales, como Crackmes. De esta manera podrás mejorar tus habilidades de forma totalmente legal.

Lee también: +100 Sitios Web que te Enseñan Cómo Hackear Legalmente

Hay suficientes programas para ingeniería inversa. Algunos de ellos pueden resultarte familiares, como Cheat Engine. En general, es un programa para desarrollo inverso, pero también permite aumentar la moneda del juego en los Sims o GTA.

Captura de pantalla de la interfaz de usuario de Cheat Engine mostrando la ventana principal con opciones de escaneo de memoria, una tabla de direcciones y valores, y secciones para la visualización de memoria y opciones avanzadas.
Explora la potente interfaz de Cheat Engine para modificar juegos y aplicaciones. Descubre cómo funciona su sistema de escaneo de memoria.

Aquí tienes una lista de programas:

Como ejemplo, mostraremos cómo se ve el desarrollo inverso en el programa IDA Pro. Escribiremos el código “Hello, World” en C++, lo compilaremos e intentaremos descifrarlo con la aplicación.

Captura de pantalla que muestra un sencillo programa "Hello, World" escrito en C++ en un entorno de desarrollo integrado (IDE).
El clásico “Hello, World” en C++. Un programa simple pero fundamental para comenzar a aprender programación.

Abrimos el programa IDA Pro y vemos la primera pantalla. Aquí pulsamos el botón “New” para iniciar el proceso de desensamblado:

Captura de pantalla de la ventana de inicio de IDA Pro, mostrando las opciones "New" (desensamblar un nuevo archivo)
Aprende a iniciar IDA Pro y a elegir entre desensamblar un nuevo archivo o continuar con un proyecto existente.

A continuación, debemos cargar el archivo en el programa. Hay dos opciones: formato DLL o archivo binario. Necesitamos el primero:

Captura de pantalla del cuadro de diálogo de IDA Pro para cargar un nuevo archivo, mostrando la selección de un archivo DLL y las opciones de configuración para el proceso de carga y análisis.
Aprende a cargar un archivo DLL en IDA Pro y a configurar las opciones de análisis para una eficiente ingeniería inversa.

Listo, así es como se ve nuestro archivo desensamblado. Podemos estudiarlo y entender de qué elementos se compone.

Captura de pantalla del desensamblador IDA Pro mostrando el código de máquina desensamblado de un programa simple.
Visualiza el proceso de desensamblaje con IDA Pro. Observa cómo se traduce el código de máquina a instrucciones de ensamblador.

Primero llegamos a la pestaña “IDA View-A”. Aquí está el código del lenguaje ensamblador de nuestro programa traducido. Si nos fijamos bien, podemos ver la línea lea rdx, _Val ; "Hello, World". Muestra que estamos haciendo algo con la cadena “Hello, Workd”, o más concretamente, estamos intentando mostrarla en la consola. Pero esto es obvio para nosotros, porque el programa es sencillo. Si aquí hubiera, por ejemplo, el código del sistema operativo Windows, pensaríamos mucho tiempo.

Veamos qué hay en otras pestañas.

Captura de pantalla de la vista hexadecimal (Hex View) en IDA Pro, mostrando la representación en bytes del código máquina de un programa.
Examina el código máquina en su forma más pura: la vista hexadecimal en IDA Pro.

Esta es la pestaña “Hex View 1”. Aquí el código desensamblado se presenta en forma de símbolos hexadecimales, es decir, comprensibles para el ordenador. Si entiendes el lenguaje de ceros y unos, puedes obtener información útil aquí, por ejemplo, encontrar comandos repetidos o algunos datos interesantes.

Por cierto, fíjate en las funciones de la izquierda. También pueden proporcionar mucha información útil:

Captura de pantalla de IDA Pro mostrando dos paneles: uno con una lista de funciones y sus direcciones de inicio, y otro con el código desensamblado de una función específica.
Explora la poderosa interfaz de IDA Pro para analizar el código binario. Identifica funciones, analiza el flujo de ejecución y comprende el funcionamiento interno del programa.

Por ejemplo, a partir de estas funciones se puede entender qué llamadas al sistema realiza el programa. Sin embargo, los nombres de estas llamadas no son del todo evidentes, por lo que a menudo hay que buscar en Google para qué sirven.

Vamos a la siguiente pestaña: “Structures”.

Captura de pantalla de la ventana "Structures" en IDA Pro, mostrando una lista de estructuras de datos identificadas en el archivo binario analizado, incluyendo sus nombres, offsets y tamaños.
Desvela la organización de los datos en un archivo binario utilizando la ventana “Structures” de IDA Pro.

Aquí podemos investigar más a fondo cómo están organizadas las estructuras de datos en el programa. Por ejemplo, se muestra qué clases se llaman, qué tipos de variables utilizan y qué excepciones gestionan. Es complicado, pero es instructivo.

Resumen

Con todos estos datos, los ingenieros inversos estudian cómo funciona un programa. Ejecutan depuradores y hacen clic en todos los lugares posibles para recopilar la máxima información sobre la arquitectura. Es un trabajo complicado, pero increíblemente útil. Y, además, se paga bien; en un artículo aparte hablamos de las franjas salariales de los desarrolladores que dominan el lenguaje ensamblador.

¿Quieres más?

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda