«Модернизация» Python 2.7 ZIP Cracker для Python 3.7 - PullRequest
0 голосов
/ 29 января 2019

Я пытался «модернизировать» код 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?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 января 2019
  1. Каждый файл в zip-файле может иметь свой собственный пароль.
  2. Многопроцессорная обработка.
  3. Открыть файл в каждом работнике.
  4. Зачем нужны опции, когда у вас есть два обязательных аргумента?
...