[C con Clase] Varias dudas
Programante
programante en gmail.com
Dom Mar 4 12:43:30 CET 2007
Alejandro Vilar López escribió:
> Muchas gracias por vuestra ayuda con los punteros, me fue de mucha
> utilidad. Ahora querría saber si me podríais aclarar lo siguiente:
>
> Si yo tengo un ejecutable (.exe) y fue escrito en C++, ¿puedo
> recuperar a partir de ese fichero el código fuente? (es que borré sin
> querer un .cpp y me quedé con el .exe, pero no lo puedo modificar)
La respuesta es no. Al compilarse el ejecutable, se convierte en código
ensamblador, que a continuación pasa a código máquina.
Teniendo un .exe se podría obtener las instrucciones que hace (en
ensamblador), pero pasar al código en alto nivel es damasiado. Hay
algunos proyectos que lo intentan, pero no se logra gran cosa.
Principalmente porque en la compilación se pierde información (el nombre
de las variables y funciones, por ejemplo). Tal vez podría servirte para
"recordar" más o menos lo que hacían algunas partes, pero es más
sencillo hacerlo desde cero. Otra cosa a tener en cuenta es si el .exe
se compiló con símbolos de depuración, lo que facilitaría la recuperación.
Dicha la parte técnica, yo trataría de recuperar el .cpp usando una
herramienta de recuperación de ficheros borrados. Si fue hace poco, hay
una gran probabilidad de que aún no se haya escrito en el espacio en
disco que ocupaba el archivo.
> Y otra cosa, cuando habláis del "#define" habláis de que se expande,
> ¿qué quiere decir?
>
> Muchas gracias de nuevo y un saludo.
Antes de compilar el código, se ejecuta el preprocesador, sobre el que
se actúa con las directivas que empiezan por #
Por ejemplo:
#include <stdio.h>
#define PALABRA "HOLA"
int main() {
char Buf[sizeof(PALABRA)];
strcpy(Buf, PALABRA);
printf("Buf es %s y palabra es %s", Buf, PALABRA);
return 0;
}
tras pasar el preprocesador se convierete en:
(...cientos de prototipos que están en stdio.h...)
int main() {
char Buf[sizeof("HOLA")];
strcpy(Buf, "HOLA");
printf("Buf es %s y palabra es %s", Buf, "HOLA");
return 0;
}
Todas las PALABRA se convierten en "HOLA". El compilador ni siquiera
sabe de la existencia de PALABRA, sólo ve que has repetido "HOLA" muchas
veces. Con la ventaja de que si tú quieres cambiar HOLA por ADIOS, sólo
tienes que hacerlo en un sitio.
Puedes ver la salida del preprocesador usando gcc -E programa.c (los
#número que aparecen son para indicar al compilador de qué archivo
proviene cada código)
Evidentemente, si intentas desensamblar un .exe no hay ninguna pista de
que se haya usado una constante del preprocesador. Piensa en ellas como
una abreviatura. Donde la pones, es como si escribieras a lo que está
definida.
Espero que te sirva.
Más información sobre la lista de distribución Cconclase