今天发生了个有趣的事情,有个朋友发了一个带密码保护的Zip文件给我,却不给我密码,我就琢磨这怎么可以'猜'到密码呢?
经过一系列的尝试,最终使用python把这个密码给'猜'出来了。要想写出破解密码的脚本需要了解一下python的zipfile库,这里百度上的资源多的很,我就直接给大家上代码再一一解释。
import
zipfile
from
threading
import
Thread
|
首先导入zipfile 和 Thread库下的threading,作用分别是:可以通过代码来打开zip文件,有密码保护我们提供密码就行了(至于怎么提供我后面会讲^_^); 开启多线程来'猜'密码,使得效率更高!
这里我们可以练习一下zipfile是怎么打开文件的呢?
1
2
|
zipFile
=
zipfile.ZipFile(
"test1.zip"
)
zipFile
=
extractall(pwd
=
bytes(
"123"
,
"utf8"
))
|
我们在和这个练习的python脚本相同路径下生成一个压缩密码为:123的压缩包,命名为test1.zip 当然你可以在任何地方生成练习文件,打开的时候记得写上绝对路径就OK啦~~
你会发现这个代码运行后你的压缩文件被解压啦,我们思考一下那么密码错误怎么办呢,当然就是打不开啦。我们利用这个特性,使用python的预防错误机制try ,except 这个机制的意思是:如果我放在try:里面要执行的代码有问题,程序不会报错而会运行except: 下面的代码。
核心:那我们就利用这点,让程序去给我们尝试几乎无限种可能的密码的排列组合,如果密码错误就跳过,知道找到密码为止~
题外话:我觉得我那个朋友设置的密码应该会是数字,所有我用python写了一个.txt文件:将0到10000000的数字全部写入。貌似有80多MB....真的很大...
接下来就开始猜密码了:
1
2
3
4
5
6
|
def
extractFile(zipFile, password):
###提取文件的类
try
:
zipFile.extractall(pwd
=
bytes(password,
"utf8"
))
###打开压缩文件,提供密码...
print
(
"This file\'s password is "
+
password)
###破解到密码
except
:
pass
###假如失败,就跳过继续
|
写了一个方法:这个方法需要我们提供需要破解的文件的相关信息, 然后需要我们提供这个文件的密码(我们当然不知道密码,不过很快就会知道的了~~~)
1
2
3
4
5
6
7
|
def
mainStep():
zipFile
=
zipfile.ZipFile(
'C:\\Users\\Flash\\Desktop\\Secret.zip'
)
# 这里的第二个参数用r表示是读取zip文件,w是创建一个zip文件,默认是r
PwdLists
=
open
(
'C:\\Users\\Flash\\Desktop\\dictionary.txt'
)
#读入所有密码
for
line
in
PwdLists.readlines():
#挨个挨个的写入密码
Pwd
=
line.strip(
'\n'
)
t
=
Thread(target
=
extractFile, args
=
(zipFile, Pwd))
t.start()
|
然后我们再写一个方法:这个方法是为extractFile方法提供需要破解文件的相关信息的, 然后在打开‘密码字典’把密码字典的所有东西都读到PwdLists里面, 通过for循环把PwdLists里面的每个密码都拿去尝试,直到有正确密码为止 t = Thread(target=extractFile, args=(zipFile, Pwd)) 这个的意思是在线程先运行使得尝试的速度更快,具体可以百度了解线程的知识。
这个是我生成的密码字典 和 我破解的朋友的密码~~~/得意 O(∩_∩)O哈哈~
我贴出全部代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import
zipfile
from
threading
import
Thread
def
extractFile(zipFile, password):
###提取文件的类
try
:
zipFile.extractall(pwd
=
bytes(password,
"utf8"
))
###打开压缩文件,提供密码...
print
(
"This file\'s password is "
+
password)
###破解到密码
except
:
pass
###假如失败,就跳过继续
def
mainStep():
zipFile
=
zipfile.ZipFile(
'C:\\Users\\Flash\\Desktop\\Secret.zip'
)
# 这里的第二个参数用r表示是读取zip文件,w是创建一个zip文件,默认是r
PwdLists
=
open
(
'C:\\Users\\Flash\\Desktop\\dictionary.txt'
)
#读入所有密码
for
line
in
PwdLists.readlines():
#挨个挨个的写入密码
Pwd
=
line.strip(
'\n'
)
t
=
Thread(target
=
extractFile, args
=
(zipFile, Pwd))
t.start()
if
__name__
=
=
'__main__'
:
mainStep()
|