重新构建暴力破解文件的实现思路,我们可以利用Python内置的zipfile模块。该模块提供了一个函数,可以传入压缩文件的路径,并通过返回值调用提取文件的方法。如果文件是加密的且密码不正确,程序会抛出异常。基于这个思路,我们可以通过读取一个字典文件(包含各种弱密码的txt文本文件),使用for循环来实现循环尝试。然而,使用单线程的Python来处理大型字典文本会非常耗时。因此,我们可以采用多线程来提高效率。多线程允许程序同时执行多个任务,从而大大减少处理时间。现在,让我们来看一下破解密码的效果演示。
- 首先,我们创建一个加密的zip文件,并自定义密码。
-
打开命令行,执行Python脚本。在这个例子中,我使用的是Git Bash Shell作为命令行工具,它是Windows下类似Linux命令行的工具,非常方便,兼容所有Linux命令。可以看到有一个进度条,进度条前面的数字表示每个密码都启动一个线程,字典文件总共有200万行,在读取到2万多行时,程序成功破解密码。接下来,您可以手动停止程序。
-
关于错误的zip密码。正常情况下,即使您输入错误的密码,加密的zip文件也可以被解压缩。只是相应的文本文件会被加密。因此,通过手动方式解压加密的zip文件,即使密码错误,也可以提取原始文本文件,只是内容会是乱码。
# 第一行通过调用optparse的函数创建一个parser的实例化对象
parser = optparse.OptionParser('n %prog -z -d ')
# 第二行添加一个参数,在命令行上输入-z xxxx 可将命令行上的zip路径作为字符串传入到变量zname中
parser.add_option('-z', dest='zname', type='string', help='specify zip file')
# 第三行添加一个参数,在命令行上输入-d xxxx 可将命令行上的字典文件作为字符串传入到变量dname中
parser.add_option('-d', dest='dname', type='string', help='specify dictionary file')
# 第四行进行解析,得到相关参数,得到options。
options, args = parser.parse_args()
# 第五行,通过zname和dname判断是否传入的参数为空
if options.zname and options.dname:
zip_name = options.zname
dict_name = options.dname
else:
print(parser.usage)
exit(0)
# 通过try-except来抓取运行程序时的异常,若报错,说明传入的文件不存在
try:
# 调用zipfile模块的实例对象方法,将zip路径传入
zip_file = zipfile.ZipFile(zip_name)
# 打开字典文件,用python自带的with关键词来打开,可以交由python自主关闭文件的资源
with open(dict_name, 'r', encoding='utf-8') as f:
# 读取每一行,并且将密码后的n 清空,也就是清空换行符
for line in tqdm(f.readlines()):
password = line.strip('n')
# 对每个密码开启线程去处理,调用extract_file函数,传入的参数为元组(zip_file, password)
thread = Thread(target=extract_file, args=(zip_file, password))
# 调用线程开始的方法
thread.start()
except Exception as e:
print(f'发生异常!请检查文件是否存在!异常信息为:{e}')
def extract_file(zip_file, password):
""" 提取压缩文件,通过密码不断尝试 """
try:
zip_file.extractall(pwd=bytes(password,'utf-8'))
print(f'n 发现密码,正确密码为:{password}')
except:
pass
现在,让我们来解释代码的实现。
-
命令行函数代码。
-
多线程函数代码。
假设我输入了错误的文件名,可以看到报错信息。
- 调用zipfile模块的核心代码。这段代码是多线程调用时触发的函数。
代码中还涉及到一些额外的知识点。
- 安装Python第三方库。Python的强大之处在于有许多好用的第三方库,可以直接拿来使用。为了方便查看文件读取的进度,我们额外安装了一个名为tqdm的第三方库,它是一个非常好用的进度条库。tqdm在阿拉伯语中表示”progress”,在西班牙语中则是”I love you so much”的缩写。以下是一个Python第三方库的官方网站的介绍。
在之前的课程中,如果您已经配置好了Python的环境变量,可以直接在命令行中进行安装,只需执行命令”pip install 模块名”即可,如下图所示。
因为我已经安装过了,所以会显示已安装的信息。如果您尚未安装,可以看到下载的进度条,最后显示安装成功。
- optparse、zipfile、tqdm模块的简介。
optparse是Python自带的库,通过上面介绍的代码,可以像使用Linux命令一样带参数执行。以下是一个示例。
zipfile是Python自带的库,可以对zip文件进行解压缩。这是本文重点介绍的模块。需要注意的是,在使用extractall函数时,需要将传入的密码字符串进行字节编码转换。示例代码如下。
zip_file.extractall(pwd=bytes(password,’utf-8′))
关于解压出来的文件名可能出现乱码的情况,请参考文章。
tqdm是一个需要安装的第三方库,可以在可迭代对象上使用。例如:
for line in tqdm(f.readlines()):
爆破字典的项目。
爆破字典的开源项目中收录了许多相关的密码,您可以将其标记为star或fork到自己的仓库以备使用。项目地址如下。
本文的完整代码地址如下。
至此,文章结束!