jueves, 2 de julio de 2009

Modificando Volatility

Animado por la presentación de Andreas Schuster, y "copiando" una de las modificaciones sugeridas vamos a empezar a pegarnos con los fuentes.

Lo primero, desde mi ubuntu, descargo la última versión disponible mediante SVN, instalando para ello el cliente CVS subversion:

$ apt-get install subversion
$ cd /usr/local
$ svn checkout http://volatility.googlecode.com/svn/trunk/ volatility-read-only

Como resultado tendremos un nuevo directorio con la versión read-only disponible para, los que como yo, no forman parte del equipo de desarrollo:
$ cd volatility-read-only/Volatility/

Vamos a modificar la salida obtenida mediante el comando datetime, el cual nos mostrará la fecha y hora en que fue generado el fichero de volcado de memoria. La particularidad es que, por defecto, el comando nos dará su salida en formato local, y lo que vamos a obtener es la fecha en formato UTC. Utilizaremos, para nuestras pruebas, una de las capturas generadas por Hogfly, en concreto el exemplar13.
$ python volatility datetime -f exemplar13.vmem
Image local date and time: Wed Jan 07 20:54:57 2009
$ date
jue jul 2 23:18:18 CEST 2009

La segunda es la salida del comando date en mi sistema, unos segundos después de utilizar el comando de Volatility.

Empezamos con las modificaciones. Buscaremos primero el fichero que alberga el código encargado de obtener la fecha. Lo encontraremos dentro del directorio
forensics/win32/datetime.py

y en concreto nos interesa enormemente a partir de la línea 94 (yo he utilizado SciTE, allá cada cual con sus preferencias):
 94 def local_time(addr_space, types, vaddr):
95 """
96 Returns the 64-bit numerical local time (100ns units)
97
98 @type addr_space: AddressSpace
99 @param addr_space: the kernel address space
100
101 @type types: Dictionary
102 @param types: Type (struct) formats dictionary
103
104 @type vaddr: Integer
105 @param vaddr: virtual address of KUSER_SHARED_DATA
106
107 @rtype Integer
108 @return returns the 64-bit system time number
109 """
110 return system_time(addr_space, types, vaddr) - \
111 time_zone_bias(addr_space, types, vaddr)

El código anterior, apoyándose en las dos funciones que le siguen, system_time() y time_zone_bias(), se encarga de transformar la fecha obtenida en relación a la del sistema local. Agregaremos ahora al final del fichero nuestra propia función, para obtener la fecha en formato UTC:
153 def gmt_time(addr_space, types, vaddr):
154 return system_time(addr_space, types, vaddr)

Y por último modificaremos el esqueleto del comando datetime en el fichero vmodules.py, en este caso nuestro añadido son las líneas 125, 126 y 129:
122   time = windows_to_unix_time(local_time(addr_space, types, KUSER_SHARED_DATA))
123 ts = format_time(time)
124
125 time2 = windows_to_unix_time(gmt_time(addr_space, types, KUSER_SHARED_DATA))
126 ts2 = format_time(time2)
127
128 print "Image local date and time: %s"%ts
129 print "Image date and time (UTC): %s"%ts2

Ahora, ya sólo queda ver a nuestro "engendro" en funcionamiento:
$ python volatility datetime -f exemplar13.vmem 
Image local date and time: Wed Jan 07 20:54:57 2009
Image date and time (UTC): Thu Jan 08 01:54:57 2009

Y esto ha sido todo, en breve más, y mejor, espero.