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
相关产品推荐
相关产品推荐

