Python实现爆破ZIP文件(支持纯数字,数字+字母,密码本)

目录
  • 乱码问题
  • 单线程纯数字爆破
  • 单线程数字字母爆破
  • 多线程爆破密码本
  • 单线程爆破3合1版(支持数字,数字+字母、密码本)

乱码问题

破解压缩包时候会存在中文乱码问题!

1:直接使用Everything搜索出要修改的库文件 zipfile.py ,并用notepad++打开

2:修改的第一段代码

大概位置在1374行

if flags & 0x800:
    # UTF-8 file names extension
    filename = filename.decode('utf-8')
else:
    # Historical ZIP filename encoding
    filename = filename.decode('gbk') # 把cp437修改为gbk

3:修改的第2段代码

大概在1553行

这里也是与解决办法2的链接中不一致的地方。if语句的内容不一样,可能是zipfile升级的缘故

if fheader[_FH_GENERAL_PURPOSE_FLAG_BITS] & 0x800:
    # UTF-8 filename
    fname_str = fname.decode("utf-8")
else:
    fname_str = fname.decode("gbk")   # 把原来的cp437更改为gbk

4:保存退出即可

单线程纯数字爆破

需要指定一下第6行(压缩包的位置),第20行(密码区间)

import zipfile
import os
import time
import sys

os.chdir(r'C:\Users\asuka\Desktop\123')
start_time = time.time()

# 获取zip文件
def get_zipfile():
    files = os.listdir()
    for file in files:
        if file.endswith('.zip'):
            return file

# 用来提取zip文件
def extract():
    file = get_zipfile()
    zfile = zipfile.ZipFile(file)  # 读取压缩文件
    for num in range(1, 1000000):  # 设置数字密码区间
        try:
            pwd = str(num)
            zfile.extractall(path='.', pwd=pwd.encode('utf-8'))
            print('解压密码是:', pwd)
            end_time = time.time()
            print('单线程破解压缩包花了%s秒' % (end_time - start_time))
            sys.exit(0)  # 让程序在得到结果后,就停止运行,正常退出
        except Exception as e:
            pass

if __name__ == "__main__":
    extract()

单线程数字字母爆破

脚本默认工作在脚本所在的路径,如需更改,请手动修改第49行

import zipfile
import time
import sys
import random
import os

class MyIter(object):
    word = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  # 原始的密码本

    def __init__(self, min_len, max_len):  # 迭代器实现初始方法,传入参数
        # 下面的if-else是为了解决extract函数中,for循环中传递的密码长度可能前者的值大于后者,这一bug
        if min_len < max_len:
            self.min_len = min_len
            self.max_len = max_len
        else:
            self.min_len = max_len
            self.max_len = min_len

    def __iter__(self):  # 直接返回self实列对象
        return self

    def __next__(self):  # 通过不断地轮循,生成密码
        result_word = ''
        for i in range(0, random.randint(self.min_len, self.max_len)):  # randint取值为[]左右闭区间
            result_word += random.choice(MyIter.word)  # 从word中随机取选取一个值,并把选取几次的结果拼接成一个字符,即一个密码
        return result_word

def extract():
    start_time = time.time()
    zip_file = zipfile.ZipFile('1.zip', 'r')
    for password in MyIter(password_min, password_max):  # 随机迭代出1~4位数的密码,在不明确位数的时候做相应的调整
        if zip_file:
            try:
                zip_file.extractall(path='.', pwd=str(password).encode('utf-8'))
                print("压缩密码为:", password)
                end_time = time.time()
                print('破解压缩包花了%s秒' % (end_time - start_time))
                sys.exit(0)
            except Exception as e:
                print('pass密码:', password)
                pass

if __name__ == "__main__":
    password_min = 5    # 设置密码区间长度
    password_max = 6    # 设置密码区间长度
    os.chdir(r'C:\Users\asuka\Desktop\123')  # 移动到目标所在文件夹
    extract()

多线程爆破密码本

脚本存在一些缺陷,无法打印出extractfile函数中正确密码

第38行指定工作路径

第39行指定密码本

import zipfile
from threading import Thread
import sys
import os

'''
多线程爆破完成
'''

def extractfile(zip_file, password):
    try:
        zip_file.extractall(path='.', pwd=str(password).encode('utf-8'))
        print('[+]' + zip_file + ' 解压密码是:', password)
        sys.exit(0)
    except Exception as e:
        # print('pass错误密码:', password)
        pass

