一、前言
对于密码破解软件重要的就是字典了。好的字典可以让破解工作事半功倍。但是通常我们需要用多个字典来进行破解,其中难免有重复的内容,这样无疑会给破解软件带来不必要的重复计算,增大破解时间
通过shell配合命令行工具可以实现字典的合并去重。本文使用shell脚本实现对多个字典文件的合并与去重。以提高字典的质量
二、实现过程
2.1 检测文件输入
在shell中,'$#'代表传入脚本的参数个数,通过对脚本参数个数判断是否有文件作为参数输入。并且判断文件是否存在。'${@:$i:1}'表示脚本第i个参数的名称也就是输入的第i个文件。
if [ $# -lt 1 ]
then
echo "请输入要排序的文件"
exit
fi
for ((i=1;i<$#+1;i++))
do
if [ ! =f ${@:$i:1} ]
then
echo "错误!${@:$i:1}文件不存在"
exit
fi
done
2.2 合并字典文件
使用for循环和cat命令,将所有文件依次合并成一个文件out.txt
for ((i=1;i<$#+1;i++))
do
cat ${@:$i:1} >>out.txt
done
2.3 排序和去重
由于去重命令只支持经过sort排序后的文件,因此需要将out.txt进行sort排序,然后将其去重
sort out.txt >out1.txt
uniq out1.txt >out2.txt
2.4 字典信息显示
使用以下命令可以查看字典文件的行数
cat dic.txt|wc -l
使用以下命令可以查看字典文件的大小
ls -hl dic.txt|awk '{print $5}'
三、运行
使用脚本合并'beini.txt'和'wordlistBT4.txt'两个字典。成功合并后结果如下:

查看合并后的文件

实测在虚拟机中运行该脚本合并共1.1g的字典文件用了17分钟,在真机上运行应该会更快。
四、源代码
#!/bin/bash
if [ $# -lt 1 ]
then
echo "请输入要排序的文件"
exit
fi
for ((i=1;i<$#+1;i++))
do
if [ ! =f ${@:$i:1} ]
then
echo "错误!${@:$i:1}文件不存在"
exit
fi
done
mkdir combined 2>/dev/null
#区域设置,保持程序输出格式一致
export LC_ALL='C'
for ((i=1;i<$#+1;i++))
do
echo 正在合并 ${@:$i:1}
echo 单词数:`cat $${@:$i:1}|wc -l`
echo 大小:`ls -hl ${@:$i:1}|awk '{print $5}'`
cat ${@:$i:1}|sed '/^$/d' >>combined/out.txt
done
echo 正在排序...
sort combined/out.txt >combined/out1.txt
echo 正在去重...
uniq combined/out1.txt >combined/out2.txt
rm combined/out.txt combined/out1.txt&&mv combined/out2.txt combined/out.txt
echo 完成
echo 去重合并后的文件: ./combined/out.txt
echo 总单词数:`cat combined/out.txt|wc -l`
echo 总大小:`ls -hl combined/out.txt|awk '{print $5}'`