百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-08-29 11:41 2 浏览

Python黑客入门

2.1准备基本材料

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

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

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

2.2 ZIPFILE

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

如果你在学习Python的过程当中有遇见任何问题,可以加入我的python交流学习qq群:487526820,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我.

这里我们首先关注下 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');

forlineinpassFile.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对象 ,解压的目标路径,密码,如果解密成功则返回密码。

defextractFile(toPath,zFile,password):

try:

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

returnpassword;

exceptException,e:

return;

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

defmain():

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

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

forlineinpassFile.readlines():

password = line.strip('N');

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

ifguess:

print('SCUCESS'+password);

exit(0);

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

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

import zipfile

defextractFile(toPath,zFile,password):

try:

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

print('SCUCESS'+password);

returnpassword;

exceptException,e:

return;

defmain():

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

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

forlineinpassFile.readlines():

password = line.strip('N');

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

ifguess:

print('SCUCESS'+password);

exit(0);

if__name__=='__MAIN__':

main();

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

2.5 OPTPARSE

Python 有两个内建的模块用于处理命令行参数:

一个是 getopt ,《Deep in python》一书中也有提到,只能简单处理 命令行参数;

另一个是 optparse ,它功能强大,而且易于使用,可以方便地生成标准的、符合 Unix/Posix规范的命令行说明。

首先先引入 optparse模块 ,然后强制添加两个参数, zip文件名和字典文件名 。先看代码:

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 dict file');

(options,args)=parser.parse_args();

if(options.zname==None)|(options.dname==None):

printparse.usage;

exixt(0);

else:

zname=options.zname;

dname=options.dname;

zFile = zipfile.ZipFile(zname);

passFile = open(dname);

forlineinpassFile.readlines():

password = line.strip(' ');

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

ifguess:

print('scucess'+password);

exit(0);

首先初始化一个 OptionParser对象 ,然后添加两个选项—— “-f”和“-d” 。之后在程序运行的时候通过 parse_args方法 获取输入的参数,如果参数为空,则打印使用方法,退出程序。

下面使用终端来测试这个程序。

无参数情况下:

输入参数:

2.6 小结

这个程序本身并没有什么难点,但是通过这个入门案例,我们可以体验Python编程的基本方法,如何查看帮助文档,如何引入模块,初始化对象,操作zip文件,打开本地文件,命令行参数设置。

相关推荐

Java 泛型大揭秘:类型参数、通配符与最佳实践

引言在编程世界中,代码的可重用性和可维护性是至关重要的。为了实现这些目标,Java5引入了一种名为泛型(Generics)的强大功能。本文将详细介绍Java泛型的概念、优势和局限性,以及如何在...

K8s 的标签与选择器:流畅运维的秘诀

在Kubernetes的世界里,**标签(Label)和选择器(Selector)**并不是最炫酷的技术,但却是贯穿整个集群管理与运维流程的核心机制。正是它们让复杂的资源调度、查询、自动化运维变得...

哈希Hash算法:原理、应用(哈希算法 知乎)

原作者:Linux教程,原文地址:「链接」什么是哈希算法?哈希算法(HashAlgorithm),又称为散列算法或杂凑算法,是一种将任意长度的数据输入转换为固定长度输出值的数学函数。其输出结果通常被...

C#学习:基于LLM的简历评估程序(c# 简历)

前言在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。准备不同的简历:image-20250528183949844查...

55顺位,砍41+14+3!季后赛也成得分王,难道他也是一名球星?

雷霆队最不可思议的新星:一个55号秀的疯狂逆袭!你是不是也觉得NBA最底层的55号秀,就只能当饮水机管理员?今年的55号秀阿龙·威金斯恐怕要打破你的认知了!常规赛阶段,这位二轮秀就像开了窍的天才,直接...

5分钟读懂C#字典对象(c# 字典获取值)

什么是字典对象在C#中,使用Dictionary类来管理由键值对组成的集合,这类集合被称为字典。字典最大的特点就是能够根据键来快速查找集合中的值,其键的定义不能重复,具有唯一性,相当于数组索引值,字典...

c#窗体传值(c# 跨窗体传递数据)

在WinForm编程中我们经常需要进行俩个窗体间的传值。下面我给出了两种方法,来实现传值一、在输入数据的界面中定义一个属性,供接受数据的窗体使用1、子窗体usingSystem;usingSyst...

C#入门篇章—委托(c#委托的理解)

C#委托1.委托的定义和使用委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托通过delegate关键字来声明。声明委托的...

C#.NET in、out、ref详解(c#.net framework)

简介在C#中,in、ref和out是用于修改方法参数传递方式的关键字,它们决定了参数是按值传递还是按引用传递,以及参数是否必须在传递前初始化。基本语义对比修饰符传递方式可读写性必须初始化调用...

C#广义表(广义表headtail)

在C#中,广义表(GeneralizedList)是一种特殊的数据结构,它是线性表的推广。广义表可以包含单个元素(称为原子),也可以包含另一个广义表(称为子表)。以下是一个简单的C#广义表示例代...

「C#.NET 拾遗补漏」04:你必须知道的反射

阅读本文大概需要3分钟。通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员Type类的GetMembe...

C#启动外部程序的问题(c#怎么启动)

IT&OT的深度融合是智能制造的基石。本公众号将聚焦于PLC编程与上位机开发。除理论知识外,也会结合我们团队在开发过程中遇到的具体问题介绍一些项目经验。在使用C#开发上位机时,有时会需要启动外部的一些...

全网最狠C#面试拷问:这20道题没答出来,别说你懂.NET!

在竞争激烈的C#开发岗位求职过程中,面试是必经的一道关卡。而一场高质量的面试,不仅能筛选出真正掌握C#和.NET技术精髓的人才,也能让求职者对自身技术水平有更清晰的认知。今天,就为大家精心准备了20道...

C#匿名方法(c#匿名方法与匿名类)

C#中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于C#匿名方法的一些重要特点和用法:特点省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法...

C# Windows窗体(.Net Framework)知识总结

Windows窗体可大致分为Form窗体和MDI窗体,Form窗体没什么好细说的,知识点总结都在思维导图里面了,下文将围绕MDI窗体来讲述。MDI(MultipleDocumentInterfac...