用Python实现zip密码破解实例
大家好,本篇文章主要讲的是用Python实现zip密码破解实例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
目录
原理
python的zipfile库
暴破zip文件口令
利用线程提高性能
用户自定义参数
脚本完整代码
总结
原理
原理很简单,就是循环遍历字典中的每一个密码,尝试破解。除此之外,此脚本用线程提高性能,用脚本选项提高了灵活性
最后脚本运行结果如下,完整代码在最下面
python的zipfile库
编写Zip文件口令破解脚本前,我们要先了解一下python的zipfile库。
如果没有安装库,需要先用pip安装库
在终端中打开python,查看zipfile库的帮助信息
1 | python |
1 | help ( 'zipfile' ) |
可以看到如下信息:
这里只展示了部分,还有很多其他说明,大家可以自己看看
我们重点看一下ZipFile类中的extractall()方法,这个方法对我们编写破解有口令保护的zip文件脚本很有帮助。
其中pwd参数是zip文件的保护口令
我们编写一个脚本了解一下zipfile库的使用方法
在python编辑器上创建一个名为 zip_crack.py 的文件,我用的是pycharm,大家也可以用其他的编辑器
先导入zipfile库,然后用加密后的zip文件实例化一个ZipFile类
若没有加密的zip文件,可以在kali下用zip命令加密zip文件,具体如下
随便写入一些内容后:wq保存
然后用zip加密压缩此文件
我们用此加密的zip文件实例化ZipFile类
1 | zFile = zipfile.ZipFile( "grit.zip" ) |
然后使用extractall()方法 解压这个zip文件,并在pwd参数上填入加密此zip的口令
1 | zFile.extractall(pwd = ‘ 12345 ') |
接下来,我们查看当前目录情况并运行此脚本
可以看到,成功解压了zip文件
为了更好的理解,我们用错误的密码尝试一下
运行此脚本,看看结果
可以看到,无法解压,提示错误的密码
暴破zip文件口令
下面,我们尝试用字典破解有口令保护的zip文件
大家如果有自己的字典,可以用自己的,如果没有,可以创建一个简单的字典
写一个python脚本尝试字典中的每一个口令
实例化一个zipfile类后,打开字典文件
1 | zFile = zipfile.ZipFile( "grit.zip" ) |
1 | passFile = open ( "dict.txt" ) |
遍历测试字典中的每一个单词,若口令不正确,则抛出异常,若口令正确,则输出口令
1 2 3 4 5 6 7 | for line in passFile.readlines(): password = line.strip( '\n' ) try : zFile.extractall(pwd = password) print ( "[+] Found password " + password + '\n' ) except Exception,e: pass |
我们执行一下这个脚本,看看效果
成功破解了zip口令
为了使代码能重复使用,我们模块化此脚本
extractFile(zFile,password)函数用密码参数来尝试打开加密的zip文件
1 2 3 4 5 6 | def extractFile(zFile, password): try : zFile.extractall(pwd = password) print ( "[+] Found password " + password + '\n' ) except : pass |
main()函数遍历字典,尝试密码
1 2 3 4 5 6 | def main(): zFile = zipfile.ZipFile( "grit.zip" ) passFile = open ( "dict.txt" ) for line in passFile.readlines(): password = line.strip( '\n' ) extractFile(zFile, password) |
利用线程提高性能
这样能遍历每一个单词,执行完一个才能执行下一个,如果字典文件非常大,那需要很长时间才能读完字典。为了提高性能,我们可以用线程同时尝试多个口令,这就需要用到python中线程模块了
我们改进一下我们的代码
首先导入包
1 | from threading import Thread |
然后再main()函数中用线程执行extractall()函数
用户自定义参数
用到线程,就提高了性能。但我们对不同的zip破解时,或想用其他字典时,我们还要改代码,来修改zip文件和字典文件。
为了提高脚本的灵活性,我们可以用python中的optparse库来设置参数选项
同样,需要导入模块
1 | import optparse |
若没有,需要自己安装,这里就不演示了
在main()函数中写入参数配置代码
1 2 3 4 5 6 7 8 9 10 | 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和 passFile 参数改为对应的变量
最后,为了能更好的理解代码运行,可以加入一些输出代码输出一些提示信息
脚本完整代码
下面是脚本的完整代码
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 29 30 31 | import zipfile import optparse from threading import Thread def extractFile(zFile, password): try : zFile.extractall(pwd = password) print ( "[+] Found password " + password + '\n' ) except : print ( "[-] " + password + " Failed" ) 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' ) print ( "[*] Trying password: " + password) t = Thread(target = extractFile, args = (zFile, password)) t.start() if __name__ = = '__main__' : main() |
我们在终端运行脚本,最后成功破解了口令
可以看到,找到了密码
这里我只是举了个简单的例子,用的字典很小。在实际暴破zip口令时,能否成功破解往往取决于字典的好坏,可以在字典中写入常用密码,或用社会工程学的方法获取一些有用的信息,添加到字典中,有助于破解密码。
总结
到此这篇关于用Python实现zip密码破解实例的文章就介绍到这了
原文链接:https://blog.csdn.net/m0_54620177/article/details/122535973