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:
- El programador escribe código en un lenguaje que entiende, como Java, Python o C++.
- 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.
- 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:
- El desarrollador recibe un archivo binario que solo entiende la computadora.
- 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.
- 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.

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”.

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.
- 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.
- 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.
- 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.
- 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.

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.

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

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

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

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.

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:

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”.

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?
- apk.sh: Facilita la Ingeniería Inversa de Aplicaciones Android
- APKLab: Workbench de Ingeniería Inversa de Android para VS Code
- NinjaDroid: Ingeniería Inversa en Paquetes APK de Android