El sentido de esto es saber cuando queramos si estos archivos (de confianza) han sido alterados o no, comparándolos con sus MD5 antes generados. Así, si instalamos una versión nueva de un driver, o si Windows Update lo hace, lo podremos confirmar. Y si ha habido algún cambio sin que nosotros lo sepamos, pues puede ser un virus.
Para ello, realizaremos un script con perl con un menú donde podamos elegir realizar el MD5 de los drivers, que son los archivos que tengan extensión .SYS, o .sys, o, Sys (perl distingue entre mayúsculas y minúsculas), que se encuentren tanto en system32 como en system32\drivers y guardarlo en un archivo de texto.
La segunda opción tendrá sentido a futuro, cuando comparemos los MD5 de los drivers actuales con los guardados (la foto) . Si no hay ningúna discrepancia, el script no dará ningún resultado, y si la hay, indicará cual es el driver afectado.
------------- Comienzo md5-drivers.pl -------------------------------
# Generación y comprobación de los MD5 de los drivers de Windows
# ramiro.encinas@gmail.com - 2009
# Tuya es la responsabilidad del buen o mal uso de este script
use Digest::MD5::File qw(file_md5_hex); # Cargamos el módulo MD5 para archivos
sub menu # El menú con las tres opciones
{
print "\nControl de drivers. Elige opcion:\n";
print "-------------------------------------\n";
print "- [1] Generar MD5 de los drivers en $file_out\n";
print "- [2] Comparar los MD5 de los drivers con el de $file_out existente\n";
print "- [3] Salir\n";
print "->";
}
sub genera # Procesa los MD5 de los drivers actuales en ambas ubicaciones
{
open f_out, ">$file_out"; # Abre para escritura a drivers.md5
$path = $path1; # Procesa la primera ubicación
busca($path); # Y llama a la función correspondiente para generar los MD5
$path = $path2; # Procesa la segunda ubicación
busca($path); # Y llama a la función correspondiente para generar los MD5
close f_out; # Cierra drivers.md5
print "Archivo $file_out generado ok.\n";
}
sub busca # Busca drivers en ubicación, genera MD5 y los guarda en drivers.md5
{
opendir DIRECTORY, $path or die; # Abre la carpeta $path (la ubicación actual)
# Recorre $path y deja en $file cada nombre de archivo
while ($file = readdir(DIRECTORY)) # Leemos todos los archivos de la ubicación
{
if ( -d $path.$file ){# $file es un directorio
}
else # $file es un archivo (porque puede un directorio)
{
if ($file =~/.[sS][yY][sS]$/) # Sólo *.SYS (mayus y minus).
{
$md5 = file_md5_hex($path.$file); # Calcula el MD5 de $file
print f_out "$path$file\:\:$md5\n"; # Escribe en drivers.md5 path+archivo+::+md5
}
}
}
}
sub compara # Compara los MD5 actuales con los guardados en drivers.md5
{
open f_in, $file_out or die "No puedo abrir $file_out"; # Abre drivers.md5
while (
{
chomp $_; # Quitamos el fin de línea
$_ =~ /(.*)::/; # Extrae el nombre del archivo (path incluido) de drivers.md5
$f = $1; # y lo pone en $f
$_ =~ /::(.*)/; # Extrae el MD5 del archivo de drivers.md5
$md5 = $1; # y lo pone en $md5
$md5_actual = file_md5_hex($f); # Generamos el MD5 del driver actual
# Y comparamos. Si hay discrepancia la pone, sino, no la pone
if ($md5 ne $md5_actual){print "\nCuidadito, el MD5 de $f no coincide.\n";}
}
close f_in; # Cerramos drivers.md5
}
sub principal # Empezamos aquí
{
$path1="C:\\WINDOWS\\system32\\"; # Primera ubicación de los drivers
$path2="C:\\WINDOWS\\system32\\drivers\\"; # Segunda ubicación de los drivers
$file_out = "drivers.md5"; # Nombre de archivo donde se guardarán los MD5 actuales
menu(); # Llama al menú
while ($opcion=
{
chomp $opcion; # Elimina el fin de línea
if ($opcion == 1){genera($path1,$path2);exit;} # Llama a sub genera
elsif ($opcion == 2){compara($file_out);exit;} # Llama a sub compara
elsif ($opcion == 3){exit;} # A la calle
else {$opcion = NULL;menu();} # Sino hay opción válida, volvemos.
}
}
principal(); # Esta es la primera función que se ejecuta
AVISO: Debido a que blogger elimina los símbolos mayor menor que, a este script le faltan algunas cosas para funcionar. El script completo puedes verlo y descargarlo en este enlace.
No hay comentarios:
Publicar un comentario