python使用密码字典暴力破解zip压缩文件

闲来无事,照葫芦画瓢写了一个Zip文件口令破解脚本。其中最主要的工作是由zipfie库来完成的,首先可以通过help('zipfile')命令来了解这个库:

 

 简单介绍的话,zipfile库是python中用来做zip格式编码的压缩和解压的,它有两个非常重要的类,分别是ZipFile和ZipInfo。前者用于压缩和解压zip文件,后者用于存储zip文件的信息,我们主要使用到的是前者。当用ZipFile解压带有密码的zip文件时,extractall方法需要提供密码作为参数,而密码的尝试次数是不受限制的,这就是暴力破解的前提条件。我们可以通过不断地尝试密码字典中的密码,直到试出密码或者试完字典破解失败。为了直观了解ZipFile,我们来 看以下它最简单的使用场景:

1 import zipfile    #导入zipfile库
2 zFile = zipfile.ZipFile("tast.zip")    #用同目录下的taet.zip文件实例化一个ZipFile类
3 zFile.extractall(pwd='123456')    #使用extractall方法解压文件,并提供”pwd”密码参数

这就是破解的核心代码,接下来通过函数将脚本模块化,利用for循环遍历字典中的密码,不断更换“pwd”参数:

import zipfile
from threading import Thread

# 破解函数,参数为待破解文件和密码字典
def extractFile(zFile,passFile):
    for line in passFile.readlines():
        password = line.strip('\n')  #按行读取字典中的密码  
        try:
            zFile.extractall(pwd=password.encode())    #将从字典中读取到的密码作为参数赋值给pwd
            print("password="+password)    #如果解压成功,则输出密码 
        except Exception as e:#否则输出遇到的错误,这里pass了,因为在循环体里面,输出的话太多了
            pass


# 主函数
def main():
    zFile=zipfile.ZipFile('test.zip')    #实例化zFile
    passFile1=open('dictionary1.txt')    #打开同目录下的字典1
    passFile2=open('dictionary2.txt')    #打开同目录下的字典2
    t1 = Thread(target=extractFile,args=(zFile,passFile1))#为每一个密码字典生成一个线程去验证
    t1.start()
    t2 = Thread(target=extractFile,args=(zFile,passFile2))#为每一个密码字典生成一个线程去验证
    t2.start()

if __name__ == '__main__':
    main()

上面就是一个简单的zip文件密码破解脚本,可以看出,能否破解完全依赖于字典质量,如果字典里没有该文件的密码的话,该方法将失效。这也警醒我们,平时设置密码不能太简单,不要与自己的姓名生日等信息强关联,要定期更换密码等。

破解脚本中使用了两个线程,分别对字典1和字典2进行尝试,原以为这样能提高破解的性能,但实践告诉我并不行。使用两个线程同时对两个字典进行尝试和只有一个主线程线性地对两个字典进行尝试,在我使用的例子中,两个字典分别是20000个密码的量级,前者比后者竟然还慢1秒多,我估计原因是这样的:线程之间切换是需要时间的,两个线程交替的争夺CPU资源,换来的只是两个字典同时进行这一好处而已,反而由于线程之间的切换,使得花费的时间更久。下面是只有一个线程的破解脚本:

import zipfile

# 破解函数,参数为待破解文件和密码字典
def extractFile(zFile,passFile):
    for line in passFile.readlines():
        password = line.strip('\n')
        try:
            zFile.extractall(pwd=password.encode())
            print("password="+password)
        except Exception as e:
            pass


# 主函数
def main():
    zFile=zipfile.ZipFile('test.zip')
    passFile1=open('dictionary1.txt')
    passFile2=open('dictionary2.txt')
    extractFile(zFile, passFile1)
    extractFile(zFile, passFile2)

if __name__ == '__main__':
    main()

以上就是python使用密码字典暴力破解zip压缩文件的方法和代码。

posted @ 2022-01-09 16:38  衣青云  阅读(2574)  评论(0编辑  收藏  举报