Python字典破解ZIP文件持续循环,无法定位正确密码问题
问题分析与代码修复
你的代码存在多处逻辑、语法错误,导致无法触发密码匹配分支,以下是具体问题和修复方案:
核心错误点
- 异常捕获写法错误:
except PermissionError and RuntimeError:无法同时捕获两种异常,正确写法是用括号包裹异常类型:except (PermissionError, RuntimeError):。 - 字典遍历嵌套冗余:
for lines in passcracking.readlines():已经是逐行读取密码,内层for line in lines:会把单个密码拆成字符循环,导致重复尝试同一密码,逻辑完全混乱,必须删除内层循环。 - 路径转义问题:Windows路径中的
\需要转义为\\,或使用原始字符串(前缀加r),否则\U、\t会被解析为转义字符,导致路径无效。 - extractall参数顺序错误:
extractall第一个参数是提取路径,第二个是目标文件成员,你把文件名和路径写反了,应明确指定path参数。 - 宽泛异常捕获:
except:会捕获所有异常(比如文件读写错误、路径不存在),应只捕获密码错误相关的异常(RuntimeError、zipfile.BadZipFile等)。 - 无限外层循环:
while True:会让程序遍历完文件后重复执行,无实际意义,建议移除。
修复后的代码
import os import zipfile # 遍历桌面查找ZIP文件 for path, dirs, files in os.walk(r"C:\Users\omri\Desktop\"): for zip_filename in files: if zip_filename.endswith(".zip"): zip_full_path = os.path.join(path, zip_filename) print(f'{zip_filename} 已找到') try: with zipfile.ZipFile(zip_full_path) as zipper: zipper.extractall() except (PermissionError, RuntimeError): print("文件受密码保护!") user_choice = input("是否尝试破解?\nyes/no\n>> ").strip().lower() if user_choice == "yes": # 用原始字符串避免路径转义,ignore处理编码异常 with open(r"C:\Users\omri\Desktop\rockyou.txt", "r", encoding="utf-8", errors="ignore") as pass_dict: for raw_pwd in pass_dict: pwd = raw_pwd.strip() if not pwd: continue # 跳过空行 try: print(f"尝试密码: {pwd}") with zipfile.ZipFile(zip_full_path) as zipper: # 明确指定提取路径 zipper.extractall(path=r"C:\temp\", pwd=pwd.encode()) except (RuntimeError, zipfile.BadZipFile): # 仅捕获密码错误或ZIP文件异常 continue else: print(f"找到有效密码: {pwd}") exit(0) print("字典文件中未匹配到有效密码")
额外优化说明
- 加入
errors="ignore"处理字典文件中的编码异常,避免个别行编码错误导致程序中断。 - 增加空密码行跳过逻辑,避免尝试无效的空密码。
- 移除未使用的
rarfile、threading导入,减少冗余。
内容的提问来源于stack exchange,提问作者omrihai12
相关产品推荐
相关产品推荐

