Extracción de imágenes de un Thumbs.db de Windows
A veces uno escucha como se le da mucha importancia a las cosas mas tontas. Por ejemplo, se habla muchas veces de “técnicas informáticas” para recuperar ficheros de dispositivos como tarjetas SD o bien para recuperar las previsualizaciones del fichero de Windows Thumbs.db. Hoy vamos a ver como hacerlo a lo bruto, sería como lo que es una hacha a un bisturí.
Mediante el hexdump podemos comprobar como el fichero Thumbs.db contiene imágenes en formato JPEG:
00000600 0c 00 00 00 01 00 00 00 1c 13 00 00 ff d8 ff e0 |............ÿØÿà| 00000610 00 10 4a 46 49 46 00 01 01 01 00 60 00 60 00 00 |..JFIF.....`.`..|
Por lo que se puede hacer un pequeño programa en C++ para escupir las imágenes según se vaya encontrando los headers del JPEG:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
int foto=0;
char id[]={0xFF,0xD8,0xFF,0xe0,0x00,0x10,'J','F','I','F'};;
FILE *newthumb()
{
char filename[256];
sprintf(filename,"%d.jpg",foto);
FILE *tmp=fopen(filename,"w");
fwrite(id,1,sizeof(id),tmp);
printf("thumb %s\n",filename);
foto++;
return tmp;
}
int main(int argc, char *argv[])
{
if(argc<2)
{
std::cout << argv[0] << " <entrada>" << std::endl;
exit(-1);
}
FILE *in=fopen(argv[1],"r");
FILE *out=NULL;
char c;
int pid=0;
while(fread(&c,1,1,in))
{
if(!(pid<sizeof(id)))
{
if(out!=NULL)
fclose(out);
out=newthumb();
pid=0;
}
else
{
if(c==id[pid])
pid++;
else
pid=0;
}
if(out!=NULL)
{
fwrite(&c,1,1,out);
}
}
if(out!=NULL)
fclose(out);
return 0;
}
Este simple programa recorta en trozos el fichero de entrada por cada vez que encuentra el header del fichero JPEG y confía que el visualizador sea suficientemente tolerante para mostrarlo. Por ejemplo, dado un conjunto de imágenes de tamaños y formatos diferentes:
Podríamos extraer el siguiente conjunto de ficheros:
Este mismo programa nos podría servir para imágenes de discos dónde los ficheros no estuvieran fragmentados, por ejemplo las tarjetas SD que por el patrón de uso que tienen suelen tener una muy baja fragmentación del sistema de fichero.
Esta es la idea de fondo del proceso, evidentemente se puede hacer más robusto intentando seguir el formato del sistema de ficheros (en una imagen de disco) o bien el formato del fichero (para el caso del thumbs.db).
Debe recordarse que esto es meramente ilustrativo, no se trata de ningún programa de recuperación de ficheros ni nada similar.
Relacionados
Imprimir


15. January 2010 at 12:56 pm :
Hmm, dices hacer un programa en C y usas std::cout que de C no tiene nada. Creo que si te dedicas a experimentar como programador, dedica un poco de tiempo para tener un codigo presentable.
No digo que este mal, solo que da mas gusto ver codigo, escrito correctamente sin hacer mesclas de varios lenguajes, con una buena indentacion, etc…
Cualquier buen programador apreciaria eso.
Un saludo e Interesante articulo.
15. January 2010 at 12:58 pm :
Ciertamente se debe compilar con g++, por lo que debería haver dicho C++, despiste mio. Lo cambio
26. January 2010 at 9:54 am :
Buen post!!Como odiaba los ficheros thumbs.db cuando usaba windows, se reproducían como conejos xD
27. January 2010 at 1:33 pm :
Muchas gracias!
Si, el ficherito de las narices es como los dichosos cores que Linux solía tener habilitados por defecto en el pasado