Python 3 Zip密码破解器

时间:2017-08-31 21:11:21

标签: python

我正在为一个学校项目开发一个简单的zip文件密码破解程序,一旦它从字典单词列表中删除它,我需要它来显示密码。每当我运行它时,它只会提取文件,并且不会打印任何内容。如何修复此问题以显示密码?这是我的代码。

import optparse
import zipfile
from threading import Thread

def extract_zip(zFile, password):
        try:
                password = bytes(password.encode('utf-8'))
                zFile.extractall(pwd=password)
                print ("[+] Password Found: " + password + '\n')
        except:
                pass

def Main():
        parser = optparse.OptionParser("useage &prog "+\
                        "-f <zipfile> -d <dictionary>")

        parser.add_option('-f', dest='zname', type='string',\
                        help='specify zip file')
        parser.add_option('-d', dest='dname', type='string',\
                        help='specify dictionary file')
        (options, arg) = parser.parse_args()
        if (options.zname == None) | (options.dname == None):
                print (parser.usage)
                exit(0)
        else:
                zname = options.zname
                dname = options.dname

        zFile = zipfile.ZipFile(zname)
        passFile = open(dname)

        for line in passFile.readlines():
            password = line.strip('\n')
            t = Thread(target=extract_zip, args=(zFile, password))
            t.start()

if __name__ == '__main__':
        Main()

2 个答案:

答案 0 :(得分:1)

问题是您正在尝试打印编码的密码而不是原始密码。您不能将字节连接到字符串。因此,请打印原始密码,而不是bytes()的结果。

而不是从存档中提取所有文件,使用testzip()来测试您是否可以解密它们。但要做到这一点,每个线程都需要自己的ZipFile对象。否则,他们将设置另一个线程使用的密码。

def extract_zip(filename, password):
    with ZipFile(filename) as zFile:
        try:
            password_encoded = bytes(password.encode('utf-8'))
            zFile.setpassword(password_encoded)
            zFile.testzip()
            print ("[+] Password Found: " + password + '\n')
        except:
            pass

然后更改调用者以将文件名传递给线程,而不是zFile

答案 1 :(得分:0)

import zipfile
from tqdm import tqdm

def chunck(fd,size=65536):
    while 1:
        x=fd.read(size)
        if not x: 
            break
        yield x

def file_len(path):
    with open(path,'r',encoding='utf-8',errors='ignore') as fd:
        return sum(x.count('\n') for x in chunck(fd))

def linear_zip_crack(zip_path,pwd_path):
    ln=file_len(pwd_path)
    zp=zipfile.ZipFile(zip_path)
    with open(pwd_path,'rb') as fd:
        for x in tqdm(fd,total=ln,unit='x'):
            try:
                zp.extractall(pwd=x.strip())
            except:
                continue
            else:
                print(f'pwd={x.decode().strip()}')
                exit(0)
    print('Not found')

linear_zip_crack('spn.zip','pwds.txt')