蓝皮阿五

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python gui 之熟悉tkinter部分控件使用。一个简单的excel暴力密码破解,核心很简单,基本就是一个函数外面加了GUI,写的很啰嗦,希望大家可以在优化改良下,主要是为了再熟悉下tkinter的部分控件怎么使用,tk打包后的文件比较小。仅限于个人忘记密码时使用,请勿用于其它用途。如想转载,请联系本人,或贴上本博客地址。

程序截图如下:

 

import os,sys,subprocess
from tkinter import *
import socket
import threading
import time
import queue
import tkinter.messagebox as msgbox
import win32com.client
#多线程调用win32com模块打开excel,报错,加下面
import pythoncom
import tkinter as tk
from tkinter import ttk
from tkinter import *
from tkinter import scrolledtext
#选择文件
from tkinter import filedialog

#窗体居中
def center_window(root, width, height):
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2)
    #print(size)
    root.geometry(size)

class MyGui():
    def __init__(self, init_window_name):
        self.init_window_name = init_window_name

    def set_init_window(self):              #初始化窗口
        self.k = 0
        self.init_window_name.title("excel密码破解")
        self.window_center(390, 350)
        self.init_window_name.resizable(0,0)    #固定窗口,禁止拖拉

        #参数是父级控件
        self.menubar = Menu(self.init_window_name)
        #新增2个级联菜单
        self.cascadehelp=Menu(self.menubar,tearoff=False)#tearoff=False 表示这个菜单不可以被拖出来
        self.cascadeabout=Menu(self.menubar,tearoff=False)#tearoff=False 表示这个菜单不可以被拖出来
        #向父控件添加help级联菜单
        self.menubar.add_cascade(label='帮助', menu = self.cascadehelp)
        #级联菜单增加选项
        self.cascadehelp.add_command(label='使用说明',command = self.howuse)
        self.menubar.add_cascade(label='关于', menu = self.cascadeabout)
        self.cascadeabout.add_command(label='关于本工具',command = self.about)
        self.init_window_name.config(menu = self.menubar)

        self.frame_top = Frame(self.init_window_name, width=390, height=350,borderwidth = 1,bd=2,bg='lightgreen')
        self.frame_top.grid(row=0, column=0)
        self.PortScan = ttk.Button(self.frame_top, text="立即破解", command= self.runing).grid(row=4, column=1)
        #停止
        self.StopScan = ttk.Button(self.frame_top, text="停止破解",command=self.stop).grid(row=4, column=2)
        self.select_path = tk.StringVar()
        # 初始化Label控件的textvariable属性值
        self.select_dic_path = tk.StringVar()
        # 布局控件
        tk.Label(self.frame_top, text="文件路径:",bg='lightgreen').grid(column=0, row=0)#columnspan和rowspan分别可以设置控件在行和列方向的合并数量
        tk.Entry(self.frame_top, textvariable = self.select_path).grid(column=1, row=0)
        ttk.Button(self.frame_top, text="选择单个文件", command=self.select_file).grid(row=0, column=2)
        #指定数字位数
        tk.Label(self.frame_top, text="指定密码位数:",bg='lightgreen').grid(column=0, row=1)
        self.feet = StringVar()
        feet_entry = ttk.Entry(self.frame_top, width=3, textvariable=self.feet).grid(column=1, row=1,sticky=(W))#sticky=(W)左对齐, sticky=(W, E))左右对齐,控件占满行列
        #feet_entry.bind('', self.keyPress)
        tk.Label(self.frame_top, text="(可不填,默认0开始)",bg='lightgreen').grid(column=2, row=1,sticky=(W))
        #选择字典文件
        ttk.Button(self.frame_top, text="选择字典文件", command=self.select_dic).grid(row=3, column=0)
        tk.Entry(self.frame_top, textvariable = self.select_dic_path,bg='lightgreen').grid(column=1, row=3)
        #历史记录
        scrolW  = 30; scrolH  =  16
        scr = scrolledtext.ScrolledText(width=scrolW, height=scrolH, wrap=tk.WORD) #monty,
        scr.grid(column=0, row=1, sticky='WE', columnspan=1)
        scr.config(state=DISABLED)
        for child in self.frame_top.winfo_children(): child.grid_configure(padx=3, pady=3) # padx表示在x轴方向上的边距,一般用法是padx=10,表示距离左右两边组件的长度都为10

    def about(self):
        messagebox.showinfo('关于','欢迎使用本工具,本工具开源免费,仅限于个人忘记密码时使用,请勿用于商业用途。')
    def close_handler(self):
        # 在colse_handler函数中,使得父窗口重新变得可用
        self.init_window_name.attributes('-disabled', 0)
    def howuse(self):
        help_text1 = '1、破解数字密码,可直接选择文件,点击 “立即破解”,如果直接数字密码大概是几位,可以指定密码位数,可加快破解效率。'
        help_text2 = '2、如有常用密码的txt字典,可选择文件,再选择字典文件,点击“立即破解”。'
        top = Toplevel()
        top.title('使用帮助')
        #顶级窗口也屏幕居中显示
        center_window(top,700,60)
        #窗口置顶
        top.wm_attributes('-topmost',1)
        top.resizable(0,0)    #固定窗口,禁止拖拉
        tk.Label(top, text=help_text1).grid(row=1,column=1,padx=1,pady=1)
        tk.Label(top, text=help_text2).grid(row=2,column=1,padx=1,pady=1,sticky=(W))  #左对齐

    # 窗口居中
    def window_center(self, width, height):
        screenwidth = self.init_window_name.winfo_screenwidth()
        screenheight = self.init_window_name.winfo_screenheight()
        size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
        self.init_window_name.geometry(size)

    # 获取当前时间
    def get_current_time(self):
        current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        return current_time

    # 单个文件选择
    #指定文件类型
    def select_file(self):
        # 使用askopenfilename函数选择单个文件
        selected_file_path = filedialog.askopenfilename(title='选择表格文件',
                                filetypes=[('All Files', '*'),
                                            ('表格', '*.xlsx')])  
        self.select_path.set(selected_file_path)

    #选择字典文件
    def select_dic(self):
        selected_dic = filedialog.askopenfilename(title='选择字典文件',
                                filetypes=[('All Files', '*'),
                                            ('txt', '*.txt')])  
        self.select_dic_path.set(selected_dic)
        

    class MyThread(threading.Thread):
        def __init__(self, func, *args):
            super().__init__()

            self.func = func
            self.args = args

            self.setDaemon(True)
            self.start()  #开始

        def run(self):
            self.func(*self.args)

    def stop(self):
        self.k = 0
        msgbox.showinfo(title='提示', message='停止破解。')
        ttk.Button(self.frame_top, text="立即破解", command= self.runing).grid(row=4, column=1)

    def runing(self):
        pythoncom.CoInitialize()
        if self.select_path.get() =='':
            msgbox.showinfo(title="提示", message="请先选择文件!")
        else:
            ttk.Button(self.frame_top, text="立即破解", command= self.runing, state=tk.DISABLED).grid(row=4, column=1)#, padx=15, pady=20)
            self.k = 1
            self.MyThread(self.get_sheetpw)

    def get_sheetpw(self):
        pythoncom.CoInitialize()
        cmdwps ='taskkill /F /IM wps.exe'
        cmdexcel = 'taskkill /F /IM EXCEL.exe'
        p = subprocess.Popen(cmdwps)
        p.wait()
        p2 = subprocess.Popen(cmdexcel)
        p2.wait()

        #历史记录
        scrolW  = 30; scrolH  =  16
        scr = scrolledtext.ScrolledText(width=scrolW, height=scrolH, wrap=tk.WORD) #monty,
        scr.grid(column=0, row=1, sticky='WE', columnspan=1)
        scr.config(state=DISABLED)
        for child in self.frame_top.winfo_children(): child.grid_configure(padx=3, pady=3)
        file_path =  self.select_path.get()
        dic_path = self.select_dic_path.get()
        print(file_path)
        try:
            xls = win32com.client.Dispatch("Excel.Application")
        except:
            xls = win32com.client.Dispatch("ket.Application")
        xls.DisplayAlerts=0

        if dic_path!='':
            with open(dic_path,'r',encoding='utf-8') as f:
                flag=0
                for i in f.readlines():
                    print('破解中......')
                    start_time = time.time()
                    if self.k == 1:
                        try:
                            xlsheet = xls.Workbooks.Open(file_path, False, True, None, Password=i.strip())
                            print('破解成功!')
                            print("文档密码是:{}".format(i.strip()))
                            xlsheet.Close()
                            end_time = time.time()
                            use_time = end_time - start_time
                            use_time = round(use_time,2)
                            print('共耗时:' + str(use_time) +'')
                            flag=1
                            msgbox.showinfo(title="提示", message="破解成功!excel密码是:%s。共耗时: %s秒" %(i.strip(),use_time))
                            ttk.Button(self.frame_top, text="立即破解", command= self.runing).grid(row=4, column=1)
                            break
                            #return True
                        except Exception as e:
                            print('完成一次,'+'当前测试的密码是'+ str(i.strip()))
                            info = '完成一次,当前测试的密码是'+ str(i.strip())
                            scr.config(state=NORMAL)
                            value = info
                            value=value.replace("'\n'","")
                            oldvalue=scr.get(0.0,tk.END)
                            delvalue=scr.delete(0.0,tk.END)
                            scr.insert(tk.INSERT,value +'\n'+oldvalue)
                            scr.config(state=DISABLED)
                if flag==0:
                    msgbox.showinfo(title="提示", message='破解失败,此字典未破解出密码!')
                    ttk.Button(self.frame_top, text="立即破解", command= self.runing).grid(row=4, column=1)
        else:
            num = int(self.feet.get()) if self.feet.get()!='' else 0
            #num = int(self.feet.get())
            if num!='':                
                if int(num)==1:
                    p=0
                elif int(num)==2:
                    p=10
                elif int(num)==3:
                    p=100
                elif int(num)==4:
                    p=1000
                elif int(num)==5:
                    p=10000
                elif int(num)==6:
                    p=100000
                elif int(num)==7:
                    p=1000000
                elif int(num)==8:
                    p=10000000
                elif int(num)==9:
                    p=100000000
                elif int(num)==10:
                    p=1000000000
                elif int(num)==11:
                    p=10000000000
                elif int(num)==11:
                    p=100000000000
                elif int(num)==12:
                    p=1000000000000
                else:
                    p=0
            else:
                p=0
            print('破解中......')
            start_time = time.time()
            while True:
                if self.k == 1:
                    try:
                        xlsheet = xls.Workbooks.Open(file_path, False, True, None, Password=p)
                        print('破解成功!')
                        print("文档密码是:{}".format(p))
                        xlsheet.Close()
                        end_time = time.time()
                        use_time = end_time - start_time
                        use_time = round(use_time,2)
                        print('共耗时:' + str(use_time) +'')
                        msgbox.showinfo(title="提示", message="破解成功!excel密码是:%s。共耗时: %s秒" %(p,use_time))
                        ttk.Button(self.frame_top, text="立即破解", command= self.runing).grid(row=4, column=1)#, padx=15, pady=20)
                        break
                        #return True
                    except Exception as e:
                        print('完成一次,'+'当前测试的密码是'+ str(p))
                        info = '完成一次,当前测试的密码是'+ str(p)
                        scr.config(state=NORMAL)
                        value = info
                        value=value.replace("'\n'","")
                        oldvalue=scr.get(0.0,tk.END)
                        delvalue=scr.delete(0.0,tk.END)
                        scr.insert(tk.INSERT,value +'\n'+oldvalue)
                        scr.config(state=DISABLED)
                        p=p+1
                else:
                    breakpoint

            
if __name__ == "__main__":
    pygui=Tk()
    #窗口置顶
    pygui.wm_attributes('-topmost',1)
    init_window = MyGui(pygui)
    init_window.set_init_window()
    pygui.mainloop()

 

posted on 2022-11-09 13:24  蓝皮阿五  阅读(949)  评论(0编辑  收藏  举报