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

Python使用itertools.product暴力破解RAR密码时内存溢出问题

内存异常根因
  • 核心问题是rarfile.RarFile()实例初始化被放在了循环内部:每遍历一个密码组合,都会重新加载一次RAR压缩包元数据、创建底层C库(libunrar)的文件句柄和解密上下文。这类资源是C层面直接申请的内存,不在Python GC的管控范围内,只有当RarFile实例被显式关闭、正常触发析构逻辑时才会还给操作系统。你每次创建实例后既不手动关闭,抛出密码错误异常时也没触发C层资源回收,随着循环次数增加,残留内存持续累积,最终就会占满内存。之前手动开GC、del临时变量的操作碰不到这部分C层内存,自然没有效果。
  • 代码存在密码校验逻辑错误:你写的.open只是获取了实例的方法属性,并没有实际调用执行,根本不会触发密码校验流程,短密码测试时的“运行正常”属于误判,就算碰到正确密码也识别不出来。
  • 裸except会吞掉所有类型的异常,包括内存不足、文件损坏这类非密码错误问题,也会干扰异常场景下的资源自动释放逻辑。
  • 你手动del comb的操作完全无效:comb是每次循环生成的短字符串,进入下一轮循环时本来就会失去引用被自动回收,不需要手动删除。
优化方案
  • 把RAR文件实例的初始化移到循环外,全程只加载一次压缩包元数据,复用同一个实例做密码校验,从根源上避免重复创建对象带来的内存泄漏。
  • 用RarFile自带的testpwd()方法做密码校验,替代错误的.open属性判断,不需要实际解压文件就能验证密码,执行效率更高,额外资源开销更小。
  • 移除裸except,只捕获密码错误的特定异常,其他异常直接抛出,避免掩盖真实问题。
  • 删掉无效的手动GC、手动删除临时字符串的代码,这些操作对解决当前内存问题没有任何帮助。

优化后的可运行代码:

from unrar import rarfile
from itertools import product
from unrar.unrarlib import BadPasswordError

chars = '&yYvVtThH0#wW8jJlL'
num_char = 16
rar_path = 'lockedfile.rar'

def findpassword():
    # 仅初始化一次RAR实例,全程复用
    rf = rarfile.RarFile(rar_path)
    found_pwd = None
    for p in product(chars, repeat=num_char):
        comb = ''.join(p)
        try:
            if rf.testpwd(pwd=comb):
                found_pwd = comb
                break
        except BadPasswordError:
            # 仅捕获密码错误异常,其余异常直接抛出
            continue
    # 用完显式关闭RAR句柄,释放底层资源
    rf.close()
    if found_pwd:
        with open("result.txt", "w") as f:
            f.write(found_pwd)
        print(f"Password found -> {found_pwd}")

findpassword()

额外提醒:你当前指定的字符集共18个可选字符,16位长度的总组合数约为1.2e20次,就算每秒能尝试1万个密码,也需要跑数亿年,纯Python单线程暴力破解完全不具备可行性。如果确定密码长度为16位,建议先确认是否记错字符范围、是否存在固定前缀/后缀片段,进一步缩小爆破范围,否则不可能跑完所有组合。

内容的提问来源于stack exchange,提问作者Charlesdev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:57:26