手把手教你怎么用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实现读取json文件到excel表
Nov 18 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
python实现简单登陆系统
Oct 18 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
Python批量启动多线程代码实例
Feb 18 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
python 利用toapi库自动生成api
Oct 19 Python
Python如何使用循环结构和分支结构
Apr 13 Python
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
浅谈pytorch中的dropout的概率p
May 27 #Python
You might like
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
jquery实现数字输入框
2017/02/22 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
vue移动端路由切换实例分析
2018/05/14 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
在Python中使用next()方法操作文件的教程
2015/05/24 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
django定期执行任务(实例讲解)
2017/11/03 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
Python2和Python3中@abstractmethod使用方法
2020/02/04 Python
Python实现播放和录制声音的功能
2020/08/12 Python
奥巴马的演讲稿
2014/05/15 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
机关作风建设自查报告
2014/10/22 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
工程资料员岗位职责
2015/04/13 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
Consul在linux环境的集群部署
2022/04/08 Servers
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js