def main(password_file):
    files = os.listdir()
    for file in files:  # 遍历当前路径下的所有文件
        if file.endswith('.zip'):  # 爆破zip文件
            zip_file = zipfile.ZipFile(file)
            pass_file = open(password_file)
            for line in pass_file.readlines():
                password = line.strip('\n')
                t = Thread(target=extractfile, args=(zip_file, password))
                t.start()

if __name__ == '__main__':
    '''
    脚本默认会对脚本所在文件夹中的zip文件爆破
    脚本存在一些缺陷,无法打印出extractfile函数中正确密码
    需要手动去终端复制最后一行,那个才是正确密码,用正确密码手动解压文件即可
    '''
    os.chdir(r'C:\Users\asuka\Desktop\123')
    password_file = r'C:\Users\asuka\Desktop\123\password.txt'  # 用来指定密码本的路径
    main(password_file)

单线程爆破3合1版(支持数字,数字+字母、密码本)

第213行,可以指定脚本工作路径

如果删除第213行,脚本会工作在,脚本所在位置

import zipfile
import os
import time
import sys
import random

'''
源代码描述:
1:代码中,变量统一使用zip代表压缩包

2:关于空密码
测试发现,当一个压缩包是无密码的时候,给extractall的pwd参数指定密码,依然可以正确提取压缩包
因此无需写代码检查压缩包时候有密码
否则,检查有无密码报异常,有密码爆破再爆异常,搞得代码会很复杂

3:关于zfile.extractall
破解密码用到的zfile.extractall中
extractall要求输入的是字节类型,所以需要手动转

4:关于异常,前面的那段注释
使用try/except时候,pycharm报告Exception太宽泛,我们应该指定异常类型
如果不确定有可能发生的错误类型
在 try 语句前加入 # noinspection PyBroadException 即可让pycharm闭嘴
但是except Exception as e中的e仍然会被pycharm报告说,这个变量没有使用

5:关于解压乱码
我这里是通过修改zipfile的源代码来解决的
修改源代码时,如果无法找到【if zinfo.flag_bits & 0x800】
可能是zipfile版本的问题,请试着搜索【if fheader[_FH_GENERAL_PURPOSE_FLAG_BITS] & 0x800】,或者【fname_str = fname.decode("utf-8")】
定位的方式是多样的,不必拘泥
详情参见:
https://secsilm.blog.csdn.net/article/details/79829247
https://wshuo.blog.csdn.net/article/details/80146766?spm=1001.2014.3001.5506

6:关于代码运行位置
由于我的代码往往跟操作的文件不在一个地方,所以在run()函数中使用
#os.chdir(r'')  # 此路径是测试的时候使用,用来手动设定压缩包路径
来手动设定脚本工作目录
'''

# 主备前提工作:检查出当前路径中的压缩包,并创建一个同名的文件夹
def ready_work():
    files = os.listdir()  # 获取脚本工作路径中的所有文件

    for file in files:  # 遍历脚本工作路径中的所有文件
        if file.endswith('.zip'):  # 找出脚本工作路径中的所有zip文件
            # 开始制造一个新文件夹的路径,用来存放解压结果
            a = os.path.splitext(file)  # 分离压缩包的名字和后缀
            new_path = os.path.join(os.path.abspath('.'), str(a[0]))  # 把当前脚本运行的路径和压缩包的文件名拼接成新的路径
            # 检查新文件夹的路径是否已存在,如果有就直接使用,如果没有就创建它
            if os.path.exists(new_path):
                pass
            else:
                os.makedirs(new_path)
            return new_path, file

# 纯数字爆破
def get_zipfile():
    math_max = 1000000  # 设置数字密码的上限
    math_min = 1  # 设置数字密码是下限
    print('默认输入数字下限是1,如需重设请输入,否则请回车键跳过')
    math_min_input = input('')
    print('默认数字上限是1000000(1百万),如需重设请输入,否则请回车键跳过')
    math_max_input = input('')

    if len(math_max_input):
        math_max = int(math_max_input)
    else:
        pass
    if len(math_min_input):
        math_min = int(math_min_input)
    else:
        pass

    new_path, file = ready_work()  # 用来接收ready_work()返回的两个变量
    print('爆破开始')
    count = 0

    # 开始解压文件
    with zipfile.ZipFile(file) as zip_file:  # 读取压缩文件
        for num in range(math_min, math_max):  # 设置数字密码区间
            start_time = time.time()
            # noinspection PyBroadException
            try:
                pwd = str(num)
                zip_file.extractall(path=new_path, pwd=pwd.encode('utf-8'))
                print('[+]' + str(file) + ' 解压密码是:', pwd)
                end_time = time.time()
                print('[-] 耗时:{}秒'.format(str(end_time - start_time)))
                count = count + 1  # count最后加1一次,用来算成成功的这次
                print('[-] 累计尝试{}'.format(count))
                sys.exit(0)  # 让程序在得到结果后,就停止运行,正常退出
            except Exception as e:
                count += 1  # 统计总共失败了多少次
                pass

