Nuestro equipo redactor ha pasado mucho tiempo buscando la respuesta a tu duda, te regalamos la solución y nuestro objetivo es que resulte de mucha ayuda.
Solución:
Tienes razón sobre tu definición de un descompilador: toma una aplicación compilada y produce un código fuente para que coincida. Sin embargo, lo hace no en la mayoría de los casos, conoce el nombre y la estructura de las variables/funciones/clases, solo adivina. Analiza el flujo del programa e intenta encontrar una manera de representar ese flujo a través de un determinado lenguaje de programación, normalmente C. Sin embargo, debido a que el lenguaje de programación de elección (C, en este ejemplo) a menudo se encuentra en un nivel más alto que el estado del programa subyacente (un ejecutable binario), algunas partes del programa pueden ser imposibles de representar con precisión; en este caso, el descompilador fallaría y tendría que usar un desensamblador. Esta es la razón por la que a muchas personas les gusta ofuscar su código: hace que sea mucho más difícil para los descompiladores abrirlo.
Construir un descompilador no es una tarea sencilla. Básicamente, debe tomar la aplicación que está descompilando (ya sea un ejecutable o alguna otra forma de aplicación compilada) y analizarla en algún tipo de árbol con el que pueda trabajar en la memoria. Luego analizaría el flujo del programa y trataría de encontrar patrones que pudieran sugerir que un if
declaración/variable/función/etc se utilizó en una determinada ubicación en el código. En realidad, todo es solo un juego de adivinanzas: tendría que conocer los patrones que crea el compilador en el código compilado, luego buscar esos patrones y reemplazarlos con el código fuente equivalente legible por humanos.
Todo esto es mucho más simple para programas de alto nivel como Java o .NET, donde no tiene que lidiar con instrucciones de ensamblaje, y cosas como variables se encargan en su mayoría. Allí, no tienes que adivinar tanto como traducir directamente. Es posible que no tenga nombres exactos de variables/métodos, 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 sé todos los detalles de lo que estoy hablando. Si está realmente interesado en escribir un descompilador, debería obtener un libro sobre el tema.
Al final de la página puedes encontrar las críticas de otros administradores, tú igualmente puedes insertar el tuyo si lo deseas.