[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