¿En alguna ocasión has oído hablar de ingeniería inversa?, ¿Sabes en qué consiste?
Para ver la importancia de la ingeniería inversa solo hay que trasladarse a los años 80.
En aquella época IBM era el rey tecnológico y nadie (ni siquiera Apple o Microsoft) podían competir con ella.
Hasta que una empresa llamada Phoenix Technologies dio un vuelco al mercado replicando la BIOS utilizada por IBM (hasta el momento líder del sector) mediante el uso de ingeniería inversa.
Gracias a este hecho, el gran beneficiado fue Microsoft que aprovechó esto para dar el “boom” tecnológico con su sistema operativo MS-DOS y posteriormente Windows.
Podemos por lo tanto concluir que, el uso de ingeniería inversa cambió la historia de la informática.
Si quieres conocer más en detalle qué es la ingeniería inversa y qué herramientas se utilizan para su aplicación sigue leyendo este artículo.
¿Qué es la ingeniería inversa?
Comencemos por el principio, explicando en qué consiste la ingeniería inversa.
La ingeniería inversa (en inglés, reverse engineering) es el proceso o técnica de descubrir los principios tecnológicos de un producto, herramienta, dispositivo o sistema.
Este descubrimiento se puede realizar mediante el razonamiento abductivo (haciendo conjeturas) de su estructura, función y operación.
Los productos más típicamente sometidos a esta técnica son los programas para ordenador pero cualquier producto puede ser objeto de análisis de ingeniería inversa.
Se denomina así porque avanza en dirección opuesta a las tareas habituales de ingeniería, que consisten en utilizar datos técnicos para elaborar un producto determinado.
Aplicar ingeniería inversa a algo supone profundizar en el estudio de su funcionamiento, hasta el punto de que podamos llegar a entender, modificar y mejorar dicho modo de funcionamiento.
La aplicación de ingeniería inversa nunca cambia la funcionalidad del producto objeto de la aplicación sino que permite obtener productos que indican cómo se ha construido el mismo.
Su realización permite obtener los siguientes beneficios:
- Reducir la complejidad del sistema
- Generar diferentes alternativas
- Recuperar y/o actualizar la información perdida (cambios que no se documentaron en su momento
- Detectar efectos laterales
- Facilitar la reutilización
Existen los siguientes tipos de ingeniería inversa:
- Datos
- Lógica o proceso
- Interfaces de usuario
Herramientas para ingeniería inversa
Cuando un desarrollador crea un programa, comienza escribiendo el código fuente en el lenguaje de programación seleccionado para acabar compilándolo y crear un programa ejecutable.
Llegado este punto, nadie podría editar el programa sin disponer del código fuente inicial para realizar una nueva compilación del mismo, y en esto es precisamente en lo que se basa el cracking.
La técnica de ingeniería inversa constituye la piedra angular del cracking.
Se basa en la descompilación, o compilación inversa, de un programa a un lenguaje de programación, generalmente, el más básico que existe que es el lenguaje ensamblador.
A continuación veremos las principales herramientas utilizadas para este proceso:
Depuradores
Un depurador es un programa utilizado para controlar a otros programas.
Permite analizar un código paso a paso y establecer puntos de control para buscar posibles fallos.
Lo más interesante de los depuradores son los puntos de ruptura (breakpoint) ya que permiten detener la ejecución de un programa cuando se cumpla una condición y ver el estado de todas las variables y la memoria en dicho momento.
Los principales depuradores para Windows son:
- OllyDbg: Depurador de código ensamblador de 32 bits para sistemas operativos Microsoft Windows. Pone especial énfasis en el análisis del código binario, esto lo hace muy útil cuando no está disponible el código fuente del programa.
- WinDBG: es una pieza de software gratuita de Microsoft que puede ser usada para depuración local en modo usuario, o incluso depuración remota en modo Kernel.
- Visual DuxDebugger: Desensamblador depurador de 64 bits para Windows, especialmente útil cuando el código fuente no está disponible.
- GNU Debugger (gdb): Es un depurador portable que se puede utilizar en varias plataformas Unix y funciona para varios lenguajes de programación como C, C++ y Fortran. GDB ofrece la posibilidad de trazar y modificar la ejecución de un programa. El usuario puede controlar y alterar los valores de las variables internas del programa.
- SoftICE: Es un depurador en modo kernel propietario y de pago para Microsoft Windows. SoftICE es capaz de suspender todas las operaciones en Windows cuando se desee, lo cual resulta útil para depurar drivers, ya que es importante conocer cómo se accede al hardware así como las funciones del sistema operativo.
Desensambladores
Un desensamblador es exactamente lo contrario de un ensamblador.
Tal como un ensamblador convierte código escrito en ensamblador en código máquina binario, un desensamblador invierte el proceso e intenta recrear el código en ensamblador partiendo del código máquina binario.
Los desensambladores intentan por tanto mostrar el código del lenguaje de la máquina en un formato más amigable a los ojos de los humanos.
A continuación indicaremos los principales desensambladores según el sistema operativo:
- Windows
- IDA Pro
- PE Explorer
- W32DASM
- IDA 6.6
- IDA Pro Freeware 5.0
- BORG disassembler
- HT Editor
- diStorm64
- Linux
- Bastard Disassembler
- Ciasdis
- Objdump
- GDB
- LDasm
- Mac OS
- GDB
- Machonist
- Otool
- Ndisasm
Decompiladores o compiladores inversos
Un decompilador es un programa de ordenador que realiza la operación inversa a un compilador, es decir, traduce código de bajo nivel de abstracción a un lenguaje de mayor nivel de abstracción.
Por lo tanto, un decompilador toma el código binario ejecutable e intenta recrear el código fuente de alto nivel partir de él.
A continuación vemos algunos de los decompiladores más utilizados:
- DCC Decompiler: Sólo permite decompilar ejecutables DOS basados en el 80286 y lenguaje C. El enfoque usado por DCC en la decompilación se basa en la teoría y técnicas de optimización de grafos adoptadas por los compiladores.
- Boomerang Decompiler Project: Es programa de código abierto para decompilar programas en C. Altera la semántica de cada instrucción en ensamblador e implementa el análisis estático de flujo de datos.
- Reverse Engineering Compiler (REC): Decompila código ensamblador a una representación del código semejante a C, que requiere la edición manual para volver a compilar. El código está a medio camino entre ensamblador y C, pero es mucho más legible que el ensamblador puro.
¡Invierte tu situación!
Como ha podido comprobar, la aplicación de las técnicas de ingeniería inversa permite descubrir el funcionamiento interno de los programas y mejorarlos.
Cada vez la seguridad en informática es un tema más importante y más demandado laboralmente.
Nos encontramos en un campo muy interesante y donde no hay muchas personas que sean realmente expertas en ello.
Si quiere profundizar en el tema de la seguridad informática le recomiendo que realice el Máster en Ciberseguridad de INESEM.
Si le ha parecido interesante este artículo, no te pierdas otros escritos por el mismo autor, con contenido muy relevante en el área de la informática.
Comentarios
Buenas tardes, cuales son los pasos a seguir para realizar una ingeniería inversa, ya que la ISO no habla de la ingeniería inversa, como la ISO 27037 que habla de los pasos a seguir para un análisis forense de malware.
Como puede ayudar la inteligencia artificial al desarrollo de la ingeniería inversa
alguien que me haga servicios de descompilacion?