Python实现Zip文件的暴力破解
zip 文件是加密的,或者忘掉自己压缩后的密码(一想到就头疼)。这时候我们就会想办法,将里面的内容提取出来。我目前已知的破解 zip 的方式只有 “Known plaintext attack(已知明文攻击)” 和 “暴力破解”。由于 “Known plaintext attack” 也有比较大的局限性
一、引入第三方库
1、zipfile
zipfile 模块是 python 中自带的模块,提供了对 zip 文件的创建读、写、追加、解压以及列出 zip 文件列表的工具。这里我们主要用到 ZipFile 对象的 extractall 方法来解压 zip 文件。
ZipFile模块说明:
ZipFile 对象:
extractall(path=None, members=None, pwd=None)
extractall(path=None, members=None, pwd=None) 方法主要有三个参数,我们来看一下每个参数的含义:
`path` 指定解压后文件的存储位置
`members`(可选)指定要 Zip 文件中要解压的文件,这个文件名称必须是通过 namelist() 方法返回列表的子集
`pwd` 指定 Zip 文件的解压密码
用 zipfile 模块解压一个带密码的 Zip 文件
现在我们创建 1.txt 文件:
touch 1.txt
现在我们创建 1.txt 文件:
zip -r 1.zip 1.txt -P 1314
解压文件脚本
import zipfile
try:
#创建 ZipFile 对象
with zipfile.ZipFile('1.zip') as zFile:
#解压文件
zFile.extractall(path='./', pwd=b'1314')
print('Extract the Zip file successfully!')
except:
print('Extract the Zip file failed!')
运行解压脚本
python3 demo.py
2、argparse
使用 argparse 模块来解析命令行参数。
argparse官方文档
argparse 提供了非常友好的命令行解析接口,在命令行参数比较多的时候更为明显。
使用案例:
import argparse
parser = argparse.ArgumentParser(description='Regards to your name.')
parser.add_argument('-n', dest='m_name', type=str, help='your name')
options = parser.parse_args()
print('Hello',options.m_name)
首先我们导入了 argparse
这个模块。
通过 argparse.ArgumentParser
方法来获得解析器对象。
description
是在我们输出命令行参数帮助信息时起到描述的作用。 add_argument
方法用来添加我们需要解析的参数,可以看到我们这里添加了 -n 参数,dest 相当于存储命令行参数值的变量,提取这个变量的时候我们要用到,比如上面 的 options.m_name。type 表示我们输入的类型,这里是 str。
help
是用来说明参数的,和 description 一样在我们输出命令行帮助信息时会显示出来。
二、暴力破解zip文件
将密码本里面的密码逐一尝试输入进行破解
暴力破解脚本pojie.py:
import zipfile
import argparse
import os
from os.path import *
def tryZipPwd(zipFile, password, savePath):
try:
zipFile.extractall(path=savePath, pwd=password.encode('utf-8'))
print('[+] Zip File decompression success,password: %s' % (password))
return True
except:
print('[-] Zip File decompression failed,password: %s' % (password))
return False
def main():
# 这里用描述创建了 ArgumentParser 对象
parser = argparse.ArgumentParser(description='Brute Crack Zip')
# 添加 - H 命令 dest 可以理解为咱们解析时获取 - H 参数后面值的变量名, help 是这个命令的帮助信息
parser.add_argument('-f', dest='zFile', type=str, help='The zip file path.')
parser.add_argument('-w', dest='pwdFile', type =str, help='Password dictionary file.')
zFilePath = None
pwdFilePath = None
try:
options = parser.parse_args()
zFilePath = options.zFile
pwdFilePath = options.pwdFile
except:
print(parser.parse_args(['-h']))
exit(0)
if zFilePath == None or pwdFilePath == None:
print(parser.parse_args(['-h']))
exit(0)
with zipfile.ZipFile(zFilePath) as zFile:
with open(pwdFilePath) as f:
for pwd in f.readlines():
p,f = split(zFilePath)
dirName = f.split('.')[0]
dirPath = join(p, dirName)
try:
os.mkdir(dirPath)
except:
pass
ok = tryZipPwd(zFile, pwd.strip('\n'), dirPath)
if ok:
break
if __name__ == '__main__':
main()
最后我们创建一个用于测试的密码字典 pwd.txt:
1256
4345
2323
1234
4556
......
运行脚本:
python3 pojie.py -f 1.zip -w pwd.txt
Zip 文件暴力破解 的方法,这种方法的成功率比较依赖密码字典文件。虽然这只是一种初级的方法不过确实有的时候是非常有效的,通常情况下我们在遇到加密的 Zip 文件我们首先会尝试这种方法。