专栏名称: python
隔天更新python文章,我希望用我的努力换来劳动的成果帮助更多的人掌握一门技术,因此我要更加努力。
目录
相关文章推荐
Python开发者  ·  国产 DeepSeek V3 ... ·  2 天前  
Python爱好者社区  ·  DeepSeek创始人梁文锋个人履历 ·  3 天前  
Python爱好者社区  ·  离谱!下载DeepSeek最高判刑20年? ·  2 天前  
Python爱好者社区  ·  1885页的Python完全版电子书 ·  3 天前  
Python开发者  ·  o3-mini 碾压 DeepSeek ... ·  6 天前  
51好读  ›  专栏  ›  python

Python黑客入门:暴力破解zip,零基础也可以学会!

python  · 公众号  · Python  · 2019-05-21 17:07

正文

照顾没有接触过Python编程的同学,行文可能会有些啰嗦。

废话少说,我们进入正题。

2.1准备基本材料

/home/ziptest/目录下 ,我创建了两个文件,一个 test.zip ,是一个设置了密码的zip包,密码为456789。

dict.txt文件 是一个字典文件,简单的配置了几个密码。

下面我们打开开发工具,开始编写测试代码。


2.2 ZIPFILE

在python中操作zip文件,最简单的方式就是使用zipfile模块,使用该模块可以用来判断一个文件是否是压缩文件,创建、解压文件,获取zip文件的元数据信息。可以使用python的help方法查看该模块的使用方法。

这里我们首先关注下 ZipFile类


该类用来打开,读取,修改,解压zip文件 。我们想要操作一个zip文件,第一步就是 初始化ZipFile实例 。下面我们打开我们准备好的text.zip文件。

import  zipfile


zFile = zipfile.ZipFile("/HOME/TEST.ZIP");

我们只传了一个路径参数进去,从帮助文档我们可以看到,后面三个参数都有默认值,这里我们使用默认值就够了。

下面我们关注下ZipFile类的 extractall 方法。



extractall方法 ,是把压缩包里面的内容都解压出来,三个参数,path是解压的路径, members 是需要解压出来的文件,pwd是密码。

现在我们可以测试下文件解压了。

import  zipfile


zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");

zFile.extractall("/HOME/",pwd="456789");

运行这个脚本。



密码正确的话,会正常解压文件。如果密码不正确会出现什么情况呢?我们在代码中输入一个错误的密码。

import  zipfile


zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");

zFile.extractall(path="/HOME/ZIPTEST",pwd="4567890");

结果如下:


程序会抛出 “bad password” 的异常。

我们可以通过捕获异常,测试多个密码。

2.3  读取字典文件

在Python中打开文件,使用 open方法 ,这是一个内置方法,查看open的帮助文档,可以看到该方法的参数说明。

open方法返回一个file对象, 利用file对象 ,我们可以读取文件的具体内容。下面我们在代码中测试一下。

import  zipfile


passFile = open('/HOME/ZIPTEST/DICT.TXT');

for line in passFile.readlines():

password = line.strip('N');

print(password);

运行结果如下:


下面我们利用读取到的密码来暴力测试zip文件。

import  zipfile


zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");



passFile = open('/HOME/ZIPTEST/DICT.TXT');

for line in passFile.readlines():

password = line.strip('N');

try:

zFile.extractall(path="/HOME/ZIPTEST",pwd=password);

print("PASSWORD IS:"+password);

exit(0);

except:

pass;

在上面的代码中,我们使用try—except进行异常捕获,密码不正确的时候,程序跳过继续执行。密码正确的时候打印密码,终止程序。运行结果如下:


到目前为止,我们的脚本已经具备了暴力破解zip文件的功能,大家可以看到只有十几行的代码。下面我们为了提升程序的可用性,重构一下这个脚本,利用函数划分功能。

2.4  重构  用函数划分功能

首先定义一个 extractFile 函数 ,该函数接收三个参数,一个 zipfile对象 ,解压的目标路径,密码,如果解密成功则返回密码。

def extractFile(toPath,zFile,password):

try:

zFile.extractall(path=toPath,pwd=password);

return password;

except Exception,e:

return;

下面我们再声明一个 main方法

def main():

zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");

passFile = open('/HOME/ZIP/TEST/DICT.TXT');

for line in passFile.readlines():

password = line.strip('N');

guess = extractFile("/HOME/",zFile,password);

if guess:

print('SCUCESS'+password);

exit(0);

main方法 中,首先初始化了 zipfile对象 ,然后打开字典文件,循环读取密码,传给 extractFile方法 调用。

分离 了两个方法之后,我们需要在程序的入口处调用 main方法 ,完整代码如下:

import  zipfile


def extractFile(toPath,zFile,password):

try:

zFile.extractall(path=toPath,pwd=password);

print('SCUCESS'+password);

return password;

except Exception,e:

return;

def main():

zFile = zipfile.ZipFile("/HOME/ZIPTEST/TEST.ZIP");

passFile = open('/HOME/ZIPTEST/DICT.TXT');

for line in passFile.readlines():

password = line.strip('N');

guess = extractFile("/HOME/",zFile,password);

if guess:

print('SCUCESS'+password);

exit(0);



if __name__=='__MAIN__':

main();

这样一来,代码清晰了很多,但是我们更换zip文件和字典文件的时候,还是需要修改代码,很不方便,正常的程序都应该可以传递参数的,ok,下面我们引入 optparse库

2.5 OPTPARSE






请到「今天看啥」查看全文