Mostrando entradas con la etiqueta md5. Mostrar todas las entradas
Mostrando entradas con la etiqueta md5. Mostrar todas las entradas

martes, 27 de enero de 2009

Protege los drivers de tu Windows, y 2

El script del post anterior sólo trabaja con MD5: crea MD5 de los drivers actuales a un archivo (drivers.md5) y también puede comprobarlos en un futuro.

Pero le falta una cosa importante: si hay drivers nuevos no los procesa porque toma como referencia el archivo drivers.md5, y en base a su contenido comprueba si existe el driver correspondiente en el sistema, sin realizar un recorrido en éste. Por tanto, sólo procesa los que tiene en drivers.md5 ignorando los nuevos que pudieran existir. Esta funcionalidad es crítica y necesaria puesto que necesitamos saber si algún driver ha sido instalado en el sistema desde la última "foto" que le hicimos.

Para ofrecer esta nueva funcionalidad, he ampliado el script dando una opción más que es: Comprobar drivers nuevos. Además, como ahora he utilizado contadores para contar tanto los drivers en drivers.md5 como en el sistema, los resultados en general se han ampliado.

Como los cambios son significativos respecto al script anterior, a éste lo he llamado control-drivers.pl y su versión es la 1.0.

Y para evitar erratas producidas por blogger, el nuevo script se encuentra en este enlace.

lunes, 26 de enero de 2009

Protege los drivers de tu Windows

En base al trabajo del post anterior, podemos eliminar los drivers que no utilizamos, y si el resto es de confianza, podemos controlarlos haciéndolos una foto con MD5 para después compararlos con la realidad. De esta forma sabremos si alguno es modificado.

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 () # Leemos línea a línea hasta la última
{
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=) # Espera opción desde el teclado para meterla en $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

-------------- Final md5-drivers.pl -------------------------------

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.

sábado, 24 de enero de 2009

Perl, MD5 y los drivers sospechosos de Windows

En Windows, los drivers que normalmente están alojados en

c:\windows\system32 y

c:\windows\system32\drivers,

pueden ejecutarse en el espacio de memoria del núcleo y por tanto, pueden hacer lo que quieran en el sistema. Estos archivos suelen tener la extensión .sys, y normalmente no se les presta atención.

Hay drivers que ya los pone Windows, otros se alojan ahí cuando instalamos algún dispositivo, y hasta hay programas que también dejan ahí su .sys para hacer cosas. Los virus también los utilizan para sus cometidos, y con más frecuencia que lo que creemos.

Se inicie el driver o no al encender el ordenador dependerá si el driver es llamado desde el registro. Para ver esto, aconsejo autoruns de Sysinternals.

A veces es difícil saber si un .sys es de fiar o no, aunque consultemos en la red. Una forma de averiguarlo es, si sospechamos de alguno, crear una carpeta en la misma carpeta donde se aloja el driver y moverlo ahí. Después reiniciamos y a ver que pasa. Si hemos movido un driver crítico del sistema, seguramente nos toque arrancar con un live-cd y volver a poner el driver en su ubicación original. Sino ocurre nada, podemos esperar a ver que pasa, y si sigue sin pasar nada, pues lo mismo ese driver no se usa.

Si da la casualidad de que hemos movido un driver que es utilizado por algún virus u otro programa malicioso, es posible que, si el virus está en memoria, lo vuelva a crear incluso con otro nombre, y aquí es donde entra el

MD5

El MD5 de un archivo es un resumen del contenido del archivo y además es único para ese archivo. Lo bueno es que ese resumen sólo ocupa 32 dígitos hexadecimales (128 bits), ocupe lo que ocupe el archivo. De esta forma, con estos 32 dígitos podemos verificar la integridad de un archivo.

Si hemos apartado los drivers sospechosos a una carpeta llamada "sospechosos", podemos calcular el MD5 de cada uno y crear un archivo de texto donde cada línea tendrá el nombre del archivo y su MD5. Después, si alguno de estos drivers sospechosos es el resultado de un virus y éste vuelve a crear el driver, aunque sea con otro nombre, para identificarlo podemos comparar los MD5 sospechosos que contiene nuestro archivo de texto con los MD5 de los archivos de las carpetas de sistema de Windows (system32 y system32\drivers) hasta que salte la coincidencia. Si el nuevo driver tiene otro nombre y el mismo MD5, se trata de un virus seguro.

Entrando en harina

Primero vamos a hacer un pequeño script en perl llamado md5.pl para sacar los MD5 de un archivo dado:

