Python 破解 rar 和 zip 压缩包

一、思路

运行程序------>选择rar或zip 压缩包(图1)------> rar:按要求输入文件路径(图2);zip:输入密码数位,勾选密码组合(图3)------>开始破解压缩包------>破解成功/解压成功。

Python 破解 rar 和 zip 压缩包

Python 破解 rar 和 zip 压缩包

Python 破解 rar 和 zip 压缩包

二、代码

跳过python和pycharm以及相关库的安装;

1、用到的相关库有:

import os
import time
import tkinter
import pyzipper
import itertools
import tkinter as tk
from tkinter import *
from unrar import rarfile
from threading import Thread
from tkinter import filedialog
from tkinter import messagebox

2、程序入口

if __name__ == '__main__':
    root = Tk()
    root.withdraw()  # 隐藏主窗口
    cp_file = filedialog.askopenfilename()  # 选择文件    .askdirectory()选择多个文件
    cp_file_name = cp_file[-3:]
    root.destroy()
    root.quit()
    if cp_file_name == "zip" or cp_file_name == "ZIP":
        desktop_path = "C:\Users\Administrator\Desktop\"  # 定义一个变量,赋值一个路径,用于存放打印结果
        root1 = Tk()  # 创建一个窗体
        root1.title('小叶提醒:')  # 弹出对话框的title
        root1.geometry("300x160+800+400")
        # 设置弹出对话的框的标签值
        label = tkinter.Label(root1, text='位密码', font=('黑体', 13), bg='#1E90FF', fg='#FFFFFF')
        label.place(x=65, y=10)
        # 弹出输入对话框请获取相应的值
        digit_int = tkinter.StringVar()
        entry = tkinter.Entry(root1, font=('黑体', 13),justify='center', fg='#FF1493', width=5, textvariable=digit_int)
        entry.place(x=10, y=10)
        entry.insert(0, "6")
        # 多选框
        var1 = tkinter.IntVar()
        var2 = tkinter.IntVar()
        var3 = tkinter.IntVar()
        var4 = tkinter.IntVar()
        var5 = tkinter.IntVar()
        ck1 = tkinter.Checkbutton(root1, text="纯数字", font=('黑体', 13), height=2, variable=var1)
        ck1.place(x=130)
        ck2 = tkinter.Checkbutton(root1, text="纯字母", font=('黑体', 13), height=2, variable=var2)
        ck2.place(x=210)
        ck2 = tkinter.Checkbutton(root1, text="数字+小写字母", font=('黑体', 13), height=2, variable=var3)
        ck2.place(x=5, y=35)
        ck3 = tkinter.Checkbutton(root1, text="数字+大写字母", font=('黑体', 13), height=2, variable=var4)
        ck3.place(x=150, y=35)
        ck4 = tkinter.Checkbutton(root1, text="数字+大写字母+小写字母", font=('黑体', 13), height=2, variable=var5)
        ck4.place(x=5, y=65)
        #提醒
        label = tkinter.Label(root1, text='小叶提醒:破解时间是根据密码长度
和密码的复杂性决定,请耐心等待...', font=('黑体', 13), fg='#FF1493')
        # 点击OK按钮返回秘钥
        btn_OK = tkinter.Button(root1, text='***开始破解zip压缩包***', font=('黑体', 15), height=1, bg='#1E90FF',
                                fg='#FFFFFF', command=lambda:make_base())
        btn_OK.place(x=8, y=110)

        full_path = desktop_path + 'zip解压密码.txt'  # 创建一个txt文件
        file = open(full_path, 'w')  # 打开txt文档,写入数据
        root1.mainloop()
    else:
        window = tk.Tk()
        window.title('小叶提醒:')
        window.geometry('600x220')
        cv = tk.Canvas(window, width=600, height=320, bg='white')
        cv.pack()
        #提醒
        label = tkinter.Label(window, text='小叶提醒:破解时间是根据密码长度
和密码的复杂性决定,请耐心等待...', font=('黑体', 15), fg='#FF1493')  # 请输入“关”或“税  left   , fg='#FF1493'
        label.place(x=120,y=8)   #,justify='right'
        rarpath = FilePath(y=80, path_input=tk.StringVar(), text="请输入rar 路径:")
        rarpath.suffix = 'rar'
        rarpath.show()
        txtpath = FilePath(y=110, path_input=tk.StringVar(), text="请输入字典路径:")
        txtpath.suffix = 'txt'
        folderpath = FolderPath(y=140, path_input=tk.StringVar(), text="请输入解压路径:")
        folderpath.show()
        txtpath.show()
        obs = [folderpath, rarpath, txtpath]
        button = tk.Button(window, text="***开始破解rar压缩包***", font=('黑体', 18), bg='#1E90FF', fg='#FFFFFF', height=1,
                           command=lambda:main(obs))
        cv.create_window(280, 185, window=button)
        window.mainloop()

2、程序相关函数定义

def getPwd(dict):  # 字典处理
    with open(dict, 'r') as f:
        for pwd in f:
            yield pwd.strip()


def quickDecode(fp, pwd, extract_path):  # 字典处理
    fp.extractall(extract_path, pwd=pwd)


def check(obs):
    flag = 1
    for ob in obs:
        if not ob.checkExist():
            flag = 0
            ob.showError()

    if (not flag):
        return 0
    else:
        for ob in obs:
            if not ob.check():
                flag = 0
                ob.showError()
    if (not flag):
        return 0
    else:
        for ob in obs:
            ob.right()
        return 1


def extractFile(cp_file, password):  # 解压ZIP
    password = str(password)
    with pyzipper.AESZipFile(cp_file, 'r', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) as f:
        f.setpassword(password.encode())
        try:
            f.extractall(cp_file + " - new", pwd=password.encode())  # 使用密码尝试解压'utf-8'
            file.write("
************破解成功************

解压密码是:" + password + "
已解压,解压到的文件夹与原文件在同一个目录。")
            print("破解成功,压缩包密码:" + password)
            f.close()
            file.close()  # 写入关闭
        except:
            print(password)
            pass  # 解压失败说明密码错误,跳过

    root.quit()


def main(obs, ):  #rar破解
    extract_path = "C:\Users\Administrator\Desktop\new\"
    rar_path = obs[1].path_input.get()
    txt_path = obs[2].path_input.get()
    pwds = getPwd(txt_path)
    if (check(obs)):
        fp = rarfile.RarFile(rar_path)
        for pwd in pwds:
            t = Thread(target=quickDecode, args=(fp, pwd, extract_path))
            t.start()
        exit(0)


def make_base():  #zip破解
    global ww
    ww = int(digit_int.get())
    global var1
    global var2
    global var3
    global var4
    global var5
    time.sleep(2)  # 延迟秒
    if (var1.get() == 1 and var2.get() == 0 and var3.get() == 0 and var4.get() == 0 and var5.get() == 0):
        file.write("*******以下空白就表示破解失败******
")
        chars = "0123456789"
        for c in itertools.permutations(chars, ww):
            password = "".join(c)
            extractFile(cp_file, password)
        exit(0)
    elif (var1.get() == 0 and var2.get() == 1 and var3.get() == 0 and var4.get() == 0 and var5.get() == 0):
        file.write("*******以下空白就表示破解失败******")
        chars = "abcdefghijklmnopqrstuvwxyz"
        for c in itertools.permutations(chars, ww):
            password = "".join(c)
            extractFile(cp_file, password)
        exit(0)
    elif (var1.get() == 0 and var2.get() == 0 and var3.get() == 1 and var4.get() == 0 and var5.get() == 0):
        file.write("*******以下空白就表示破解失败******")
        chars = "0123456789abcdefghijklmnopqrstuvwxyz"
        for c in itertools.permutations(chars, ww):
            password = "".join(c)
            extractFile(cp_file, password)
        exit(0)
    elif (var1.get() == 0 and var2.get() == 0 and var3.get() == 0 and var4.get() == 1 and var5.get() == 0):
        file.write("*******以下空白就表示破解失败******")
        chars = "0123456789ABCDEFGDEFGHIJKLMNOPQRSTUVWXYZ"
        for c in itertools.permutations(chars, ww):
            password = "".join(c)
            extractFile(cp_file, password)
        exit(0)
    elif (var1.get() == 0 and var2.get() == 0 and var3.get() == 0 and var4.get() == 0 and var5.get() == 1):
        file.write("*******以下空白就表示破解失败******")
        chars = "0123456789ABCDEFGDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
        for c in itertools.permutations(chars, ww):
            password = "".join(c)
            extractFile(cp_file, password)
        exit(0)
    else:
        messagebox.showerror(message="选择一个,不能多项,也不能不选!!!")
        root1.mainloop()

    root1.destroy()
    root1.quit()

class FolderPath:   #rar破解界面定义(是否输入路径)

    def __init__(self, y=0, error_message="Not exists!", path_input="", text=''):
        self.y = y
        self.error_message = error_message
        self.path_input = path_input
        self.text = text

    def createLabel(self):
        label = tk.Label(window, bg="white", font=("楷体", 13), width=20, text=self.text)
        cv.create_window(80, self.y, window=label)

    def createEntry(self):
        entry = tk.Entry(window, fg="blue", width="40", bg="#ffe1ff",
                         textvariable=self.path_input)  # entry.insert(0, str(cp_file))
        cv.create_window(300, self.y, window=entry)

    def show(self):
        self.createLabel()
        self.createEntry()

    def showError(self, color="red"):
        label = tk.Label(window, bg="white", fg=color, font=("楷体", 13), width="10", text=self.error_message)
        cv.create_window(500, self.y, window=label)

    def checkExist(self):
        self.error_message = 'Not exists!'
        if not os.path.exists(self.path_input.get()):
            return 0
        return 1

    def check(self):
        if not os.path.isdir(self.path_input.get()):
            self.error_message = 'Not a dir!'
            return 0
        else:
            return 1

    def right(self):
        self.error_message = "right path!"
        self.showError('#00FFFF')


class FilePath(FolderPath):  #rar破解界面定义(路径是否有效)
    def check(self):
        if (self.path_input.get().split('.')[-1] == self.suffix):
            return 1
        else:
            self.error_message = "Not " + self.suffix + '!'
            return 0

按需提取,点赞关注是重点。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章