手把手教你怎么用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自动化工具日志查询分析脚本代码实现
Nov 26 Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 Python
python中列表元素连接方法join用法实例
Apr 07 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
深度学习tensorflow基础mnist
Apr 14 Python
只用Python就可以制作的简单词云
Jun 07 Python
Python基础学习之奇异的GUI对话框
教你使用pyinstaller打包Python教程
Matplotlib绘制混淆矩阵的实现
只需要100行Python代码就可以实现的贪吃蛇小游戏
PyTorch dropout设置训练和测试模式的实现
May 27 #Python
pytorch Dropout过拟合的操作
浅谈pytorch中的dropout的概率p
May 27 #Python
You might like
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
用php写的serv-u的web申请账号的程序
2006/10/09 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
php统计文章排行示例
2014/03/04 PHP
php二维码生成
2015/10/19 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
Python多线程和队列操作实例
2015/06/21 Python
Ubuntu下创建虚拟独立的Python环境全过程
2017/02/10 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
班组长安全生产职责
2013/12/16 职场文书
车贷收入证明范本
2014/01/09 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
优秀护士获奖感言
2014/02/20 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
流动人口婚育证明
2014/10/19 职场文书
佛光寺导游词
2015/02/10 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL