先上代码:
from unrar import rarfile
import itertools
from concurrent.futures import ThreadPoolExecutor
import queue
def extract(file, password):
if not flag: return
# file.extractall(path='.', pwd=''.join(password).encode('utf-8'))
file.extractall(path='.', pwd=''.join(password)) # 加.encode('utf-8')会报错
def result(f):
exception = f.exception()
if not exception:
# 如果获取不到异常说明破解成功
print('密码为:', f.pwd)
global flag
flag = False
class BoundedThreadPoolExecutor(ThreadPoolExecutor):
def __init__(self, max_workers=None, thread_name_prefix=''):
super().__init__(max_workers, thread_name_prefix)
self._work_queue = queue.Queue(self._max_workers * 2) # 设置队列大小
# self._work_queue = queue.Queue(self._max_workers )
flag = True
#创建一个线程池
pool = ThreadPoolExecutor(100)
nums = [str(i) for i in range(10)]
chrs = [chr(i) for i in range(65, 91)]
charsaz = [chr(i) for i in range(97,122)]
#生成数字+字母的6位数密码
password_lst = itertools.permutations(nums + chrs + charsaz, 6)
#创建文件句柄
rarfile = rarfile.RarFile('test.rar')
for pwd in password_lst:
if not flag: break
f = pool.submit(extract, rarfile, pwd)
f.pwd = pwd
f.pool = pool
f.add_done_callback(result)
需要的运行操作:
1.安装unrar库:
pip install unrar