2010-05-25 36 views
10

Entonces, ¿es realmente un decompilador lo que da la fuente de una pieza compilada/interpretada de código? Porque para mí eso suena imposible. ¿Cómo obtendrás los nombres de las funciones, variables, clases, etc. si está compilado? ¿O estoy malinterpretando la definición? ¿Como funciona? ¿Y cuál es el principal general detrás de hacer uno?¿Qué es un compilador de compilación? ¿Cómo funciona?

Respuesta

10

Tiene razón acerca de su definición de decompilador: toma una aplicación compilada y produce el código fuente para que coincida. Sin embargo, hace no en la mayoría de los casos conoce el nombre y la estructura de las variables/funciones/clases, simplemente adivina. Analiza el flujo del programa e intenta encontrar una forma de representar ese flujo a través de un cierto lenguaje de programación, típicamente C. Sin embargo, debido a que el lenguaje de programación de elección (C, en este ejemplo) a menudo está en un nivel más alto que el estado del programa subyacente (un ejecutable binario), algunas partes del programa podrían ser imposibles de representar con precisión; en este caso, el decompilador fallaría y necesitaría usar un desensamblador. Esta es la razón por la cual a muchas personas les gusta ofuscar su código: hace que sea mucho más difícil para los decompiladores abrirlo.

Crear un descompilador no es una tarea sencilla. Básicamente, debe tomar la aplicación que está descompilando (ya sea un ejecutable u otra forma de aplicación compilada) y analizarla en algún tipo de árbol con el que pueda trabajar en la memoria. A continuación, analizará el flujo del programa y tratará de encontrar patrones que puedan sugerir que se utilizó una declaración/variable/función/etc. if en una determinada ubicación del código. En realidad, todo es un juego de adivinanzas: debe conocer los patrones que el compilador elabora en el código compilado, luego buscar esos patrones y reemplazarlos con un código fuente equivalente legible por el ser humano.

Esto es mucho más simple para programas de nivel superior como Java o .NET, donde no tiene que lidiar con las instrucciones de ensamblaje, y cosas como las variables se ocupan principalmente de usted. Allí, no tienes que adivinar tanto como traducir directamente. Puede que no tenga los nombres exactos de variable/método, pero al menos puede deducir la estructura del programa con bastante facilidad.

Descargo de responsabilidad: Nunca he escrito un descompilador y, por lo tanto, no conozco todos los detalles de los que estoy hablando. Si está realmente interesado en escribir un descompilador, debe obtener un libro sobre el tema.

+0

¿Cuál es el principio general detrás de hacer uno sin embargo? –

+0

En realidad, a menudo puede obtener los nombres de las variables para Java y los ejecutables sin depurar gcc depurados. – paxdiablo

+0

@paxdiablo: Sí, es por eso que me aseguré de incluir "en la mayoría de los casos" allí, porque hay algunos casos en los que * puedes * realmente obtener un código fuente que se ve casi idéntico al original. :) –

1

Un descompilador toma básicamente el código de máquina y lo revierte al idioma en el que se formateó. Si no me equivoco, creo que el descompilador necesita saber en qué idioma fue compilado, de lo contrario no lo hará trabajo.

El propósito básico del descompilador es volver a su código fuente; por ejemplo, una vez mi archivo Java se corrompió y lo único que pude recuperar fue utilizar un descompilador (ya que el archivo de clase no estaba dañado).

1

Funciona deduciendo una representación "razonable" (basada en algunas heurísticas) de lo que está en el código del objeto. El grado de semejanza entre lo que produce y lo que originalmente existió tiende a depender en gran medida de la cantidad de información contenida en el binario desde el que comienza. Si comienza básicamente con un binario "puro", generalmente se queda con solo inventar nombres "razonables" para las variables, como usar elementos como i, j y k para índices de bucle, y nombres más largos para la mayoría de los demás.

Por otro lado, un lenguaje que admita la introspección necesita incorporar mucha más información sobre nombres de variables, tipos, etc. en el ejecutable. En un caso como este, la descompilación puede producir algo mucho más cercano al original, como por ejemplo retener los nombres originales para funciones, variables, etc.En tal caso, el descompilador a menudo puede producir algo bastante similar al original, posiblemente perdiendo poco más que formateo y comentarios.

0

Eso depende del idioma que está descompilando. Si está descompilando algo como C o C++, la única información que se le proporciona son nombres de funciones y argumentos (en DLL). Si está tratando con Java, entonces el compilador generalmente inserta números de línea, nombres de variables, nombres de campos y métodos, y así sucesivamente. Si no hay nombres de variables, obtendrá nombres como localInt1, localInt2, localException1. O lo que sea que sea el compilador. Y puede decir el espacio entre líneas, debido a los números de línea.

Cuestiones relacionadas