# 实现数字字母组合爆破
class MyIter(object):
    word = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  # 原始的密码本

    def __init__(self, min_len, max_len):  # 迭代器实现初始方法,传入参数
        # 下面的if-else是为了解决extract函数中,for循环中传递的密码长度可能前者的值大于后者,这一bug
        if min_len < max_len:
            self.min_len = min_len
            self.max_len = max_len
        else:
            self.min_len = max_len
            self.max_len = min_len

    def __iter__(self):  # 直接返回self实列对象
        return self

    def __next__(self):  # 通过不断地轮循,生成密码
        result_word = ''
        for i in range(0, random.randint(self.min_len, self.max_len)):  # randint取值为[]左右闭区间
            result_word += random.choice(MyIter.word)  # 从word中随机取选取一个值,并把选取几次的结果拼接成一个字符,即一个密码
        return result_word

def extract():
    password_min = input('请输入密码长度下限:')  # 设置密码区间长度
    if password_min.isdecimal():
        # 上面input输入数字,虽说input接收过来的数字是字符型,但是isdecimal认为它是一个数字,这是isdecimal内部的问题
        # 但是password_min的值仍然是字符型,还是需要isdecimal判断后,再手动转换为int型
        password_min = int(password_min)
    else:
        print('请输入数字!')
    password_max = input('请输入密码长度上限:')  # 设置密码区间长度
    if password_max.isdecimal():
        password_max = int(password_max)
    else:
        print('请输入数字!')

    new_path, file = ready_work()  # 用来接收ready_work()返回的两个变量
    print('爆破开始')
    count = 0
    with zipfile.ZipFile(file) as zip_file:  # 读取压缩文件
        for password in MyIter(password_min, password_max):  # 随机迭代出指定长度区间内的密码,在不明确位数的时候做相应的调整
            start_time = time.time()
            # noinspection PyBroadException
            try:
                zip_file.extractall(path=new_path, pwd=str(password).encode('utf-8'))
                print('[+]' + str(file) + ' 解压密码是:' + password)
                end_time = time.time()
                print('[-] 耗时:{}秒'.format(str(end_time - start_time)))
                count = count + 1  # count最后加1一次,用来算成成功的这次
                print('[-] 累计尝试{}'.format(count))
                sys.exit(0)
            except Exception as e:
                count += 1
                pass

# 实现密码本爆破
def password_file_baopo():
    new_path, file = ready_work()  # 用来接收ready_work()返回的两个变量
    with zipfile.ZipFile(file) as zip_file:

        # 设置密码本
        # 用来判断用户是否正正确输入数字1或者0
        print('使用当前工作路径中的txt文件作为密码本请输入:1')
        print('手动指定密码本路径请输入:0')
        while True:
            user_choice_mode = input()
            if user_choice_mode == str(1) or user_choice_mode == str(0):
                break
            else:
                print("请正确输入数字 1 或者 0!")
                continue
        user_choice_mode = int(user_choice_mode)
        if user_choice_mode:  # 如果用户选择了模式1
            all_files = os.listdir()
            for all_file in all_files:
                if all_file.endswith('.txt'):
                    password_file = str(all_file)
        else:
            password_file = input(r'请输入密码本的路径:')

        print('爆破开始')
        count = 0
        start_time = time.time()
        try:
            with open(password_file, 'r', encoding='utf8') as pwdfile:  # 逐行读取密码本
                word = pwdfile.readlines()
                for w in word:
                    w = w.replace('\n', '')

                    # 尝试破解zip文件
                    # noinspection PyBroadException
                    try:
                        zip_file.extractall(path=new_path, pwd=str(w).encode('utf-8'))
                        print('[+]' + str(file) + ' 解压密码是:', str(w))
                        end_time = time.time()
                        print('[-] 耗时:{}秒'.format(str(end_time - start_time)))
                        count = count + 1  # count最后加1一次,用来算成成功的这次
                        print('[-] 累计尝试{}'.format(count))
                        sys.exit(0)
                    except Exception as e:
                        count += 1
                        pass
        except Exception as f:
            print('你输入的路径有问题!请检查,错误信息是:')
            print(f)

