之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本。
Python有一个内置模块zipfile可以干这个事情,测试一波,一个测试文件,设置解压密码为123。
- import zipfile
- # 创建文件句柄
- file = zipfile.ZipFile("测试.zip", 'r')
- # 提取压缩文件中的内容,注意密码必须是bytes格式,path表示提取到哪
- file.extractall(path='.', pwd='123'.encode('utf-8'))
运行效果如下图所示,提取成功。
好了开始破解老文件的密码,为了提高速度我加了多线程最初的代码:
- import zipfile
- import itertools
- from concurrent.futures import ThreadPoolExecutor
- def extract(file, password):
- if not flag: return
- file.extractall(path='.', pwd=''.join(password).encode('utf-8'))
- def result(f):
- exception = f.exception()
- if not exception:
- # 如果获取不到异常说明破解成功
- print('密码为:', f.pwd)
- global flag
- flag = False
- if __name__ == '__main__':
- # 创建一个标志用于判断密码是否破解成功
- flag = True
- # 创建一个线程池
- pool = ThreadPoolExecutor(100)
- nums = [str(i) for i in range(10)]
- chrs = [chr(i) for i in range(65, 91)]
- # 生成数字+字母的6位数密码
- password_lst = itertools.permutations(nums + chrs, 6)
- # 创建文件句柄
- zfile = zipfile.ZipFile("加密文件.zip", 'r')
- for pwd in password_lst:
- if not flag: break
- f = pool.submit(extract, zfile, pwd)
- f.pwd = pwd
- f.pool = pool
- f.add_done_callback(result)
这个代码有个问题,跑一会儿内存就爆了!原因:ThreadPoolExecutor默认使用的是无界队列,尝试密码的速度跟不上生产密码的速度,会把生产任务无限添加到队列中。导致内存被占满。内存直接飙到95:
然后程序奔溃:
看了一下源码发现ThreadPoolExecutor内部使用的是无界队列,所以导致内存直接飙满,重写ThreadPoolExecutor类中的_work_queue属性,将无界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:
- import queue
- from concurrent.futures import ThreadPoolExecutor
- class BoundedThreadPoolExecutor(ThreadPoolExecutor):
- def __init__(self, max_workers=None, thread_name_prefix=''):
- super().__init__(max_workers, thread_name_prefix)
- self._work_queue = queue.Queue(self._max_workers * 2) # 设置队列大小
最后破解成功,如下图所示。
近日,“阿里云星云扶持计划”第一站来到了上海金桥。 此次活动由上海金桥经济技...
.tech域名 注册一年多少钱?普通. tech域名 注册一年的价格是48元,不过.tech 域...
独享云虚拟主机 价格?独享 云虚拟主机 是指,部分 服务器 资源独享使用的云 虚...
中文 域名 能备案吗?能的,目前以下这些域名都是支持备案的,大家在注册的时候...
2020年发生的冠状病毒疫情对我们这个世界产生了重大影响,对于IT行业尤其是云计...
本篇文章围绕了 CSS 的核心知识点和项目中常见的需求来展开。虽然行文偏长,但偏...
今天的文章不长,但是干货还是不少的。对于数据可视化,我觉得在设计原理上其实...
TOP云 12月25日讯,昨日平安夜,TOP云成功结拍一枚极品单拼 域名 ji.red。据悉,...
独立 域名 怎么备案? 域名备案 是随着 网站空间 的,在哪里买的网站空间,就到...
SUSE收购Rancher Pure Storage收购Portworx Veeam收购Kasten VMware收购Octarine...