lunes, 22 de febrero de 2010

La Papelera de reciclaje en Windows Vista/7

Las hay más llenas o más vacías, conteniendo cosas banales o secretos de estado, pero lo que todos los sistemas Windows tienen en común al respecto, es que todos tienen una. En esta ocasión hablaré de Windows Vista y 7, porque de los anteriores ya se sabe bastante.

Lo primero es lo primero y el mérito en este caso corresponde a Mitchell Machor, autor del primer análisis en su documento "The Forensic Analysis of the Microsoft Windows Vista Recycle Bin". Yo sólo comento en castellano y propongo una herramienta.

Todos sabemos que cuando eliminamos una carpeta o archivo, y siempre que no mantengamos pulsado el botón de las mayúsculas, ésta o éste se almacenará temporalmente en la Papelera de reciclaje. Lo de temporalmente en ocasiones no es más que un eufemismo ya que la mayoría de las costumbres reales solemos transferirlas voluntaria o involuntariamente al mundo digital, y no son pocas aquellas que amenazan con desbordarse. ¿Pero cómo se organiza internamente este elemento tan particular?

En las últimas versiones de Windows, entiéndase Vista/7, existe un directorio oculto en cada unidad con nombre $Recycle.Bin. Sin embargo me temo que al final todos ellos apuntan al mismo lugar siendo éste su homónimo en la unidad del sistema:

%SystemDrive%\$Recycle.Bin

utilizando las variables de entorno. Si además tenemos en cuenta que Windows es un sistema multiusuario no será fácil deducir que existirá una Papelera por usuario. Veamos un ejemplo de como se gestiona esta característica en un sistema Windows 7 con dos usuarios:

C:\>dir /A:H C:\$Recycle.Bin

El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: 9C87-DB2F
 
Directorio de C:\$Recycle.Bin
 
15/02/2010 20:07 <DIR> .
15/02/2010 20:07 <DIR> ..
15/02/2010 20:02 <DIR> S-1-5-21-1730169009-2451939862-3791123446-1001
15/02/2010 20:14 <DIR> S-1-5-21-1730169009-2451939862-3791123446-1003
0 archivos 0 bytes
4 dirs 14.153.822.208 bytes libres

Simple y elegante, se crea un subdirectorio utilizando para ello el SID de la cuenta correspondiente y ya se encarga el Explorador de Windows de enlazarlo adecuadamente desde la sesión del usuario. Por si hay algún despistado, más sobre SIDs en Microsoft, la Wikipedia y como no, Wadalbertia.

El valor de tiempo asociado al subdirectorio puede servir para acotar la fecha y hora de la primera sesión del usuario en el sistema, siempre que éste haya eliminado algún elemento desde dicha sesión y no haya manipulado este valor. Como suele pasar con la mayor parte de las cosas, nada es del todo seguro.

Identificado el mecanismo interno de gestión utilizado por Windows para las papeleras de los usuarios resta saber como se aclara con los diferentes elementos que almacena. Ahora, para un sistema Vista, veamos el contenido de la papelera del usuario:
C:\>dir C:\$Recycle.Bin\S-1-5-21-1435829524-487146864-2118318027-1000

El volumen de la unidad C es SYSTEM
El número de serie del volumen es: B00D-25C9
 
Directorio de C:\$Recycle.Bin\S-1-5-21-1435829524-487146864-2118318027-1000
 
21/02/2010 22:28 544 $I3UT5T8
21/02/2010 22:28 544 $IN3DQ7V.exe
21/02/2010 22:27 544 $ISW6AHM
21/02/2010 22:27 <DIR> $R3UT5T8
24/06/2009 22:18 454.656 $RN3DQ7V.exe
21/02/2010 22:27 <DIR> $RSW6AHM
4 archivos 456.288 bytes
2 dirs 19.253.620.736 bytes libres

Del listado anterior podemos obtener parejas de elementos con nombres similares si obviamos los 2 primeros carácteres. Así tendríamos:
$I3UT5T8    $IN3DQ7V.exe    $ISW6AHM

$R3UT5T8 $RN3DQ7V.exe $RSW6AHM

que el Explorador de Windows interpretará como:


