【问题标题】:Python zipfile library fixPython zipfile 库修复
【发布时间】:2022-05-03 02:32:37
【问题描述】:

我有一个问题。我制作了一个简单的 zip 文件,密码为 12345。 现在,当我尝试使用蛮力提取密码时,zipfile 选择了错误的密码。它说它找到了密码 aaln0,但提取的文件完全是空的。有没有办法“修复”图书馆?或者有替代品吗?谢谢

程序代码:

#!/usr/bin/env python
import itertools
import threading
import argparse
import time
import zipfile
import string
global found
found = False

def extract_zip(zFile, password):
    """
    Extract archive with password
    """
    try:
        zFile.extractall(pwd=password)
        write("[+] Password found:", password, "\n")
        global found
        found = True
    except Exception, e:
        pass

def write(*args):
    print "[%s] %s" % (time.ctime(), " ".join(args))

def main_loop(zFile, length):
    """
    Main loop
    """
    write("[*] Python Brute-Force zip cracker")
    write("[*] Zipfile: %s; password length: %s" % (zFile, length))
    try:
        zfile = zipfile.ZipFile(zFile)
    except:
        write("Cannot open zip file")
        exit(1)
    for combo in itertools.imap(''.join, itertools.product(string.letters + string.digits,
                                                            repeat=length)):
        if found:
            break
        thread = threading.Thread(target=extract_zip, args=(zfile, combo))
        thread.start()
    if not found:
        write("[-] Password not found")

def main():
    """
    Main function
    """
    parser = argparse.ArgumentParser(usage="brute-force-zipcracker.py -f <zipfile> -l <password length>")
    parser.add_argument("-f", "--zipfile", help="specify zip file", type=str)
    parser.add_argument("-l", "--length", type=int, help="password length", default=5)
    args = parser.parse_args()
    if (args.zipfile == None):
        print parser.usage
        exit(0)

    main_loop(args.zipfile, args.length)

if __name__ == '__main__':
    main()

【问题讨论】:

  • 在这个问题中没有任何信息可以使用。 zipfile 你需要什么“修复”?你的代码是什么样的,aaln0 来自哪里?
  • @Torxed,正如我所说,我正在使用蛮力。我正在生成长度为 5 的所有可用组合,然后尝试使用这些密码打开 zip。 zip 文件的密码是12345,但程序说密码是aaln0。我添加了代码
  • 没有得到异常意味着解压器在处理解密数据时没有问题。它仍然可能是错误的数据。
  • @JanneKarila,我知道。但我想问:有没有办法防止zipfile选择错误的密码?
  • 您可以做的一件事是对照 zip 目录检查解压缩文件的大小。

标签: python passwords python-zipfile


【解决方案1】:

首先,你正在做:

for combo in itertools.imap(...):
    if found:
        break
    thread = ...
    thread.start()
if not found:
    ...

请看一下。
found 是在一个线程中定义的,但是您正在启动多个线程,并且您全局希望它将在其中一个线程中设置。 如何确保正确的线程完成了正确的工作?如果其中一个线程出现误报并且您不费心从每个单独的线程中检索值怎么办。小心你的线程!

其次, 如果线程没有及时完成您的combo 循环,您将最终进入if not found,因为线程尚未完成运行以找到您要查找的内容,特别是如果您有更大的 zip-需要几秒钟才能完成的文件(成功的密码将开始解压缩文件,这可能需要几分钟,并且在该过程完成之前不会设置found)。

最后得到用于保护这个 zip 文件的参数会很整洁。

编辑:

您也可以通过以下格式向我们提供更多信息:

zFile.debug(3)
zFile.testzip()
zFile.extractall(pwd=password)

还有来自zipfile.ZipInfo(filename)的其他有用的东西

然后去解决

#!/usr/bin/env python
import itertools
import argparse
import zipfile
import string

def extract_zip(filename, password):
    try:
        zFile = zipefile.ZipFile(filename)
        zFile.extractall(pwd=password)
        return True
    except zipfile.BadZipFile:
        return False

def main_loop(filename, length):
    print("[*] Python Brute-Force zip cracker")
    print("[*] Zipfile: %s; password length: %s" % (zFile, length))
    cracked = False
    for combo in itertools.imap(''.join, itertools.product(string.letters + string.digits, repeat=length)):
        cracked = extract_zip(filename, combo)
        if cracked:
            print('Yaay your password is:',combo)
            break
    if not cracked:
        print('Sorry, no luck..')
def main():
    parser = argparse.ArgumentParser(usage="brute-force-zipcracker.py -f <zipfile> -l <password length>")
    parser.add_argument("-f", "--zipfile", help="specify zip file", type=str)
    parser.add_argument("-l", "--length", type=int, help="password length", default=5)
    args = parser.parse_args()
    if (args.zipfile == None):
        print parser.usage
        exit(0)

    main_loop(args.zipfile, args.length)

if __name__ == '__main__':
    main()

【讨论】:

  • 嗯。也许我应该使用 threading.Semaphore 呢?或者我最好不要使用线程?另外,用于保护 zip 文件的参数是什么意思?你是说我是怎么创建的?如果您需要,我可以发布 zip 文件
  • 是的,zip 文件可能很有用,如果不是,用于保护文件文件的参数就足够了。例如7za a pw.7z *.txt -pSECRET
  • 好的,这是 zip 文件:randomgalaxy.com/stackoverflow/crackme.zip。我使用zip -e crackme.zip dictionary2.txt 创建了它。密码是12345。 P.S. 当我尝试运行你的代码 zFile.debug(3) 时,我得到一个错误:TypeError: 'int' object is not callable
  • @Vik2015 我几乎确信这是一个线程问题。很可能是因为您在线程外部使用zip.ZipFile() 打开文件,然后将该打开的文件句柄传递给每个线程,然后您尝试提取它,这会导致 CRC 问题,并且您可能最终会遇到以下问题:@ 987654336@ + Thread#2: SUCCESS!! + Thread#3: CRC failed 覆盖 Thread#2 所做的一切......等等......要么你做一个更好的线程处理,要么你简单地为线程创建某种形式的统一留言板来检查是否有其他线程已成功提取。
  • 我不这么认为...尝试在 python 终端中执行此操作:import zipfile; z = zipfile.ZipFile('crackme.zip'); z.extractall('aaln0')。同样,真实密码是12345
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多