------- comienzo md5.pl -----------------------------------------------
# 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);

if ($ARGV[0]) {$archivo = $ARGV[0];}
else {print "\n";print "Sintaxis: perl md5.pl nombre_archivo.\n";exit;}

if ( -e $archivo )
{
    $md5 = file_md5_hex($archivo);
    print "\n";print "El MD5 de $archivo es: $md5\n";
}
else {print "\n";print "Sintaxis: perl md5.pl nombre_archivo.\n";exit;}
------- fin md5.pl ----------------------------------------------------


Con este script podemos sacar los MD5 de los archivos sospechosos. Después, en la carpeta de trabajo, creamos un archivo de texto llamado drivers-sospechosos.txt, donde cada línea contendrá cada nombre de archivo sospechoso y su MD5 correspondiente. Para separar el nombre del archivo y su MD5 utilizaremos "::" como vemos en este ejemplo:

data.sys::ee2f07a2d1f81e2f5a8a454f61d9395a

Cuando tengamos drivers-sospechosos.txt lleno con los archivos (drivers) sospechosos y sus MD5, y además tengamos movidos dichos archivos a la carpeta "sospechosos", podemos esperar unos días y ejecutar el siguiente script que realizará la búsqueda-comprobación:

------- comienzo drivers-sospechosos.pl ----------------------------------------

# Los drivers sospechosos de c:\windows\system32 y c:\windows\system32\drivers
# han sido movidos a la carpeta "sospechosos" que está en la misma carpeta donde
# estaba el driver sospechoso.

# Cada uno de los nombres de estos drivers sospechosos junto con su MD5 están en
# una línea de drivers-sospechosos.txt, y éste archivo está en la carpeta de trabajo.

# Este script busca los MD5 de los archivos de drivers-sospechosos.txt
# en c:\windows\system32 y c:\windows\system32\drivers
# para comprobar si existe alguna coincidencia.

# Este script asume que la carpeta de trabajo es 
# C:\WORKSPACE\drivers-sospechosos 
# y que dentro está el archivo drivers-sospechosos.txt con los nombres y MD5 
# de los archivos sospechosos, uno por línea y este mismo script, claro.

# Este script también asume que por cada línea de drivers-sospechosos.txt hay
# un nombre de driver sospechoso, una separación "::" y su MD5.

# 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);

# Ubicación del archivo con los archivos sospechosos

$path_filein = "C:\\WORKSPACE\\drivers-sospechosos\\drivers-sospechosos.txt";

# Función principal

sub todo 
{
    # Apertura drivers-sospechosos.txt
    open f_drivers, $path_filein or die "No puedo abrir $path_filein";
    $c = 0; #Número de coincidencias
 
    while( ) # Abro drivers-sospechosos.txt y lee línea a línea
    {
        chomp $_; # Quita el fin de línea, que si se queda esto no funciona
  
        $_ =~ /(.*)::/; # Extrae el nombre del archivo 
        $filein = $1; # y lo pone en $filein
  
        $_ =~ /::(.*)/; # Extrae el MD5 del archivo 
        $fileinmd5 = $1; # y lo pone en $md5
  
        $path = "C:\\WINDOWS\\system32\\"; 
        proceso($path,$filein,$fileinmd5); # Búsqueda en system32
  
        $path = "C:\\WINDOWS\\system32\\drivers\\";  
        proceso($path,$filein,$fileinmd5); # Búsqueda en drivers
    }
    close f_drivers; # Cierra drivers-sospechosos.txt
    print "\n";
    print "Coincidencias: $c\n"; # Muestra número de coincidencias
}
 
# Función de búsqueda por cada $path

sub proceso($path,$filein,$fileinmd5) 
{
    opendir DIRECTORY, $path or die; # Abre la carpeta $path
 
    # Recorre $path y deja en $file cada nombre de archivo
 
    while ($file = readdir(DIRECTORY)) 
    {  
        if ( -d $path.$file ){# $file es un directorio}
        else # $file es un archivo
        {  
            $filemd5 = file_md5_hex($path.$file); # Calcula el MD5 de $file
   
            if ($filemd5 eq $fileinmd5) # Si los MD5 coinciden, premio
            {
                print "\n";
                print "Cuidadito, $path$file tiene el mismo MD5 que $filein.\n";
                $c++;
            }
        }
    }
}

todo();

------- fin drivers-sospechosos.pl ---------------------------------------------

Este proceso normalmente tarda un buen rato, así que podeis ir a preparar un café y esperar a que a la vuelta no haya premio.