systemadmin.es > Storage > Sistemas de ficheros > Extracción de imágenes de un Thumbs.db de Windows

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í.

Bisturí vs Hacha

Bisturí vs Hacha

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:

Ficheros de entrada para el thumbs.db

Ficheros de entrada para el thumbs.db

Podríamos extraer el siguiente conjunto de ficheros:

Ficheros extraídos del thumbs.db

Ficheros extraídos del thumbs.db

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.

4 comments to “Extracción de imágenes de un Thumbs.db de Windows”

  1. 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.

  2. Ciertamente se debe compilar con g++, por lo que debería haver dicho C++, despiste mio. Lo cambio

  3. Buen post!!Como odiaba los ficheros thumbs.db cuando usaba windows, se reproducían como conejos xD

  4. Muchas gracias! 🙂 Si, el ficherito de las narices es como los dichosos cores que Linux solía tener habilitados por defecto en el pasado

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>