手把手教你怎么用Python实现zip文件密码的破解


Posted in Python onMay 27, 2021

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

手把手教你怎么用Python实现zip文件密码的破解

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

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

手把手教你怎么用Python实现zip文件密码的破解

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

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:

手把手教你怎么用Python实现zip文件密码的破解

然后程序奔溃:

手把手教你怎么用Python实现zip文件密码的破解

看了一下源码发现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) # 设置队列大小

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

手把手教你怎么用Python实现zip文件密码的破解

到此这篇关于手把手教你怎么用Python实现zip文件密码的破解的文章就介绍到这了,更多相关Python破解zip密码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python在命令行下使用google翻译(带语音)
Jan 16 Python
Python解析nginx日志文件
May 11 Python
Python中字典的基本知识初步介绍
May 21 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
Pandas DataFrame 取一行数据会得到Series的方法
Nov 10 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
python绘制地震散点图
Jun 18 Python
Django实现文件上传下载功能
Oct 06 Python
教你用Python matplotlib库制作简单的动画
Jun 11 Python
python开发制作好看的时钟效果
May 02 Python
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
浅谈pytorch中的dropout的概率p
May 27 #Python
You might like
PHP制作万年历
2015/01/07 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
php取出数组单个值的方法
2018/03/12 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
Js获取事件对象代码
2010/08/05 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
详解如何在Javascript和Sass之间共享变量
2019/11/13 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
python 实现图片批量压缩的示例
2020/12/18 Python
服装行业创业计划书范文
2014/02/05 职场文书
小学生家长寄语
2014/04/02 职场文书
部门活动策划方案
2014/08/16 职场文书
员工团队活动方案
2014/08/28 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
MySQL sql模式设置引起的问题
2022/05/15 MySQL