Una imagen de cerca de una pantalla de ordenador que muestra código ensamblador, sugiriendo el proceso de ingeniería inversa.
131
Views

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:

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.

Representación gráfica del concepto de "Reverse Engineering" (Ingeniería Inversa), mostrando el término en un hexágono central rodeado de otros hexágonos con iconos relacionados con la tecnología y la ingeniería.
Descubre el concepto de ingeniería inversa y su importancia en diversos campos tecnológicos.

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:

  1. Traducción del código fuente a lenguaje assembly.
  2. Análisis del programa y redacción de una documentación sobre la reconstrucción de su organización y funcionamiento.
  3. Mejora de la estructura para que sea más legible y modificable.
  4. Modularización: las partes del código relacionadas con la misma funcionalidad se reorganizan para eliminar redundancias innecesarias.
  5. 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:

Captura de pantalla del menú de aplicaciones de Kali Linux, destacando la aplicación OllyDbg dentro de la categoría de Ingeniería Inversa.
Utiliza OllyDbg en Kali Linux para tus tareas de ingeniería inversa y análisis de malware.

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:

Captura de pantalla de la interfaz de OllyDbg mostrando el desensamblado de código, la memoria, los registros y otras informaciones de depuración.
Realiza ingeniería inversa y depuración de código con OllyDbg. Analiza el ensamblador, la memoria y los registros para comprender el funcionamiento 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:

Captura de pantalla que muestra un archivo JAR nombrado "classes-dex2jar.jar" en un explorador de archivos.
Utiliza dex2jar para convertir archivos DEX de Android a JAR y facilitar su análisis.

#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:

Captura de pantalla de la interfaz de JD-GUI mostrando el código fuente Java de una clase descompilada desde un archivo .class.
Analiza código Java compilado con JD-GUI. Visualiza el código fuente a partir de archivos .class.

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!

Angel Mentor https://cybermentor.net

Angel Mentor es un profesional certificado en ciberseguridad cuya misión en CyberMentor.net es simplificar el complejo mundo de la seguridad digital. Con experiencia práctica en el campo, te guía desde la protección de tus dispositivos y tu privacidad hasta el avance de tu carrera profesional en ciberseguridad.

Todos los Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *