gpt4 book ai didi

python - zip 密码破解器中的多线程

转载 作者:行者123 更新时间:2023-11-30 23:00:11 24 4
gpt4 key购买 nike

我正在学习如何使用字典攻击来破解 zip 文件。这是代码:

import zipfile
from threading import Thread

def extractFile(zFile, password):
try:
zFile.extractall(pwd=password)
print '[+] Found password ' + password + '\n'
except:
pass

def main():
zFile = zipfile.ZipFile('evil.zip')
passFile = open('dictionary.txt')
for line in passFile.readlines():
password = line.strip('\n')
extractFile(zFile, password)

if __name__ == '__main__':
main()

我在上面使用线程

import zipfile
from threading import Thread

def extractFile(zFile, password):
try:
zFile.extractall(pwd=password)
print '[+] Found password ' + password + '\n'
except:
pass

def main():
zFile = zipfile.ZipFile('evil.zip')
passFile = open('dictionary.txt')
for line in passFile.readlines():
password = line.strip('\n')
t = Thread(target=extractFile, args=(zFile, password))
t.start()

if __name__ == '__main__':
main()

但是,当我对两个程序进行计时时,完成第一个程序需要 90 秒,但完成第二个程序需要近 300 秒。该词典包含 459026 个条目。我很困惑为什么会发生这种情况。我还尝试将线程限制为 10,20 等。但循环在每个实例上的执行速度仍然更快。有人能解释一下为什么会这样吗?还有是否有机会改进该程序。

编辑我尝试按照 Ray 的建议进行切片,如下所示:

import zipfile
from threading import Thread

def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in xrange(0, len(l), n):
yield l[i:i+n]

def extractFile(zFile, passwords):
for password in passwords:
try:
zFile.extractall(pwd=password)
print '[+] Found password ' + password + '\n'
sys.exit(0)
except:
continue

def main():
zFile = zipfile.ZipFile('evil.zip')
with open('dictionary.txt', 'rb') as pass_file:
passwords = [i.strip() for i in pass_file]
passes = list(chunks(passwords, 10))
for pas in passes:
t = Thread(target=extractFile, args=(zFile, pas))
t.start()

if __name__ == '__main__':
main()

仍然需要 3-4 分钟

最佳答案

这对于多处理不能正常工作的一个原因;您必须在每个子进程中打开 zip 文件,否则您可能会因共享文件句柄而受到伤害。然后仅创建少量(例如 2 * 核心数)子进程,并让单个子进程测试多个密码。

因此我们得到:

import zipfile
from multiprocessing import Process


def extract_file(passwords):
with zipfile.ZipFile('evil.zip') as zipf:
for password in passwords:
try:
zipf.extractall(pwd=password)
print('[+] Found password {}\n'.format(password))
except Exception as e:
pass


def main():
with open('dictionary.txt', 'rb') as pass_file:
passwords = [i.strip() for i in pass_file]

N_PROC = 8
for i in range(N_PROC):
p = Process(target=extract_file, args=[passwords[i::N_PROC]])
p.start()


if __name__ == '__main__':
main()

关于python - zip 密码破解器中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35377580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com