El comando hdiutil combinado con un un poco de scripting de bash puede lograr lo que estás buscando. Necesitará un archivo de texto simple con cada contraseña en una línea separada, que termina con una línea en blanco .
-
Copia y pega esto en un archivo de texto:
#!/bin/bash
while read line
do
echo -n "$line" | hdiutil attach -quiet -stdinpass "$1"
if [ $? -eq 0 ]; then
echo "Password is $line"
break
fi
done < "$2"
-
Guárdalo y hazlo ejecutable ejecutando chmod +x /path/to/scriptfile
en la Terminal.
- En la Terminal, ejecuta
/path/to/scriptfile /path/to/image.dmg /path/to/passwords.txt
.
- Se ejecutará hasta que monte con éxito la imagen del disco, y generará la contraseña que funcionó. En mis pruebas, tomó 1.3-1.6 segundos por contraseña, por lo que 3000 contraseñas pueden tardar alrededor de una hora, dependiendo de su sistema (aunque podría ser más rápido dependiendo de dónde esté la contraseña en el archivo).
Eso debería hacer el truco. Si tienes curiosidad por saber cómo y por qué funciona, sigue leyendo.
Explicación
Mientras bucle
while read line
do
[…]
done < "$2"
Esto recorre cada línea en el archivo de contraseña (que se alimenta a través de la parte < "$2"
) y ejecuta el material entre do
y done
cada vez que se repite. $2
es una variable especial en Bash que representa el segundo argumento pasado al script (es decir, si ejecuta ./foo bar blah
, $2
sería blah
). Está entre comillas en caso de que haya espacios u otros caracteres en el nombre que puedan causar problemas para Bash.
Montando la imagen
hdiutil attach -quiet -stdinpass "$1"'
Este es el comando para montar realmente la imagen de disco (que obtenemos de los argumentos de la línea de comandos a través de la variable $1
, al igual que el archivo de contraseña). El indicador -quiet
significa no imprimir ninguna salida (solo para mantener las cosas ordenadas), y -stdinpass
significa obtener la contraseña de la línea de comando , no el diálogo de contraseña habitual de OS X.
echo -n "$line"
El comando echo
simplemente repite la entrada que se le da, que en este caso es una línea individual del archivo de contraseñas, de la variable $line
(que se cita nuevamente en caso de que las contraseñas contengan caracteres especiales). La bandera -n
es la pieza final de este rompecabezas, evita que el eco repita el carácter nueva línea , que se incluiría en la contraseña (y así evitar que funcione incluso la contraseña correcta).
Usamos echo
con un "pipe" ( |
) para enviar a hdiutil
la contraseña. Una tubería envía la salida del comando anterior ( echo
) al comando después de la tubería ( hdiutil
). De esta manera, en lugar de pedirnos la contraseña, hdiutil
simplemente toma el texto que leemos del archivo.
Comprobando si la contraseña fue exitosa
if [ $? -eq 0 ]
Esto comprueba si el comando anterior fue exitoso, al verificar su código de salida . El $?
es otra variable especial que almacena el código de salida de la operación anterior.
Si el código de salida es 0 (sin errores), entonces sabemos que la contraseña funcionó y que la instrucción if ejecuta estas líneas:
echo "Password is $line"
break
Esto muestra un mensaje simple que indica al usuario cuál es la contraseña correcta, luego el comando break
sale del bucle while
y finaliza el programa. Hacemos esto porque la secuencia de comandos continuaría hasta que se compruebe cada contraseña en el archivo.
La combinación de todas estas piezas juntas le brinda una manera conveniente de automatizar una tarea larga y dolorosa.