求助:Python编写的7ZIP密码暴力破解代码运行过慢优化方案
解决7-ZIP暴力破解速度过慢的问题
Hey there! I totally get the frustration of slow brute-force attempts when you're so close to recovering your password. Let's break down why your current code is lagging and fix it step by step.
核心瓶颈分析
你的代码速度慢主要有三个关键原因:
- 用错了7-Zip命令:你用的
7z e是提取命令,每次尝试都要写入临时文件,磁盘IO的开销远大于密码验证本身。 - 单线程串行执行:每次只能等一个7-Zip进程结束,完全没利用到CPU的多核能力。
- 冗余的临时文件操作:每次尝试前删除文件的操作也会额外消耗时间。
优化方案
1. 改用7-Zip的测试命令(最立竿见影的优化)
7-Zip自带7z t命令,专门用来验证密码正确性,不会提取任何文件,直接省去了大量磁盘IO开销,这能让你的尝试速度提升数倍甚至数十倍。
替换原来的命令行,建议用列表形式传递参数(避免路径空格导致的问题):
cmd_base = [r"C:\Program Files\7-Zip\7z.exe", "t", r"C:\archive.7z", "-p"]
2. 多进程并行处理
利用Python的multiprocessing.Pool并行启动多个7-Zip进程,充分榨干CPU多核性能,同时尝试多个密码,速度能提升到接近核心数的倍数。
注意:一旦找到正确密码,要立即终止所有进程,避免做无用功。
3. 砍掉冗余操作
因为改用了7z t命令,完全不需要再处理临时文件了,直接删掉原来的文件删除逻辑即可。
优化后的完整代码
import os import time import itertools import subprocess from multiprocessing import Pool, freeze_support # 全局变量,用于存储找到的密码(一旦找到就停止所有进程) found_password = None def check_single_password(password): global found_password if found_password is not None: return None # 已找到密码,直接返回 cmd = cmd_base.copy() cmd[-1] += password # 拼接密码到命令参数 try: # 启动进程,隐藏命令行窗口,设置超时避免卡住 sp = subprocess.Popen( cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, creationflags=subprocess.CREATE_NO_WINDOW ) stdout, _ = sp.communicate(timeout=10) if sp.returncode == 0: found_password = password return password except subprocess.TimeoutExpired: sp.kill() return None if __name__ == "__main__": freeze_support() # Windows下多进程必须加这个 start_time = time.time() known_part = 'MiStup!dB' unknown_part = '$oz' cmd_base = [r"C:\Program Files\7-Zip\7z.exe", "t", r"C:\archive.7z", "-p"] attempts = 0 # 提前生成所有可能的密码组合 password_candidates = [] for length in range(2, 4): for guess in itertools.product(unknown_part, repeat=length): password_candidates.append(known_part + ''.join(guess)) # 用CPU核心数设置进程池大小,充分利用硬件 with Pool(processes=os.cpu_count()) as pool: for result in pool.imap_unordered(check_single_password, password_candidates): attempts += 1 if result is not None: print(f"Password is {result}, Found in {attempts} attempts in {time.time()-start_time:.2f} seconds") pool.terminate() # 找到密码后立即终止所有进程 break
额外小技巧
- 隐藏命令行窗口:加上
creationflags=subprocess.CREATE_NO_WINDOW,避免每次启动7-Zip都弹出黑窗口,减少系统开销。 - 超时机制:给
communicate()加超时时间,防止个别进程因为异常卡住。 - 调整进程数:如果你的CPU是4核就设
processes=4,8核就设8,别超过核心数太多,避免系统卡顿。
这样修改后,你的暴力破解速度应该会有质的飞跃!
内容的提问来源于stack exchange,提问作者PatheticJoe
相关产品推荐
相关产品推荐

