手把手教你怎么用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文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
Python中的with...as用法介绍
May 28 Python
Python计算一个文件里字数的方法
Jun 15 Python
Python 迭代器工具包【推荐】
May 06 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
python 字典中取值的两种方法小结
Aug 02 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
使用python-opencv读取视频,计算视频总帧数及FPS的实现
Dec 10 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
Python如何使用队列方式实现多线程爬虫
May 12 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中的MVC模式运用技巧
2007/05/03 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
JQuery插件开发示例代码
2013/11/06 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
jQuery与Ajax以及序列化
2016/02/01 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
javascript 判断页面访问方式电脑或者移动端
2016/09/19 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
捷克时尚网上商店:OTTO
2018/03/15 全球购物
通信工程专业女生个人求职信
2013/09/21 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
鸟的天堂导游词
2015/01/31 职场文书
2014年终个人总结报告
2015/03/09 职场文书
交通事故起诉书
2015/05/19 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android