Como ya señaló Oli en su respuesta, no se puede obtener el código fuente muy original de un ejecutable.
Durante la compilación de un código fuente (compilación destinada a su aceptación más amplia típica, por lo tanto, como todo el proceso que "transforma" un código fuente en un ejecutable), se pierde mucha información.
El preprocesador C, por ejemplo, hará lo siguiente (entre otras cosas):
- Interpretar, ejecutar y eliminar directivas de preprocesador (
#
declaraciones)
- Eliminar comentarios
- Eliminar espacios en blanco innecesarios
Por otro lado, lo que no se pierde durante la compilación del código fuente es técnicamente reversible a un código fuente funcionalmente equivalente.
Esto es porque:
- Las instrucciones binarias tienen una correspondencia 1: 1 con las instrucciones de montaje; el ensamblaje de un código fuente de ensamblaje es solo una mera conversión de las instrucciones de ensamblaje a las instrucciones binarias basadas en una tabla de correspondencias; una sola instrucción binaria siempre es identificable y reversible a una sola instrucción de ensamblaje ;
- Las instrucciones de montaje no tienen una correspondencia 1: 1 con las instrucciones C; la compilación de un código fuente C generalmente no es solo una mera conversión de las instrucciones C a las instrucciones de ensamblaje basadas en una tabla de correspondencias, de hecho, a menudo es lo contrario; generalmente una instrucción C se convierte en instrucciones de ensamblaje múltiples (a menudo diferentes según el compilador); sin embargo, los patrones de múltiples instrucciones de ensamblaje son usualmente identificables y reversibles a una sola instrucción C ;
Hay herramientas llamadas descompiladores cuyo propósito es tratar de revertir un ejecutable a un código fuente funcionalmente equivalente; sin embargo, el resultado suele ser algo alejado del código fuente muy original (y, por lo general, también no es compatible);
Considere este programa:
#include <stdio.h>
#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered
/*
This comment and the comment above won't be recovered
*/
int main(int argc, char* argv[]) {
printf(MESSAGE);
return 0;
}
Al compilarlo en un ejecutable y descompilarlo en un código fuente nuevamente, esto es más o menos lo que generalmente obtienes (en este caso específico usé gcc
/ Boomerang ):
// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
printf("Literal strings will be recovered");
return 0;
}
Como se predijo:
- Faltan directivas de preprocesador
- Faltan comentarios (aparte de
// address: 0x80483fb
, que ha sido agregado por el descompilador)
- Falta un espacio en blanco innecesario (aparte de las nuevas líneas y tabulaciones, que el descompilador ha agregado)
Este también es un resultado bastante bueno; No es raro obtener instrucciones de ensamblaje en línea en el código:
asm("assembly_instruction");
__asm__("assembly_instruction");
La conclusión es (como ya se señaló en las otras respuestas): no se puede obtener la fuente original de un ejecutable *.
* Sin embargo, dependiendo del ejecutable y de su suerte, puede obtener algo usando un descompilador.
strings
programa de filtro puede ser muy útil para identificar qué es o hace un programa binario en particular porque imprimirá todas las cadenas de texto incrustadas más de una longitud especificada en un archivo binario y mirar los mensajes en un programa a veces te dice mucho sobre lo que es y hace.