一、思路
运行程序------>选择rar或zip 压缩包(图1)------> rar:按要求输入文件路径(图2);zip:输入密码数位,勾选密码组合(图3)------>开始破解压缩包------>破解成功/解压成功。
二、代码
跳过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 messagebox2、程序入口
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 条评论) “” |