Pues resulta que los ficheros encargados de almacenar la información asociada a cada uno de los elementos eliminados son aquellos que empiezan por $I, y los elementos eliminados serían los que empiezan por $R. El formato interno de los ficheros de información:
  • 8 bytes para la cabecera de fichero que siempre es 01 00 00 00 00 00 00 00.

  • 8 bytes para el tamaño del fichero/carpeta asociado, en formato litle endian.

  • 8 bytes para la fecha y hora de eliminación del fichero/carpeta, en formato litle endian y que se corresponde con el número de segundos transcurridos desde la medianoche del 1 de Enero de 1601 (windows filetime).

  • El resto de bytes, 520 hasta completar los 544 que ocupa cada fichero/carpeta, se utiliza para almacenar la ruta que ocupaba originalmente el elemento antes de ser eliminado. Los carácteres que forman la ruta aparecen separados por un byte nulo (00) que también se utiliza para completar el espacio asignado.
Por lo que he podido experimentar no aparece ningún dato dentro del fichero de información que permita identificar si el elemento eliminado es un arhivo o una carpeta, y en el caso de que sea ésto último la modificación del nombre original únicamente afecta al elemento superior:
C:\>dir C:\$Recycle.Bin\S-1-5-21-1435829524-487146864-2118318027-1000\$R3UT5T8

El volumen de la unidad C es SYSTEM
El número de serie del volumen es: B00D-25C9
 
Directorio de C:\$Recycle.Bin\S-1-5-21-1435829524-487146864-2118318027-1000\$R3UT5T8
 
21/02/2010 22:27 <DIR> .
21/02/2010 22:27 <DIR> ..
21/02/2010 22:27 <DIR> wadalbertia
21/02/2010 22:27 <DIR> web
0 archivos 0 bytes
4 dirs 19.251.822.592 bytes libres

Ahora sabiendo todo lo anterior, y como sigo aprendiendo python, vamos a ver como funciona el script:
C:\>intrash.py -h

Usage: intrash.py [options] path
 
Script that gets information about the contents of a recycle bin from a
Windows Vista/7 system
 
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-f OUTFORMAT, --format=OUTFORMAT
format of the output: normal or csv [defaults: normal]
-o OUTFILE, --output=OUTFILE
write output to OUTFILE instead of stdout
-e OUTENCODING, --output-encoding=OUTENCODING
define output encoding [defaults: utf-8]

Tal como indica la ayuda del comando por defecto la salida se vuelca en la consola utilizando utf8, por lo que los carácteres especiales como la ñ y las vocales con acentos aparecerán como caracteres extraños. Para evitar este problema primero obtendremos el encoding utilizado por defecto y posteriormente lo indicaremos en la invocación del comando:
C:\>chcp

Página de códigos activa: 850
 
C:\>intrash.py -e cp850 C:\$Recycle.Bin
 
 
S-1-5-21-1435829524-487146864-2118318027-1000
 
 
Trash file: $R3UT5T8
Path: C:\Users\javi\Desktop\diseñoweb
Size: 1278246 bytes
Deleted at: Sun Feb 21 21:28:01 2010 UTC
 
 
Trash file: $RN3DQ7V.exe
Path: C:\Users\javi\Desktop\putty.exe
Size: 454656 bytes
Deleted at: Sun Feb 21 21:28:21 2010 UTC
 
 
Trash file: $RSW6AHM
Path: C:\Users\javi\Desktop\Nueva carpeta
Size: 0 bytes
Deleted at: Sun Feb 21 21:27:43 2010 UTC

Ahora si queremos almacenar la salida en un fichero determinado y en formato csv de forma que podamos analizarla facilmente por ejemplo con excel:
C:\>intrash.py -e iso-8859-1 -f csv -o recyclebin.csv C:\$Recycle.Bin

 
C:\>dir recyclebin.csv
El volumen de la unidad C es SYSTEM
El número de serie del volumen es: B00D-25C9
 
Directorio de C:\
 
21/02/2010 23:24 458 recyclebin.csv
1 archivos 458 bytes
0 dirs 19.251.257.344 bytes libres

Para facilitar el uso de la herramienta sin tener que obligar a nadie a instalar un intérprete de python he generado los binarios adecuados mediante py2exe. Para utilizar el programa bastará con desempaquetar el fichero zip y almacenar todo su contenido en un mismo directorio, invocándolo desde allí. En el caso de que se muestre un error relacionado con la librería MSVCR90.dll deberá instalarse el paquete "Microsoft Visual C++ 2008 Redistributable Package".

El script está desarrollado de forma que también pueda utilizarse sin problemas desde linux, y como no, he tirado de la inestimable ayuda de mi profesor particular, mi amigo y compañero hilario.

Código, scripts y ejecutable: intrash.zip

En breve más, y mejor, espero.

1 comentario:

Anónimo dijo...

Muchas gracias me ha sido de mucha utilidad tu entrada,

saludos