【Python学习】第一个Python小程序:Zip文件口令破解器

音乐响起~


最近在看一本关于Python应用的书,本身也刚接触Python不久,已被py的强大魅力所感染!下面就不介绍基本的语法了,有兴趣的自行了解吧!这里参照书中代码,实现了一个简单的Zip文件口令破解器(大神勿喷),给大家分享一下收获吧~

什么是Python?

Python, 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。
Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

                                ————以上来自某度

破解器原理及代码实现

破解器原理

Zip文件口令破解器的原理:简单暴力的理解就是借助于字典文件逐条尝试,直到找到密码,并返回密码。normal;”>可说着简单,要怎么实现呢?我们的Zip文件口令破解器也正是得益于强大的Python库来实现!这里我们主要用到了zipfile库,想进一步了解这个库,只需要打开Python解释器,用help(‘zipfile’)命令即可,如图:

这里我们着重看一下ZipFile类中的extracall()方法 :

我们先创建一个加密的zip文件target.zip,密码为passWord。利用zipfile库的extractall()方法解压的用法很简单:

1
2
3
import zipfile
zfile = zipfile.ZipFile("target.zip")
zfile.extractall(pwd="passWord")

把脚本和压缩文件放在同目录下运行脚本就可以解压了。解压成功会发现出来一个和压缩文件同名的文件夹,里面就是被解压出来的东西。但是如果密码不对解压失败呢?我们在脚本中捕捉处理一下,显示一下这个错误的信息:

1
2
3
4
5
6
7
# coding: utf-8
import zipfile
zfile = zipfile.ZipFile("target.zip")
try:
zfile.extractall(pwd="test") # 正确的密码为"passWord"
except Exception,exc:
print exc

结果如图:

因此,我们可以利用密码不正确是抛出的这个异常信息来判断字典文件中的密码是否为压缩文件target.zip的解压密码。

初步实现

打开字典文件,遍历测试每个密码,如果extractall()执行成功,则打印出密码,程序结束。如果extractall()返回口令错误的异常信息,则忽略此异常,继续测试下一密码。下面我们用函数模块化我们的脚本,并且利用多线程同时测试来提高性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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('target.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()

这里我们需要创建一个字典文件,为了测试我就随便建了个txt文档,里面写了些常见的单词(当然包括我们的“密码”)。运行一下,如图:

效果还可以~当然如果字典里如果没有压缩文件的密码的话,程序结束后,不会打印任何信息。但是这样呢总感觉还少点什么,我们能不能自己指定压缩文件和字典文件呢?答案是必须的~要做到这点我们还会用到另一个optparse库(help(‘optparse’)一下吧~)。

整个破解器的最终代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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("usage%prog " + "-f <zipfile> -d <dictionary>")
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()

测试

怀着鸡冻的心情让我们测试一下最终版,结果如图:

成功!!!

整个破解器只要28行代码!!!

这里我们用dic.txt字典破解了rookiehacker.zip文件。不管密码多复杂,只要字典够牛就可以,所以有个好字典还是灰常重要滴……………..

好啦!就写到这吧~代码虽然是借鉴了书上的,但感觉收获还是满满的啊~~以后自己也一定写一些属于自己的工具!

内容如有错误,欢迎评论指出或Email me!

欢迎大家关注菜鸟安全笔记公众号,和小菜鸟一起成长~

安全路上,菜鸟起飞~