Skip to content

Instantly share code, notes, and snippets.

@nerun
Last active January 12, 2024 20:37
Show Gist options
  • Save nerun/86c2e1777b7840570c801a4b095617f5 to your computer and use it in GitHub Desktop.
Save nerun/86c2e1777b7840570c801a4b095617f5 to your computer and use it in GitHub Desktop.
Python Zip Cracker. Funciona com arquivos ZIP encriptados com ZipCrypto, não suporta AES128/256.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time, sys, itertools, os, string, datetime
from zipfile import ZipFile
def LimparTela(linhas=100):
if os.name == 'posix':
os.system('clear')
elif os.name in ('nt', 'dos', 'ce'):
os.system('cls')
else:
print ('\n' * linhas)
LimparTela()
def prcolor(color, text):
# color:
# 1 Red
# 2 Green
# 3 Yellow / Orange
# 4 Blue
# 5 Purple
# 6 Cyan (Light Blue)
# 7 Light Gray
# 8 Black
return '\033[9' + str(color) + 'm' + str(text) + '\033[00m'
def Saindo():
print (prcolor(3,"\n Saindo...\n"))
time.sleep(3)
sys.exit()
def VerArquivo(fname, tipo):
arq = fname
Existe = os.path.isfile(fname)
while not Existe is True:
erro = ("\n ERRO: arquivo %s inexistente!")% fname
print (prcolor(1,erro))
arq = input("\n Digite um arquivo %s existente: " % tipo)
Existe = os.path.isfile(arq)
return arq
print ("""==============================================================================
PYTHON ZIP CRACKER
por Daniel Dias Rodrigues (a.k.a. "Nerun")
v1.2, 2024-01-12
Só funciona com ZIP legado, isto é, encriptado com ZipCrypto. Os ZIPs mais
modernos, encriptados com AES128/256 por programas como 7-Zip e WinZip, não
são suportados.
A força bruta testa todas as senhas de 0 até 80 caracteres, que é o
comprimento máximo das senhas no ZipCrypto.
OBS.: O arquivo ZIP deve estar no mesmo diretório do Python Zip Cracker.
==============================================================================""")
inp = input("\n Nome do arquivo zip: ")
inp = VerArquivo(inp, "ZIP")
dirl = input("\n Nome do diretório para o qual será extraído: ")
print ("""\n Escolha a forma de ataque:
[ 1 ] Força Bruta: testa todas as possibilidades, pode demorar
[ 2 ] Dicionário: você vai precisar de um arquivo TXT de dicionário
[ ENTER ] Sair do programa""")
metodo = input("\n Entre sua opção: ")
Cracked = False
def crack(password, TimeStart):
with ZipFile(inp) as zf:
try:
zf.extractall(path=dirl, pwd=bytes(password, 'utf-8'))
Tf = round(time.perf_counter() - TimeStart)
print ('\n Senha descoberta. Tempo transcorrido: %s' % str(datetime.timedelta(seconds=Tf)) )
print (' A senha é: ' + prcolor(3,password))
print (" O arquivo descompactado está em %r" % dirl)
done = True
except:
print (' Testando senhas, seja paciente: ' + prcolor(5,password))
done = False
return done
if metodo == "1":
Ti = time.perf_counter()
choices = string.printable
for length in range(0,80):
if Cracked == False:
for entry in itertools.product(choices,repeat = length):
if Cracked == False:
password = ''.join(entry)
l = len(password)
Cracked = crack(password, Ti)
else:
Saindo()
else:
Saindo()
elif metodo == "2":
print ("\n OBS.: O arquivo TXT de dicionário deve estar na mesma pasta do Python Zip\n Cracker. Faça isso agora.")
tx = raw_input('\n Nome do arquivo de dicionário: ')
tx = VerArquivo(tx, "de dicionário")
array = []
with open(tx, "r") as f:
for line in f:
array.append(line)
t = len(array)
m = t-1
Ti = time.perf_counter()
print ("")
for x1 in range(m,-1,-1):
if Cracked == False:
password = array[x1]
f3 = len(password)
password = password[:f3-1]
Cracked = crack(password, Ti)
else:
Saindo()
else:
Saindo()
@AllanRPereira
Copy link

Bem Legal!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment