如何使用Python通过蛮力提取.zip文件

时间:2019-04-04 20:11:18

标签: python python-3.x file zip

我遇到了一个使用python来解决的问题:

  

我们已经开始整理文件以尝试理解它们,但是它们都被数字三位数的密码锁定。

     

看看是否可以编写脚本以进入示例文件alien-zip-2092.zip并读取文本文件,我们认为其中的文件名为zip(因此为alien-zip-2092.txt)。

     

文件应提取到/tmp/目录中。

到目前为止,我的代码中只有这样。它获取了zip文件,并使用0-999中的所有数字将其提取出来,但是每次运行代码时,我最终只会得到999。无法检查文件夹是否已正确提取,因此我添加了Print (password)进行检查。

这是我的代码:

import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
    try:
        zf.extract(member="/tmp", pwd = str(i).encode()         
        password = 'Password found: %s' % password
    except:
        pass
print(password)

似乎我的程序正在用一个具有相同名称的空白文件覆盖正确的文件,因为它在提取文件后没有中断循环,但我可能是错的。

打印出应该位于压缩文件夹中的txt文件的内容将是一个好主意,但是如果没有其余代码,就无法做到这一点。

为什么打印的密码不正确?还有其他想法可以解决主要问题吗?

2 个答案:

答案 0 :(得分:1)

您要为存储“找到密码”消息的变量命名,与for循环的迭代变量相同,因此,一旦下一次迭代开始,它将覆盖已存储的消息。 / p>

您应该改为打印正确的密码,并在找到后立即break循环,并对else循环使用for块来处理没有正确密码的情况找到,如果循环在没有break的情况下结束,则会发生这种情况:

import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
    try:
        zf.extract(member="/tmp", pwd = str(i).encode())
        print('Password found: %s' % password)
        break
    except:
        pass
else:
    print('No valid password found.')

答案 1 :(得分:1)

一些建议:

  • 请勿覆盖变量password,它是您的循环变量。另外,i似乎没有定义,因此您可能想要更改它。
  • 我建议格式化前导零的Smalles数字以符合问题陈述(也许使用'{:03d}'.format()
  • 除了使用空格以外,这不是一个好主意,因为它可能隐藏其他可能发生的错误。
  • 我建议使用.extractall()或至少在member中指定正确的path.extract()

这是代码的修改版本:

import zipfile

filename = 'alien-zip-2092'
zf = zipfile.ZipFile('{}.zip'.format(filename))

password = None
for i in range(1000):
    try:
        temp_password = '{:03d}'.format(i)
        zf.extract(
            member='{}.txt'.format(filename),
            path='/tmp/',
            pwd=temp_password.encode())

        # extraction was successful
        password = temp_password
        break          # exit the for loop
    except zipfile.BadZipFile as err:
        # print(err)
        pass

if password is None:
    print('No valid password found.')
else:
    print('Password found: {}'.format(password))