【发布时间】: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替换为optparse。argparse仍然存在,并且由于 API 非常相似但不完全相同,您可能会引入微妙的、难以发现的错误。更改线程机制可能需要重写难以理解的代码。 -
@BoarGules 从我在论坛上看到的
optparse已停产且不支持 3.7 和argparse是optparse的延续 -
也许,但这不是您的直接问题。一旦解决了编码等关键问题,就该担心替换仍然有效的已弃用库了。不管论坛怎么说,
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