Un descompilador es un programa que traduce un módulo ejecutable (obtenido a la salida de un compilador ) en un código fuente equivalente en un lenguaje de programación de alto nivel .
La descompilación es el proceso de recrear el código fuente mediante un descompilador.
La descompilación, en particular, se utiliza en la ingeniería inversa de programas.
El éxito de la descompilación depende de la cantidad de información presentada en el código descompilado. El código de bytes utilizado por la mayoría de las máquinas virtuales (como Java Virtual Machine o .NET Framework Common Language Runtime ) a menudo contiene metadatos extensos que hacen que la descompilación sea bastante factible, mientras que el código nativo es más simple y más difícil de descompilar. En particular, las llamadas a subrutinas o funciones con direccionamiento indirecto de llamadas (en términos de lenguajes de programación de alto nivel, llamadas a través de punteros a funciones/procedimientos) parecen difíciles de leer.
Si se sabe en qué idioma se escribió el programa descompilado, en primer lugar, las bibliotecas de tiempo de ejecución (RTL - biblioteca de tiempo de ejecución) del compilador de este idioma se desmontan y analizan , ya que básicamente la compilación del programa se reduce a llamadas con varios parámetros de procedimientos de estas bibliotecas. Además, muchos compiladores le permiten ver en qué código ensamblador se convierten las declaraciones del programa después de la compilación. Estas construcciones se convierten en plantillas para el descompilador, por lo que el proceso de descompilación es, en cierto sentido, similar al reconocimiento de un conjunto finito de tales plantillas en código de máquina. Las llamadas a procedimientos y las devoluciones de los mismos son las más fáciles de reconocer. Sirven como límites para restaurar las declaraciones del procedimiento.
Algunos compiladores y herramientas posteriores a la compilación ofuscan el código para que sea más difícil de descompilar.
Se puede pensar que los descompiladores consisten en varias fases, cada una de las cuales contribuye a ciertos aspectos del proceso general de descompilación.