Descompiladores

Original web-page: http://www.backerstreet.com/decompiler/decompilers.htm

Giampiero Caprino

Un descompilador intenta traducir un archivo de objeto en un archivo fuente compilable. Hay muchos descompiladores para C# o Java, pero solo unos pocos para C/C++. Ver en particular:

  • C4Decompiler: un nuevo descompilador en desarrollo. Solo Windows, tiene una interfaz de usuario elegante inspirada en Visual Studio 2010 con muchas interacciones útiles, que desafortunadamente no siempre son obvias. Hay que hacer clic derecho para descubrirlos. El análisis parece muy bueno, al menos para el ejemplo compilado de depuración incluido en la instalación. Probarlo en ejecutables aleatorios de la carpeta de Windows tuvo resultados mixtos, desde la finalización del análisis hasta bloqueos y bucles sin fin.
    Aún así es muy prometedor, ya que sus autores claramente han puesto mucho pensamiento y esfuerzo en su desarrollo.
  • Boomerang: descompilador de código abierto C. Conjunto de análisis muy avanzado que intenta resolver los problemas más difíciles que enfrentan los descompiladores. La calidad del código generado varía mucho: algunas funciones son casi perfectas en su representación de la estructura del código, las variables locales y los tipos. Otras funciones se ven muy ofuscadas por la cantidad de variables y sus usos. También es bastante frágil, ya que a menudo se bloquea con grandes programas.
  • REC: mi propio descompilador de C para Linux, DOS y Windows. El primer descompilador que funciona en múltiples plataformas y que admite múltiples procesadores (x86 16 y 32-bits, MIPS, 680×0, PowerPC). Es muy estable, ya que ha sido probado con cientos de programas. La calidad de la salida no es tan buena como la de Boomerang, ya que su implementación se basa en un estilo de codificación de 20 años (lectura muy difícil de extender). Ahora he publicado una nueva versión, RecStudio 4, que admite ejecutables de 64 bits. No se ha probado en tantos ejecutables, por lo que aún persisten problemas. Además, los diferentes análisis realizados (SSA) generan un código totalmente diferente que a veces puede parecer de peor calidad (aunque probablemente sea más correcto) que el código generado por la versión anterior.
  • Hex Rays: un complemento de descompilador para IDA Pro. La combinación con las capacidades avanzadas de desmontaje de IDA y el depurador en tiempo de ejecución lo convierten en la opción ideal. Sin embargo, todavía es muy nuevo y requiere IDA Pro. A diferencia de los otros decopiladores, no es gratis. También tiene que resistir la prueba del tiempo en términos de estabilidad. Muy prometedor.
  • Dcc: DOS a C descompilador. Uno de los primeros descompiladores. Muestra su edad, pero muchos otros descompiladores todavía lo mencionan por sus habilidades de estructuración. Solo admite programas 8086 (16 bits).
  • Más sobre otros descompiladores en el Programa Transformación Wiki sobre Descompilación

Aquí hay una comparación de los diversos descompiladores:

Descompilador Plataforma Soporte de objetivos Soporte de formato binario Lote interactivo Salida recompilable Estructurando Variables Tipos Notas
C4Decompiler Windows IA64 PE-COFF GUI interactiva No Muy bien Bueno Justo
Boomerang Windows/Linux IA32
MIPS
PPC
ELF
PE-COFF
Mac-OS
Lote con interfaz gráfica de usuario No Muy bien Bueno Muy bien
REC Windows/Linux IA32
IA64
MIPS
PPC
mc68k
ELF
PE-COFF
AOUT
RAW
PS-X
Lote/Interactivo No Bueno Justo Parcial
dcc Windows 8086 DOS .com Lote No Bueno Justo Pobre
Hex Rays Windows ? ? Interactivo ? ? ? ?

Decompiladores de prueba

La calidad de un descompilador se basa en qué tan bueno es el código que genera y qué tan bien funciona en presencia de entradas “inesperadas”.

El uso de optimizaciones del compilador plantea problemas particularmente difíciles que hacen que el código de entrada sea altamente desestructurado y difícil de entender, incluso para un humano. El manejo de los siguientes casos define la calidad de un descompilador:

No hay información sobre nombres de símbolos en el archivo binario (ejecutable eliminado)

Archivos ejecutables enlazados estáticamente vs. dinámicamente (use la coincidencia de patrones vs. la información del enlazador dinámico para identificar el acceso a las funciones de la biblioteca)

About the Author