python 多线程 30行代码破解加密ZIP文件

# coding = utf-8
import optparse
import zipfile
from threading import Thread
from tqdm import tqdm


def extract_file(zip_file, password):
    """ 提取压缩文件,通过密码不断尝试 """
    try:
        zip_file.extractall(pwd=bytes(password, 'ansi'))
        print(f'\n  发现密码,正确密码为:{password}')
    except:
        pass


def main():
    # 第一行通过调用optparse的函数创建一个parser的实例化对象
    parser = optparse.OptionParser('\n  %prog -z <zipfile> -d <dictionary>')
    # 第二行添加一个参数,在命令行上输入-z xxxx 可将命令行上的zip路径作为字符串传入到变量zname中
    parser.add_option('-z', dest='zname', type='string', help='specify zip file')
    # 第三行添加一个参数,在命令行上输入-d xxxx 可将命令行上的字典文件作为字符串传入到变量dname中
    parser.add_option('-d', dest='dname', type='string', help='specify dictionary file')
    # 第四行进行解析,得到相关参数,得到options。
    options, args = parser.parse_args()
    # 第五行,通过zname和dname判断是否传入的参数为空
    if options.zname and options.dname:
        zip_name = options.zname
        dict_name = options.dname
    else:
        print(parser.usage)
        exit(0)

    zip_name = 'zip.zip'
    dict_name = 'mima3.txt'

    #多线程函数代码
    # 通过try-except来抓取运行程序时的异常,若报错,说明传入的文件不存在
    try:
        # 调用zipfile模块的实例对象方法,将zip路径传入
        zip_file = zipfile.ZipFile(zip_name)
        # 打开字典文件,用python自带的with关键词来打开,可以交由python自主关闭文件的资源
        with open(dict_name, 'r', encoding='ansi') as f:
            # 读取每一行,并且将密码后的\n 清空,也就是清空换行符
            for line in tqdm(f.readlines(),ascii=True):
                password = line.strip('\n')
                # 对每个密码开启线程去处理,调用extract_file函数,传入的参数为元组(zip_file, password)
                thread = Thread(target=extract_file, args=(zip_file, password))
                # 调用线程开始的方法
                thread.start()
    except Exception as e:
        print(f'发生异常!请检查文件是否存在!异常信息为:{e}')


main()

 

运行下面的命令执行程序 带参数

 

python app.py -z zip.zip -d top10W.txt

 

optarse:这是一个python自带的库,通过上面介绍的代码可以和linux命令似的,带参数执行

 

zipfile: python自带的库,可以对zip文件进行解压缩,本章实现的重点模块,需要注意的是,在用extractall时,传入的字符串密码进行字节编码的转化。zip_file.extractall(pwd=bytes(password,’utf-8′))

 

关于解压出来的文件名字会有乱码的情况,请看文章:

 

tqdm:需要安装的第三方库,在可以循环迭代的对象上使用即可。如:

 

for line in tqdm(f.readlines()):

 

 

爆破字典的开源项目,其中收录了不少相关的密码,可以star 或者 fork到自己的仓库记录使用。地址如下:

https://github.com/rootphantomer/Blasting_dictionary

发表评论

邮箱地址不会被公开。 必填项已用*标注