破解压缩文件密码软件(教你秒破加密的zip压缩文件)

今天的文章来自【盏茶作酒】同学。这位同学在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决方案。

回复“书籍”即可获赠Python从入门到进阶共10本电子书

置酒长安道,同心与我违。

破解压缩文件密码软件(教你秒破加密的zip压缩文件)

摄影:产品经理海鲜咖喱泡饭

之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本。

Python有一个内置模块zipfile可以干这个事情,测试一波,一个测试文件,设置解压密码为123。

importzipfile#创建文件句柄file=zipfile.ZipFile(“测试.zip”,’r’)#提取压缩文件中的内容,注意密码必须是bytes格式,path表示提取到哪file.extractall(path=’.’,pwd=’123′.encode(‘utf-8’))

运行效果如下图所示,提取成功。

好了开始破解老文件的密码,为了提高速度我加了多线程最初的代码:

importzipfileimportitertoolsfromconcurrent.futuresimportThreadPoolExecutordefextract(file,password):ifnotflag:returnfile.extractall(path=’.’,pwd=”.join(password).encode(‘utf-8’))defresult(f):exception=f.exception()ifnotexception:#如果获取不到异常说明破解成功print(‘密码为:’,f.pwd)globalflagflag=Falseif__name__==’__main__’:#创建一个标志用于判断密码是否破解成功flag=True#创建一个线程池pool=ThreadPoolExecutor(100)nums=[str(i)foriinrange(10)]chrs=[chr(i)foriinrange(65,91)]#生成数字 字母的6位数密码password_lst=itertools.permutations(nums chrs,6)#创建文件句柄zfile=zipfile.ZipFile(“加密文件.zip”,’r’)forpwdinpassword_lst:ifnotflag:breakf=pool.submit(extract,zfile,pwd)f.pwd=pwdf.pool=poolf.add_done_callback(result)

这个代码有个问题,跑一会儿内存就爆了!原因:ThreadPoolExecutor默认使用的是无界队列,尝试密码的速度跟不上生产密码的速度,会把生产任务无限添加到队列中。导致内存被占满。内存直接飙到95:

然后程序奔溃:

看了一下源码发现ThreadPoolExecutor内部使用的是无界队列,所以导致内存直接飙满,重写ThreadPoolExecutor类中的_work_queue属性,将无界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:

importqueuefromconcurrent.futuresimportThreadPoolExecutorclassBoundedThreadPoolExecutor(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)#设置队列大小

最后破解成功,如下图所示。

——————-End——————-

往期精彩文章推荐:

一篇文章带你解锁Python库中操作系统级别模块psutil(Python实战文)一篇文章教会你Arrow 时间库在项目中的实际应用一篇文章带你了解Django ORM操作(高端篇)

想加入Python学习群请在后台回复【入群】

/今日留言主题/

随便说一两句吧~~

发表评论

登录后才能评论