一个欲儿的博客

一个欲儿的博客

Py暴力破解压缩文件密码
2022-05-28

循序渐进,先来zip文件


首先

import zipfile
import os


zipstream = zipfile.ZipFile("no.zip" ,"r")#申明zip,这个类似于文件句柄吧,主要是申明一个文件流,学过C可能好理解一点

for ename in zipstream.namelist():#输出zip里面的每一个文件名称
    print(ename)



然后逐个解压文件

import zipfile
import os


zipstream = zipfile.ZipFile(r"C:\Users\YuEr\Desktop\no.zip" ,"r")

for ename in zipstream.namelist():
    print(ename)
    zipstream.extract(ename , "Test" )#解压该zip里面每个文件到当前工作目录下 Test 文件夹内,如果没有会自己创建,如果有则直接解压到里面去

zipstream.close()


那么问题来了,压缩包有密码咋办

import zipfile
import os


zipstream = zipfile.ZipFile(r"C:\Users\YuEr\Desktop\no.zip" ,"r")

for ename in zipstream.namelist():
    print(ename)
    zipstream.extract(ename , "Test" ,b"pw" )#第一个参数为数组中的每个元素,第二个参数为保存文件目录(该代码为当前工作目录的Test文件夹),第三个参数为密码,该密码为 "pw" ,前面的b是转义符,转义为byte
zipstream.close()



解压文件还有一种不需要用到循环的

import zipfile
import os


zipstream = zipfile.ZipFile(r"C:\Users\YuEr\Desktop\no.zip" ,"r")

zipstream.extractall(path=r'C:\Users\YuEr\Desktop\Test', members=zipstream.namelist(), pwd= b'pw')#第一个参数为存储的文件夹,第二个参数为需要解压的文件(改代码就是说上面的全部都解压),第三个参数为密码,该密码为 "pw" ,前面的b是转义符,转义为byte
zipstream.close()


由于出现了格式的转换,所以这里提供了,Python中byte 和 string 类型的互换,应该看得懂吧。看不懂联系我就是了。

bytepw = next(passwd).encode('gbk')
stringpw  = bytepw.decode('gbk')



循序渐进,如果知道zip压缩包密码的长度爆破则更加快捷。

import zipfile
import os
import itertools


num = input("Please enter the password length:")
cc = int(num)
passwd = ("".join(x) for x in itertools.product("abcd", repeat=cc))
while( 1 > 0):
    try:
        zipstream = zipfile.ZipFile(r"C:\Users\YuEr\Desktop\no.zip" ,"r")
        bytepw = next(passwd).encode('gbk')
        zipstream.extractall(path=r'C:\Users\YuEr\Desktop\Test', members=zipstream.namelist(), pwd= bytepw)
        zipstream.close()
        print("PW IS " + bytepw.decode('gbk'))
    except:
        pass

简单说一下,这段代码为什么会产生,为什么不一次就写完所有长度的密码,其实我是考虑到了破解速度,如果你一次计算所有位数的,其实11位的密码计算机就已经要算很久了,如果我一个计算机只运算一个特定长度的密码,那么多台电脑可以同时爆破,我想对于你的效率会有提高,所以才会出现这种代码,当然了,你也可以一台电脑开多个窗口,每个窗口运算一个长度的密码,大大提高效率!





发表评论: