La Reverse Engineering (también llamada ingeniería inversa o reversa) consiste en estudiar un objeto para determinar su funcionamiento interno o método de fabricación. También se le conoce como retro-ingeniería o retro-diseño.
En informática, esto se aplica también a los programas. Para ello, se utilizan herramientas de análisis como un desensamblador o un descompilador. Si esto equivale a hacer depuración, se comprende por qué, gracias a las herramientas de Kali Linux, se puede usar para simular un tipo de ataque que permite recuperar información a la que no siempre se tiene acceso directo.
La ingeniería inversa se usa frecuentemente con estructuras de datos para reconstruir un modelo desde las estructuras físicas de archivos o tablas.
NOTA: La ingeniería inversa se popularizó gracias a los videojuegos y, especialmente, al incumplimiento de las protecciones anticopia. Esta actividad también se conoce como cracking.
De hecho, para escribir controladores para ciertos periféricos como webcams o escáneres, los desarrolladores de software de código abierto a menudo han tenido que recurrir a la ingeniería inversa del controlador, interceptando los intercambios entre el procesador y este, descubriendo así cómo dialogar con el chip electrónico de la placa principal.
En criptografía, la ingeniería inversa puede llegar a ser una forma de ataque criptoanalítico para extraer información secreta de la “caja negra” que simboliza el proceso de cifrado. Este tipo de ataque se llama ataque por canales auxiliares.
Legalmente, muchos editores de software propietario incluyen en su contrato de licencia de usuario final (CLUF) cláusulas que prohíben este procedimiento. Sin embargo, en muchos países la ingeniería inversa está permitida por ley, especialmente para fines de interoperabilidad. En algunos países, este derecho está garantizado por ley. Además, la ingeniería inversa puede ser una forma de defensa, especialmente en los siguientes casos:
- Estudio de binarios maliciosos (tipo rootkit) en el contexto de un ataque informático.
- Estudio de virus informáticos para mejorar un antivirus o para su erradicación.
- Estudio e investigación de vulnerabilidades en software para mejorar su seguridad.
Tabla de Contenido: Todo sobre la Ingeniería Inversa
Ingeniería inversa: En qué consiste
La ingeniería inversa, también conocida como reverse engineering, es un proceso que implica el análisis detallado de la estructura y el funcionamiento de un objeto, ya sea físico, software o hardware, para extraer sus especificaciones de implementación y diseño. Aquí nos centraremos en los mecanismos que rigen sus prácticas y las implicaciones que tiene esta técnica tanto en el mundo del hacking como en la ciberseguridad.

Código fuente y ejecutable: premisas conceptuales
Para entender la ingeniería inversa, debemos retroceder a la definición de una aplicación de software o programa informático. Se trata de una porción de código escrita en un lenguaje textual (usualmente C o C++) comprensible para los humanos, llamado código fuente.
Para que la máquina pueda interpretar este código, un compilador, a través de un análisis sintáctico, léxico y semántico, lo traduce a un ejecutable: una combinación de código objeto y un enlazador (linker). Este último añade al código objeto funciones de librería que permiten al compilador comprender parte del código interno.
Solo a nivel de ejecutable, la máquina puede procesar el programa, ya que este no es más que la traducción a lenguaje binario del código fuente. Esto es la premisa para entender el forward engineering, que en términos generales se puede entender como la implementación ex novo de un programa. Ahora pasemos a la ingeniería inversa propiamente dicha.
Del ejecutable al assembly: la descompilación
A menudo, por razones de copyright, el código fuente de un software se crea con licencia propietaria para que terceros no puedan acceder a él. Por lo tanto, para acceder a él, es necesario partir del ejecutable y retroceder hasta el lenguaje de alto nivel: así se explica el mecanismo general de la ingeniería inversa.
Para hacer esto, se utilizan herramientas llamadas descompiladores (también conocidos como IDA, Interactive Disassembler). Estas herramientas, a diferencia de los compiladores utilizados en el forward engineering, desestructuran el ejecutable para llegar a las instrucciones de implementación del código fuente.
El lenguaje al que se traduce preliminarmente este ejecutable es un código similar al lenguaje máquina, una especie de intermediario entre el lenguaje binario y el de alto nivel. Entre estos códigos intermedios se distinguen:
- Assembly (o lenguaje ensamblador): utilizado en aplicaciones para máquinas reales.
- Bytecode: empleado en máquinas virtuales como la Java Virtual Machine.
Las características principales de este tipo de lenguajes son:
- Cada opcode del lenguaje máquina (la parte que describe la instrucción a ejecutar) se reemplaza con formas nemotécnicas.
- Las direcciones de memoria se pueden convertir a la base numérica más adecuada o en forma de identificadores (cadenas de texto).
El objetivo general es hacer que el lenguaje máquina del compilador del que se partió en el análisis del software tenga un formato más legible y comprensible para los humanos.
Problemas comunes de la descompilación
Uno de los problemas más comunes al descompilar es la cantidad de información perdida. La transcripción a assembly nunca es idéntica, sino más bien isomórfica al código fuente. En otras palabras, el assembly representa la estructura general, pero muchos elementos, incluyendo los identificadores de texto (nombres de variables, comentarios, macros), suelen ignorarse en el proceso y, por lo tanto, se pierden.
Además, el ejecutable no solo puede constar de código fuente: también puede estar compuesto de datos de ejecución que complican aún más la lectura.
Las fases de la ingeniería inversa
La ingeniería inversa es un procedimiento nada sencillo. Dejando a un lado el aspecto puramente técnico, podemos trazar un esquema general de estructuración:
- Traducción del código fuente a lenguaje assembly.
- Análisis del programa y redacción de una documentación sobre la reconstrucción de su organización y funcionamiento.
- Mejora de la estructura para que sea más legible y modificable.
- Modularización: las partes del código relacionadas con la misma funcionalidad se reorganizan para eliminar redundancias innecesarias.
- Reingeniería: el código obtenido se reimplementa para mejorar o añadir funcionalidades, o para una mejor integración en el entorno de ejecución.
Herramientas de Ingeniería Inversa
A continuación, veremos algunas de las muchas herramientas que permiten practicar la ingeniería inversa.
#1. Utilidad OllyDbg
Se trata de un programa de ensamblaje de 32 bits que permite depurar aplicaciones de Microsoft Windows. El énfasis en el análisis de código binario lo hace particularmente útil en casos donde el código fuente no está disponible. Generalmente, este software se utiliza para crackear software comercial. Para abrirlo, simplemente seleccione el menú Aplicaciones y luego las siguientes opciones:

Para abrir un ejecutable, debe ir al menú ‘Opening folder’ para seleccionar el programa binario en cuestión. Entonces puede visualizar la totalidad de los eventos e intercambios que se realizan dentro del programa:

#2. Utilidad Dex2jar
Dado que las aplicaciones Android son programas ejecutables, también podemos interesarnos en cómo se utiliza una aplicación desplegada en un teléfono GSM. Para ello, podemos utilizar el programa dex2jar, que ayuda a convertir archivos APK en archivos JAR para visualizar el código fuente. Este programa se utiliza en modo línea de comandos de la siguiente manera:
# d2j-dex2jar –d /<File>
NOTA: El archivo mencionado debe especificarse con su ruta de acceso completa. Como resultado, debería tener un archivo JAR, como se muestra en la siguiente captura:

#3. Utilidad jd-gui
Se trata de una utilidad gráfica que permite mostrar el código fuente Java de un archivo .class. De esta manera, puede recorrer el código fuente reconstruido y reconstruir el archivo que recuperó en el paso anterior usando dex2jar. Para ejecutar este programa, simplemente abra un terminal y ejecute el comando jd-gui. Esto permite inicializar la siguiente ventana:

En la misma línea, también puede abrir la utilidad apktool para realizar ingeniería inversa de aplicaciones Android. Una vez más, se trata de una utilidad de línea de comandos:
# apktool <Appli>.apk
Este tipo de comando inicia la descompilación del archivo APK.
Ámbitos de aplicación de la ingeniería inversa
La ingeniería inversa es un arma de doble filo para la seguridad informática. Por un lado, se utiliza para fortalecer una aplicación contra posibles ataques de hackers, pero por otro lado, también lo utilizan los ciberdelincuentes para manipular ilegalmente los softwares. Aquí hay algunos de sus principales dominios aplicativos, todos relacionados con el desarrollo o las pruebas:
- Análisis de malware: A través de un análisis dinámico (o caja negra), es posible implementar nuevas medidas de seguridad contra el malware.
- Gestión de errores en software propietario: para mejorar las funcionalidades y las medidas de seguridad. Un ejemplo es Intel con su iStare (Intel security threat analysis and reverse engineering), que analiza y prueba las vulnerabilidades de los microchips antes de que salgan al mercado.
- Trasladar a un lenguaje de programación más actual el código de una aplicación heredada.
- Recuperación de códigos fuente perdidos.
- Personalización de sistemas embebidos.
- Eliminación de protecciones de shareware (cracking).
Técnicas para contrarrestar la ingeniería inversa ilícita
Para evitar el riesgo de infringir las normas de copyright sobre software propietario, se utilizan estrategias para comprometer intencionadamente la legibilidad del código fuente. Entre ellas:
- Ofuscación: consiste en complicar el código durante la programación para dificultar la comprensión de los algoritmos.
- Criptografía: este sistema utiliza un algoritmo matemático que, mediante el uso de una clave (secuencia de caracteres), puede cifrar información.
- Cifrado: utiliza la criptografía de clave secreta para cifrar el código ejecutable.
- Firma digital: permite documentar la integridad del código. Sin embargo, solo garantiza que la aplicación no se haya falsificado justo antes de la ejecución.
¡Ya tienes el panorama junto con algunas herramientas para empezar con la ingeniería inversa!
Pingback: Análisis Libro: Ingeniería Social. El Arte del Hacking Personal » CM
Pingback: Equipo Rojo vs. Equipo Azul vs. Equipo Morado: ¿Cuáles son las Diferencias? » CyberMentor
Pingback: Cómo Identificar Deepfake para Evitar Información Falsa » CyberMentor
Pingback: 5 Lenguajes de Programación más Útiles en Ciberseguridad » CM
Pingback: 10 Herramientas Utilizadas por Pentesters en 2025 » CyberMentor