martes, diciembre 11, 2012

Ordenar y limpiar archivos grandotes con Ruby y Bash


Curiosidad:

Tengo una colección de diccionarios que me pasó Dinno hace un tiempo. Quería dejar el aircrack cotejándolos, pero son 44 archivos, y quería ver como serializarlos, es decir, procesarlos a todos. Ademas, estoy seguro que hay palabras que se repiten entre los diccionarios.
Se me ocurrió unir todos los archivos en uno solo, ordenar las palabras internamente, y borrar las duplicadas.

Unificar todos los diccionarios en uno solo, se pudo hacer directamente desde el irb:

archivos = Dir.entries(".")
=> ["numeros.txt", "HackPass-1.txt", "pass_habituales2.txt", "passlist.txt", "passlist-3.txt", "user.txt", "otras_palabras.txt", "HackPass-3.txt", "passwordjhon.lst", "passwords.txt", etc etc

archivos.size.times do
system("cat #{archivos[i]} >> TODOS.txt")
i = i + 1
end

Listo, ahora tengo un archivo de 141 MB. Luego, para ordenarlo y limpiarlo, me dio fiaca y use el viejo uniq:

cat TODOS.txt | sort | uniq > TODOS_LIMPIOS.txt

Si comparamos tamaños:
ls -lh TODOS*
-rw-rw-r-- 1 s s  95M dic 12 00:01 TODOS_LIMPIOS.txt
-rw-rw-r-- 1 s s 141M dic 11 23:56 TODOS.txt

¡Que diferencia! y esto implica MUCHO tiempo de proceso menos para aircrack ;)

Es decir, comparemos la cantidad de palabras:

wc -l TODOS* 

11.035.510 TODOS_LIMPIOS.txt
15.746.349 TODOS.txt

Esto implica 4.710.839 menos comparaciones que deberá hacer nuestro querido amigo aircrack. Y por cierto, la resta de este numero al total de claves es importante para saber cuanto le falta al programa para terminar, ya que si bien va mostrando la cantidad de claves analizadas, no muestra cuantas les queda por procesar.

Es decir, si lanzo:

aircrack-ng -w TODOS_LIMPIOS.txt -b C8:6C:87:56:5E:0D speedynet.cap 

Y veo que mi CPU es capaz de procesar aproximadamente 1300 claves por segundo, puedo saber que

11035510 / 1300 / 60 / 60 = 2.35 hs

Y a esperar. Bastante menos, espero ;)

1 comentario:

Anónimo dijo...

No crees que es hora de compartir el diccionario ???

Un Abrazo