当前位置: 首页 > 科技观察

一小段Python代码破解加密zip文件密码

时间:2023-03-15 15:50:22 科技观察

今天的文章来自站查佐酒的同学。他在旧电脑中找到了一个加密的zip文件,并用Python破解了文件密码。破解过程中遇到内存爆炸的问题,通过阅读Python源码找到了解决办法。现在让我和你分享他的操作。在家里的旧电脑中,我发现了一个加密的zip存档。很久之后我忘记了密码。依稀记得密码是6个字母加数字。在网上下载了很多破解密码的软件,都没有用,于是想到了用。Python写了一个暴力破解密码的脚本。Python有一个内置的模块zipfile可以解压zip档案。我们先来测试一下:创建一个测试文件,压缩,设置解压密码为123importzipfile#创建文件句柄file=zipfile.ZipFile("Test.zip",'r')#解压压缩文件中的内容,注意密码必须是bytes格式,path表示从哪里提取file.extractall(path='.',pwd='123'.encode('utf-8'))运行效果如图如下图,提取成功。既然如此,我何不继续尝试所有可能的密码组合来解压呢?好了,下面开始破解旧文件的密码。为了提高速度,我还加入了多线程的代码:-8'))defresult(f):exception=f.exception()ifnotexception:#如果没有异常则破解成功print('password:',f.pwd)globalflagflag=Falseif__name__=='__main__':#创建一个flag用于判断密码是否破解成功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("encryptedfile.zip",'r')forpwdinpassword_lst:ifnotflag:breakf=pool.submit(extract,zfile,pwd)f.pwd=pwdf.pool=poolf.add_done_callback(result)然而,事情并没有那么简单……代码跑了一会,内存就炸了!于是,为了找到问题所在,查看了源码,发现ThreadPoolExecutor默认使用的是无界队列。但是在程序中尝试密码的速度赶不上制作密码的速度,制作任务会无限期地加入队列。导致内存满。内存直接飙到95:找到病根,剩下的就是对症下药了。继承并重写ThreadPoolExecutor类中的_work_queue属性,把无界队列改成有界队列,这样就不会出现内存满的问题,看代码:,thread_name_prefix=''):super().__init__(max_workers,thread_name_prefix)self._work_queue=queue.Queue(self._max_workers*2)#设置队列大小,将之前代码中的ThreadPoolExecutor替换为自定义的BoundedThreadPoolExecutor类。再次执行……程序输入如下:Bingo!破解成功!(原来密码这么简单。。。图)说了这么多,毕竟我隐约知道这个压缩包的位数和范围(字母和数字),所以破解需要的时间还是可以忍受的.如果有一天你在网上发现了一个无人认领的加密压缩包,想看一看却不知道里面有多少密码,那只能祝你好运了~