# 运行程序
def run():
    print('一个ZIP爆破工具')
    print('需要把脚本和压缩包放在同一个文件夹中,默认对当前路径下所有的压缩包逐个爆破')
    os.chdir(r'C:\Users\asuka\Desktop\123')  # 测试的时候使用,手动修改脚本工作路径
    print('[+]输入1:程序自动进行纯数字爆破')
    print('[+]输入2:程序自动进行字母数字组合爆破,效率低下不推荐')
    print('[+]输入3:使用密码本进行爆破')
    print()
    user_choice = int(input('[-]输入:'))
    if user_choice == 1:
        print('纯数字爆破模式--->')
        get_zipfile()
    elif user_choice == 2:
        print('数字字母爆破模式--->')
        extract()
    else:
        print('密码本爆破模式--->')
        password_file_baopo()

if __name__ == '__main__':
    run()

模式1:

模式2:

模式3:

模式3的健壮性:

以上就是Python实现爆破ZIP文件(支持纯数字,数字+字母,密码本)的详细内容,更多关于Python爆破ZIP的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python实现暴力破解有密码的zip文件的方法

    背景 今天朋友给我发了一个某游戏的兑换码,压缩文件发过来的.结果被加密了.wc?还说叫爸爸就给我密码?男人是这么容易像恶势力低头的?直接给你爆了好吧,小兔崽子. 一.思路 爆密码的思路其实都大同小异:无非就是字典爆破,就看你是有现成密码字典,还是自己生成密码字典,然后进行循环输入密码,直到输入正确位置.现在很多都有防爆破限制,根本无法进行暴力破解,但是似乎zip这种大家都是用比较简单的密码而且没有什么限制. 因此 实现思路就是 生成字典->输入密码->成功解压 二.实现过程 1.生成字典 生成

  • Python压缩解压缩zip文件及破解zip文件密码的方法

    python 的 zipfile 提供了非常便捷的方法来压缩和解压 zip 文件. 例如,在py脚本所在目录中,有如下文件: readability/readability.js readability/readability.txt readability/readability-print.css readability/sprite-readability.png readability/readability.css 将 readability 目录中的文件压缩到脚本所在目录的 read

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

    Python有一个内置模块zipfile可以干这个事情,测试一波,一个测试文件,设置解压密码为123. import zipfile # 创建文件句柄 file = zipfile.ZipFile("测试.zip", 'r') # 提取压缩文件中的内容,注意密码必须是bytes格式,path表示提取到哪 file.extractall(path='.', pwd='123'.encode('utf-8')) 运行效果如下图所示,提取成功. 好了开始破解老文件的密码,为了提高速度我加了多

  • python破解zip加密文件的方法

    首先我们先来桌面创建一个文件 我们创建了一个名为q的txt文件然后我们将它压缩,压缩的时候记得设置上密码 我这边将密码设置为123456, 接下来我们打开我们的编写工具,开始写代码,我这里用的是pycharm,推荐大家使用 这里我们将使用到python的zipfile的模块,编写zip文件口令破解机要从学习 zipfile库的使用方法着手.打开 Python解释器,我们 用help( zipfile)命令进一步了解这个库,并重点看一下 Zip File类中的 extractall方法.这个类和这

  • 用Python实现zip密码破解实例

    目录 原理 python的zipfile库 暴破zip文件口令 利用线程提高性能 用户自定义参数 脚本完整代码 总结 原理 原理很简单,就是循环遍历字典中的每一个密码,尝试破解.除此之外,此脚本用线程提高性能,用脚本选项提高了灵活性 最后脚本运行结果如下,完整代码在最下面 python的zipfile库 编写Zip文件口令破解脚本前,我们要先了解一下python的zipfile库.如果没有安装库,需要先用pip安装库 在终端中打开python,查看zipfile库的帮助信息 python hel

  • 详解python破解zip文件密码的方法

    1.单线程破解纯数字密码 注意: 不包括数字0开头的密码 import zipfile,time,sys start_time = time.time() def extract(): zfile = zipfile.ZipFile('IdonKnow.zip')#读取压缩包,如果用必要可以加上'r' for num in range(1,99999,1): try: pwd = str(num) zfile.extractall(path='.',pwd=pwd.encode('utf-8')

  • Python实现爆破ZIP文件(支持纯数字,数字+字母,密码本)

    目录 乱码问题 单线程纯数字爆破 单线程数字字母爆破 多线程爆破密码本 单线程爆破3合1版(支持数字,数字+字母.密码本) 乱码问题 破解压缩包时候会存在中文乱码问题! 1:直接使用Everything搜索出要修改的库文件 zipfile.py ,并用notepad++打开 2:修改的第一段代码 大概位置在1374行 if flags & 0x800: # UTF-8 file names extension filename = filename.decode('utf-8') else: #

  • python下解压缩zip文件并删除文件的实例

    利用python下载数据,下载下来的数据为zip格式,因为有上千个这样的文件,因此便直接在爬虫程序里加入了解压缩zip文件的内容,并且因为数据量较大,为了节省空间,便在解压缩后立即删除该zip文件. 先来介绍解压缩的方法: import zipfile filename = '/home/username/work/1.zip' fz = zipfile.ZipFile(filename, 'r') for file in fz.namelist(): fz.extract(file, path

  • python MultipartEncoder传输zip文件实例

    需求:对方提供处理文件的接口,本地将待处理文件压缩后,通过http post multipart方式上传,等待处理完成后从相应连接下载结果 代码: import os import time import zipfile import requests from requests_toolbelt.multipart.encoder import MultipartEncoder class Func4Fuxi(object): def __init__(self): self.remote_r

  • python 破解加密zip文件的密码

    今天的文章来自 盏茶作酒 同学.他在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码.在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决方案. 下面就来给大家分享一下他的操作. 之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本. Python 有一个内置模块 zipfile 可以解压 zip 压缩包.

  • 浅析一个匹配数字和字母密码的正则表达式

    一个用户注册功能的密码有如下要求:由数字和字母组成,并且要同时含有数字和字母,且长度要在8-16位之间. 如何分析需求?拆分!这就是软件设计的一般思路了.于是乎,拆分需求如下: 1,不能全部是数字 2,不能全部是字母 3,必须是数字或字母 只要能同时满足上面3个要求就可以了,写出来如下: ^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$ 分开来注释一下: ^ 匹配一行的开头位置 (?![0-9]+$) 预测该位置后面不全是数字 (?![a-zA-Z]+$)

  • 利用Python暴力破解zip文件口令的方法详解

    前言 通过Python内置的zipfile模块实现对zip文件的解压,加点料完成口令破解 zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了.ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的. 比如要读取一个Python zipfile 模块,这里假设filename是一个文件的路径: impo

  • python如何压缩新文件到已有ZIP文件

    本文为大家分享了python压缩新文件到已有ZIP文件的具体代码,供大家参考,具体内容如下 要点在于使用Python标准库zipfile创建压缩文件时,如果使用'a'模式时,可以追加新内容. from zipfile import ZipFile from os import listdir from os.path import isfile, isdir, join def addFileIntoZipfile(srcDir, fp): #遍历该文件夹中所有文件 for subpath in

  • python简单利用字典破解zip文件口令

    前几天在一本书上看到一篇可以利用字典破解zip文件密码的文章,觉得比较有意思于是研究了一番,在这里分享一下 原理 主要是利用python里自带的zipfile库中的extractall函数来实现的,简单导入zipfile之后,实例化一个ZipFile类.利用extractall()来解压这个文件,并在参数pwd上填入正确密码 这时我们发现执行脚本之后,fate.zip会被正确解压,而填入错误密码则会入下图一样报错 因此 我们可以利用因口令不正确而抛出的异常来测试字典文件中是否有zip文件的密码,

  • Python实现压缩和解压缩ZIP文件的方法分析

    本文实例讲述了Python实现压缩和解压缩ZIP文件的方法.分享给大家供大家参考,具体如下: 有时我们需要在 Python 中使用 zip 文件,而在1.6版中,Python 就已经提供了 zipfile 模块可以进行这样的操作.不过 Python 中的 zipfile 模块不能处理多卷的情况,不过这种情况并不多见,因此在通常情况下已经足够使用了.下面我只是对一些基本的 zipfile 操作进行了记录,足以应付大部分的情况了. zipfile 模块可以让你打开或写入一个 zip 文件.比如: i

随机推荐