手把手教你怎么用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字符串处理之count()方法的使用
May 18 Python
Python while 循环使用的简单实例
Jun 08 Python
python入门前的第一课 python怎样入门
Mar 06 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
python对绑定事件的鼠标、按键的判断实例
Jul 17 Python
python根据时间获取周数代码实例
Sep 30 Python
python编程进阶之类和对象用法实例分析
Feb 21 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
python logging.info在终端没输出的解决
May 12 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
python import 上级目录的导入
Nov 03 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 Python
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
浅谈pytorch中的dropout的概率p
May 27 #Python
You might like
在数据量大(超过10万)的情况下
2007/01/15 PHP
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
PHP中读写文件实现代码
2011/10/20 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
django中的ajax组件教程详解
2018/10/18 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python实现冒泡排序的简单应用示例
2017/12/11 Python
Python用for循环实现九九乘法表
2018/05/31 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python3实现高效的端口扫描
2019/08/31 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
python爬取代理ip的示例
2020/12/18 Python
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
编写strcpy函数
2014/06/24 面试题
经典c++面试题二
2015/08/14 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
优秀经理事迹材料
2014/02/01 职场文书
团委竞选演讲稿
2014/04/24 职场文书
煤矿安全保证书
2015/02/27 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers