Este artículo explora la historia de la descompilación de binarios y el desafío persistente de la estructuración del flujo de control. La descompilación es el proceso de convertir código compilado (como C, C++, Rust o Go) de vuelta a una representación de código fuente legible. Aunque el concepto no es nuevo, la investigación en esta área ha sido relativamente corta, incluso en comparación con las herramientas comerciales como IDA Pro.
La investigación pionera de Cristina Cifuentes en 1994 sentó las bases, identificando la necesidad de algoritmos de estructuración para transformar los Control Flow Graphs (CFG) generados por el desensamblador en código de alto nivel con estructuras como if-then-else y bucles while. Estos algoritmos buscan patrones (llamados 'graph schema') en el CFG y los convierten en estructuras de código. Sin embargo, la conversión no es única; existen múltiples formas de estructurar el mismo CFG, y la elección de qué camino tomar (por ejemplo, dónde insertar una instrucción goto) puede afectar significativamente la calidad del código resultante. La dificultad radica en que no se puede garantizar que el código generado sea idéntico al original.
La historia de la descompilación se divide en dos fases: la investigación académica inicial y el desarrollo de herramientas prácticas por parte de hackers y empresas. IDA Pro, con su decompiler HexRays, y Reko son ejemplos de herramientas comerciales que siguen los principios establecidos por Cifuentes. Más tarde, surgieron alternativas de código abierto como Snowman, fcd y Binary Ninja. El artículo destaca que, a pesar de los avances, el problema de la estructuración del flujo de control sigue siendo un desafío importante, y la elección de algoritmos y heurísticas tiene un impacto crucial en la calidad del código decompilado. El artículo concluye que la descompilación es un campo en constante evolución, y la Parte 2 profundizará en las técnicas modernas y sus limitaciones.
En resumen, la descompilación es una herramienta valiosa para la ingeniería inversa, el análisis de malware y la recuperación de código fuente perdido. Sin embargo, la calidad del código decompilado depende en gran medida de la capacidad de estructurar correctamente el flujo de control, un problema que ha resistido una solución definitiva durante décadas.
