用Python写一个暴力Zip文件口令破解机-压缩文件密码破解器

一个Zip文件口令破解机

编写Zip%20文件口令破解机要从进修zipfile%20库的使用编制动手。翻开Python%20诠释器,我们用help('zipfile')呼吁进一步体味这个库,并重点看一下ZipFile%20类中的extractall()编制。这个类和这个编制对我们编程破解有口令呵护的Zip%20文件是很有效的。请注意extractall()编制用可选参数指定密码的编制。

programmer$%20python%20Python%202.7.1%20(r271:86832,%20Jun%2016%202011,%2016:59:05)%20Type%20"help",%20"copyright",%20"credits"%20or%20"license"%20for%20more%20information.%20>>>%20help('zipfile')%20<..SNIPPED..>%20class%20ZipFile%20|%20Class%20with%20methods%20to%20open,%20read,%20write,%20close,%20list%20zip%20files.%20|%20|%20z%20=%20ZipFile(file,%20mode="r",%20compression=ZIP_STORED,%20allowZip64=False)%20<..SNIPPED..>%20|%20extractall(self,%20path=None,%20members=None,%20pwd=None)%20|%20Extract%20all%20members%20from%20the%20archive%20to%20the%20current%20working%20|%20directory.%20'path'%20specifies%20a%20different%20directory%20to%20extract%20to.%20|%20'members'%20is%20optional%20and%20must%20be%20a%20subset%20of%20the%20list%20Returned

让我们快速编写一个剧本来测试一下Zip%20文件库的用法。导入库后,用带有口令呵护的Zip%20文件的文件名,实例化一个新的ZipFile%20类。要解压这个Zip%20文件,我们使用extractall()编制,并在可选参数pwd%20上填进口令。

import%20zipfile%20zFile%20=%20zipfile.ZipFile("evil.zip")%20zFile.extractall(pwd="secret")

接下来,我们要实行剧本以确保其正常运转。注意,在实行前,我们当前的工作目录下只需剧本和Zip%20文件。实行剧本后,它会将evil.zip%20的内容解压到一个名为evil/的新建树的目录中,该目录包含有口令呵护的Zip%20文件中的文件。

programmer$%20ls%20evil.zip%20unzip.py%20programmer$%20python%20unzip.py%20programmer$%20ls%20evil.zip%20unzip.py%20evil%20programmer$%20cd%20evil/%20programmer$%20ls%20note_to_adam.txt%20apple.bmp

若是用一个错误密码实行这个剧本会产生什么情形?让我们在剧本中添加一些捕捉和措置非常的代码,表示错误的信息。

import zipfile zFile = zipfile.ZipFile("evil.zip") try: zFile.extractall(pwd="oranges") except Exception, e: print e

用错误的口令实行剧本后,我们看到打印出了一条错误信息,指明用户使用了错误的密码口令去解密/加密的Zip 文件。

programmer$ python unzip.py ('Bad password for file',)

我们可以用因口令不精确而抛出的非常来测试我们的字典文件( 即代码中的dictionary.txt)中是否有Zip 文件的口令。实例化一个ZipFile 类之后,我们翻开字典文件,遍历并测试字典中的每个单词。若是extractall()函数的实行没有出错,则打印一条消息,输出精确的口令。可是,若是extractall()函数抛出了一个口令错误的非常,就忽略这个非常,并继续测试字典中的下一个口令。

import zipfile zFile = zipfile.ZipFile('evil.zip') passFile = open('dictionary.txt') for line in passFile.readlines(): password = line.strip('\n') try: zFile.extractall(pwd=password) print '[+] Password = ' + password + '\n' exit(0) except Exception, e: pass

实行这个剧本后,我们可以看到它精确地识别出了有口令呵护的Zip 文件的口令。

programmer$ python unzip.py [+] Password = secret

如今再来清理一下我们的代码。我们要用函数模块化剧本,而非线性实行的轨范。

import zipfile def extractFile(zFile, password): try: zFile.extractall(pwd=password) return password except: return def main(): zFile = zipfile.ZipFile('evil.zip') passFile = open('dictionary.txt') for line in passFile.readlines(): password = line.strip('\n') guess = extractFile(zFile, password) if guess: print '[+] Password = ' + password + '\n' exit(0) if __name__ == '__main__': main()

在将轨范模块化身分手函数后,我们如今还能去进步机能。我们可以把持线程同时测试多个口令,而不是只能逐个测试词库中的单词。对词库中的每个单词,我们都市生成一个新的线程去测试它。

import zipfile from threading import Thread def extractFile(zFile, password): try: zFile.extractall(pwd=password) print '[+] Found password ' + password + '\n' except: pass def main(): zFile = zipfile.ZipFile('evil.zip') passFile = open('dictionary.txt') for line in passFile.readlines(): password = line.strip('\n') t = Thread(target=extractFile, args=(zFile, password)) t.start() if __name__ == '__main__': main()

如今,我们还要把剧本改削一下,使用户可以指定要破解的Zip 文件的文件名和字典文件的文件名。要做到这一点,必要导入optparse 库,第2 章会更详细地引见这个库。对如今这个剧本所要实现的工具,我们要晓得它是用于解析下面剧本的标识表记标帜和可选参数的。在zipfile-cracker 剧本中,我们将添加两个强迫性flags—zip 文件名和字库名。

import zipfile import optparse from threading import Thread def extractFile(zFile, password): try: zFile.extractall(pwd=password) print '[+] Found password ' + password + '\n' except: pass def main(): parser = optparse.OptionParser("usagerog "+\ "-f-d") 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, args) = 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=extractFile, args=(zFile, password)) t.start() if __name__ == '__main__': main()

末了,带口令呵护的zip-file-cracker 剧本落成了,我们还要对它停止测试。这个剧本只需写35 行代码就够了!

推荐阅读