Я пытался «модернизировать» код ZIP Cracker из «Violent Python» TJ O'Connor, который был написан на Python 2.7 (я полагаю)
Исходный код следующий:
import zipfile
import optparse
from threading import Thread
def extractFile(zFile, password):
try:
zFile.extractall(pwd=password)
print
'[+] Found password ' + password + '\n'
except:
pass
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')
t = Thread(target=extractFile, args=(zFile, password))
t.start()
if __name__ == '__main__':
main()
Моя попытка модернизации заключалась в использовании argparse
вместо optparse
.Мне удалось воссоздать аргументы, но я не смог заставить код работать правильно.Я имею в виду, что я принимаю входные данные, такие как Project.py -z "Generic ZIP Name.zip" -d "Dictionary.txt"
Мой «модернизированный» код выглядит следующим образом:
import zipfile
import argparse
from threading import Thread
parser = argparse.ArgumentParser(description="Unzips selected .zip using a dictionary attack")
# Creates -z arg
parser.add_argument("-z", "--zip", metavar="", required=True, help="Location and the name of the .zip file.")
# Creates -d arg
parser.add_argument("-d", "--dictionary", metavar="", required=True, help="Location and the name of the dictionary.")
args = parser.parse_args()
def extract_zip(zipFile, password):
try:
zipFile.extractall(pwd=password.encode())
print(f"[+] Password for the .zip: {password} \n")
except Exception:
pass
def main(zip, dictionary):
if (zip == None) | (dictionary == None):
print(parser.usage)
exit(0)
zip_file = zipfile.ZipFile(zip)
pass_file = open(dictionary)
for line in pass_file.readlines():
password = line.strip('\n')
t = Thread(target=extract_zip, args=(zip_file, password))
t.start()
if __name__ == '__main__':
# USAGE - Project.py -z zipname.zip -d dictionary.txt
main(args.zip, args.dictionary)
Я получаю следующую ошибку:
(venv) C:\Users\USER\Documents\Jetbrains\PyCharm\Project>Project.py -z "Generic ZIP Name.zip" -d "Most Common 10k Passwords.txt"
Traceback (most recent call last):
File "C:\Users\USER\Documents\Jetbrains\PyCharm\Project\Project.py", line 37, in <module>
main(args.zip, args.dictionary)
File "C:\Users\USER\Documents\Jetbrains\PyCharm\Project\Project.py", line 29, in main
for line in pass_file.readlines():
File "C:\Users\USER\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 193: character maps to <undefined>
Не уверен, как я могу это исправить, так как не знаю, как «модернизировать» этот кусок кода.Я пытался, но не получил должных результатов, и хотел бы получить некоторую помощь, если это возможно.
У меня также есть побочный вопрос.В поисках ответов я наткнулся на несколько похожих постов, где в ответах говорилось, что вместо использования Thread
/ threading
следует использовать multithread
из-за GIL
(не совсем уверен, что это такое).Это все еще держится?Должен ли я заменить threading
на multithreading
?
Заранее спасибо.