La ingeniería inversa es una herramienta poderosa en el mundo de la informática, permitiendo a los profesionales descomponer y entender el funcionamiento interno de sistemas tanto de software como también de hardware. Esto ha sido usado a lo largo de la historia tanto para clonar hardware como algunas videoconsolas míticas para crear clones físicos o emuladores, para dar paso a los primeros clones del IBM PC, o para otras cosas, desde chips hasta PCB, analizar malware, o crear drivers libres a partir de los de código cerrado, entre otras muchas posibilidades. ¿Quieres conocer un poco más sobre esta técnica?
¿Qué es la ingeniería para entender la ingeniería inversa?
La ingeniería, como sabes, es una disciplina que consiste en la aplicación de los conocimientos científicos teóricos a la solución de los problemas y retos, en sus muy distintas áreas, aunque en este artículo nos interesa especialmente en cuanto a la electrónica y al software. Esto implica tanto el diseño, construcción y desarrollo de herramientas, máquinas e instalaciones, etc. Es decir, la ingeniería transforma el conocimiento en algo práctico, sea físico o no.
Para pasar de la teoría a la creación en ingeniería, se siguen generalmente los siguientes pasos:
- Identificación del problema: se define claramente el problema que se necesita resolver, como por ejemplo diseñar un circuito que haga X trabajo, o un programa que desempeñe X función.
- Investigación y análisis: se recopila información relevante y se analiza para entender mejor el problema. Es decir, se aplica el conocimiento o teoría para aplicarlo a lo anterior. Por ejemplo, los conocimientos de electrónica o de programación, en este caso. En algunos casos, es necesario desarrollar nuevas teorías que no existían previamente.
- Desarrollo de soluciones potenciales: se utilizan los principios de estos conocimientos para desarrollar la solución. Previamente, hay que evaluar aspectos como su viabilidad, seguridad, coste, etc. Si existen varias soluciones posibles, se deberá elegir la mejor según las necesidades o limitaciones de la tecnología actual.
- Diseño detallado: se realiza un diseño detallado de la solución seleccionada, incluyendo todos los aspectos técnicos. Por ejemplo, mediante un software EDA se diseña el circuito, o se desarrolla el algoritmo del programa, etc.
- Implementación: se construye la solución según el diseño detallado. Para ello, se pasa del diseño a fabricar un circuito real, o del algoritmo o pseudo-código a lenguaje de programación final y compilación.
- Pruebas y ajustes: se prueba la solución implementada y se hacen los ajustes necesarios para asegurar que funciona como se esperaba. Por ejemplo, probando el funcionamiento lógico o eléctrico del circuito, o ejecutando el programa para detectar bugs o realizar la famosa depuración.
- Lanzamiento y mantenimiento: se lanza la solución y se realiza un seguimiento para asegurar que sigue funcionando correctamente a lo largo del tiempo. Por ejemplo, lanzando actualizaciones o versiones mejoradas, actualizaciones de software, firmware, etc.
También te puede interesar saber cómo montar un PC
¿Qué es la ingeniería inversa?
La ingeniería inversa, es un proceso que se lleva a cabo con el objetivo de obtener información o un diseño a partir de un producto ya existente. Es decir, todo lo contrario a la ingeniería, de ahí su nombre. Los pasos generales para aplicar la ingeniería inversa son los siguientes:
- Conseguir el producto o sistema: es necesario tener acceso al producto o sistema que se desea analizar. Por ejemplo, a un binario de un programa o a un circuito, siguiendo con los ejemplos anteriores.
- Realizar una inspección: se realiza una inspección detallada del producto o sistema para obtener un conocimiento general de su estructura y funcionamiento. Si es un producto físico, se puede desmontar, o realizar otras operaciones para acceder a sus partes internas, o si es un software, usar herramientas como editores hexadecimales o un desensamblador.
- Estudiar los componentes individualmente: se investigan las características técnicas de cada componente para comprender su funcionamiento y propósito dentro del sistema. Por ejemplo, los elementos electrónicos o las partes del código fuente. También se estudiará las conexiones o relaciones entre los diferentes componentes, para comprender aún mejor el funcionamiento completo.
- Identificar los algoritmos o métodos utilizados: se analiza toda la información obtenida para identificar rutinas o funciones específicas que son clave para el funcionamiento del producto o sistema, pudiendo comprenderlo a nivel teórico.
- Documentar: se documentan todos los hallazgos y conclusiones obtenidas durante el proceso de ingeniería inversa, es decir, se obtiene la teoría y conocimiento. Esto puede incluir diagramas, esquemas, informes técnicos y cualquier otro recurso que facilite la comprensión y formas de reproducirlo.
- Reproducción: finalmente, se puede usar este conocimiento para realizar ingeniería directa, que serían los pasos descritos anteriormente, para partir de una teoría y terminar por crear un clon o producto similar al analizado.
Cuestiones legales
La ingeniería inversa es generalmente considerada una forma legal de aprender sobre un producto siempre que la versión original se obtenga legalmente y no se rompan otros acuerdos contractuales. No obstante, no siempre es considerada legal, especialmente cuando se comercializa sin licencia un clon idéntico, o cuando se viola la ley de derechos de autor, patentes, secretos comerciales, etc.
Cuando un desafío de ingeniería inversa se lleva a los tribunales, el propietario original del objeto, sistema o propiedad intelectual debe probar que crearon el objeto o poseen la patente o los derechos de autor. La persona u organización que realiza la ingeniería inversa debe demostrar que obtuvo la información de manera legal.
Una forma de hacer ingeniería inversa y desarrollar un nuevo producto para evitar la infracción de patentes o derechos de autor es utilizar una técnica de sala limpia o muro ético, en la que dos grupos separados de programadores trabajan en el proyecto, asegurando que el original no sea copiado directamente, sino que un equipo se encarga de la ingeniería inversa, y otro de la implementación a partir de la información conseguida por el otro equipo, pero sin tener acceso directo al original.
Usos frecuentes en el mundo de la tecnología
La ingeniería inversa es una técnica ampliamente utilizada en los campos de la electrónica y la informática. Por ejemplo:
- Clonación de videoconsolas: muchas de las consolas del pasado se hicieron a partir de ingeniería inversa de las consolas originales, creando así clones que podían ejecutar los mismos juegos o cartuchos. Esto se hacía realizando ingeniería inversa tanto al circuito impreso, chips, y software. Algunos casos fueron los clones de la Atari 2600, tanto para crear consolas como la Dismac Video Game, así como para crear emuladores de software para ejecutar las ROMs retro. También hubo clones de otras muchas, como la SEGA, la PlayStation, etc. En España, MX Onda creó un clon de la NES, y Overkal fue la primera consola europea, creada en España, y que era un clon perfecto de la Magnavox Odyssey original.
- Clonación firmware: en los años 80, IBM dominaba el mercado del PC con su IBM PC. Sin embargo, Phoenix Technologies utilizó la ingeniería inversa para replicar el BIOS de IBM, lo que permitió la aparición de PCs clónicos, dando lugar a lo que hoy día conocemos.
- Sistemas operativos y software: ejemplos de ingeniería inversa en el desarrollo de software lo tenemos en el propio Samba, que permite a los sistemas operativos UNIX compartir archivos con sistemas Microsoft Windows. También se ha realizado este tipo de ingeniería inversa para obtener sistemas operativos como ReactOS, o la capa de compatibilidad WINE/Proton que pueden ejecutar software nativo para Windows. Así mismo, también se suele hacer esto con el malware detectado, para saber cómo funciona este código malicioso y poder lanzar firmas par actualizar los antivirus para que sean capaces de neutralizar y detectar estos códigos.
- Creación de drivers: la ingeniería inversa también se utiliza para entender cómo funciona un programa a partir del código ya compilado y por tanto sin acceso al código fuente, como es el caso de los controladores de código cerrado. Esto puede ser útil para crear drivers de código abierto, muy empleados en el ámbito Linux, entre otros sistemas operativos que se han visto obligados a este tipo de ingeniería debido a la falta de soporte de los fabricantes de hardware.
- Más: también hemos visto otro tipo de ingeniería inversa sobre hardware y sistemas diferentes, con otros fines, como puede ser para detectar vulnerabilidades en los sistemas, etc.
No olvides comentar tus dudas y sugerencias…