【问题标题】:'Modernizing' a Python 2.7 ZIP Cracker to Python 3.7将 Python 2.7 ZIP 破解器“现代化”为 Python 3.7
【发布时间】:2019-06-22 07:43:09
【问题描述】:

我一直在尝试将 TJ O'Connor 用 Python 2.7 编写的“Violent Python”中的 ZIP Cracker 代码“现代化”(我想)

原代码如下:

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。我确实设法重新创建了 args,但无法让代码正常工作。我的意思是接受像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>

不知道如何解决这个问题,因为我不知道如何“现代化”那段代码。我一直在尝试,但没有得到适当的结果,如果可能的话希望得到一些帮助。

我还有一个附带问题。在寻找答案时,我偶然发现了一些类似的帖子,其中回复指出,由于GIL 而不是使用Thread/threading 应该使用multithread(不太确定那是什么)。这还成立吗?我应该将threading 替换为multithreading 吗?

提前致谢。

【问题讨论】:

  • 您当前的问题是 Python 2 中不存在的 Python 3 字节/字符串区别。我认为您应该首先解决这个问题。您无需将argparse 替换为optparseargparse 仍然存在,并且由于 API 非常相似但不完全相同,您可能会引入微妙的、难以发现的错误。更改线程机制可能需要重写难以理解的代码。
  • @BoarGules 从我在论坛上看到的optparse 已停产且不支持 3.7 和argparseoptparse 的延续
  • 也许,但这不是您的直接问题。一旦解决了编码等关键问题,就该担心替换仍然有效的已弃用库了。不管论坛怎么说,optparse 仍然是 3.7 标准库的一部分。在开始美化之前让代码正常工作。
  • @BoarGules 我会说代码已经“漂亮”了。问题是 optparse 仅适用于 2.7,不适用于 3.7。随着 2.7 的停产,我试图让代码在 3.7 上运行,这就是问题所在;因为我必须使用argparse,但我无法让它工作。
  • 但是optparse 确实适用于 3.7。如果您不相信我,请阅读此内容:docs.python.org/3.7/library/optparse.html

标签: python python-3.x python-2.7 argparse optparse


【解决方案1】:
  1. zip 中的每个文件都可以有自己的密码。
  2. 多处理。
  3. 在每个工作人员中打开文件。
  4. 当您有两个强制参数时,为什么还要有选项?

【讨论】:

  • 这是一个使用暴力破解的 ZIP 破解器。 -z 以 .zip 结尾指定 zip 的位置(即 -z zipname.zip,如果它与 .py 位于相同的位置)。 -d 的概念与字典/密码 .txt 文件相同。至于多处理,我怎么能这样做,因为我相信你是说多处理比线程更好地进行暴力攻击。
  • 是的,它受 CPU 限制。多处理为您提供了通过管道和共享内存将它们自己的堆连接在一起的进程。
  • 那么多处理使用 GPU 代替还是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2015-02-07
  • 2018-06-15
  • 1970-01-01
相关资源
最近更新 更多