You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:35:23