zipfile库
要想编写一个zip文件口令破解机,我们首先要了解zipfile这个库,我们可以通过
help ('zipfile') 命令进一步了解这个库。
我们重点要看的是ZipFile类中的extractall()方法。
注意extractall()方法用可参数和指定密码方式
测试Zip文件库的用法
接下来我们快速编写一个脚本来测试ip文件库的用法,导入库后,用带口令保护的zip文件的文件名,实例化一个新的ZipFile类,要解压我们要用到extracall()方法,并在可选参数pwd上填上口令。
import zipfile
zFile = zipfile.ZipFile("evil.zip")
zFile.extractall(pwd="secret")
我这里首先将demo与自己创建的一个txt文件压缩成的密码为secret且文件名为evil.zip在同一目录下。
接下来我们执行脚本:
cd C:\Users\s_s_s\Desktop\zip_Password_cracking
python demo.py
接下来我们就可在当前目录下得到解压后的文件:
那么如果我们使用错误的密码会怎么样呢?我们要对错误信息进行捕捉和处理,使其能显示错误信息。
import zipfile
zFile = zipfile.ZipFile("evil.zip")
try:
zFile.extractall(pwd="myh4ck1ife")
except Exception, e:
print e
我们再次运行脚本:
我们可以看到打印出了报错信息,提示了我们使用了错误的密码。
设计思路
那么有了上面的报错,我们就可以用因口令不正常抛出的异常来测试我们的密码字典文件中是否有我们
zip文件的密码,我们在实例化一个ZipFile类之后,我们打开字典,遍历并测试字典中的每个字符串,如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
然后我们在目录下新建dictionary.txt作为密码的字典文件
然后我们运行一下脚本
我们可以看到,已经可以正确的识别出zip文件的口令。
代码整洁
我们要力求代码整洁,所以我们要尽量使用函数模块化脚本,而不是线性执行的程序。
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 '[+] 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文件dictionary字典文件,而不能去适应我们的代码,所以我们的想法是去让要破解的zip的文件名和字典文件名,这里我
们需要导入optparse库,它是用于解析脚本的标志和可选参数的。在脚本中,我们将添加两个强制性flag-zip文件名和字库名。
import zipfile
import optparse
from threading import Thread
def extractFile(zFile,password):
try:
zFile.extractall(pwd=password)
print '[+] Password = ' + password + '\n'
except:
pass
def main():
parser = optparse.OptionParser("usage%prog " + "-f -d ")
parser.add_option('-f', dest='zname', type='string', help='specify zip file')
parser.add_option('-d', dest='dname', type='string', help='specify zip 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()
Congratulations!~
思考
本
程序是我在看《python绝技,运用python成为顶级黑客》时做的笔记总结之一,不管多么简单的事情只要想添加到blog中就非常细心,会花费很长
时间,自己动手敲,改错,思考,去想有没有更好的办法,不过心里还是很开心,最后还是把程序写了出来,也收获了很多知识,转载请注明地址。
源码下载
如果对您有帮助,请star。