防止多进程使用所有内存
Prevent Multiprocess from using all memory
我正在为密码破解程序制作多进程,最后一次 运行 我的电脑真的死机了。有什么办法可以防止这种情况发生吗?我使用的内存量达到 100%,我的电脑死机了。我需要 运行 多个进程以允许不同的程序一次测试部分猜测。如果我有更多的内存,这会起作用,但是如果有人有任何解决方案,请说出来。
import hashlib
import itertools
import time
flag2=0
def getpass(comb, usechar, pass_hash):
global flag2
st = time.time()
for guess in comb:
guess = ''.join(guess)
digest = hashlib.md5(guess.encode('utf-8').strip()).hexdigest()
if digest == pass_hash:
print("password is: " + guess)
flag2=1
print("Time Completed(seconds): " + str(time.time() - st))
break;
if flag2==1:
break;
if __name__ == '__main__':
from multiprocessing import Process
flag = 0
lower = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
upper = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
nums = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
char = ["~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "-", "+", "=", "[", "]", "{", "}", ":", ";", "\'", "\"", "\", "|", ",", ".", "<", ">", "?", "/"]
pass_hash = input("Enter md5 hash: ")
#a=all, l=letters, n=numbers
pass_type = input(str("Enter Password Type: "))
usechar = []
processes = []
if pass_type == "a":
usechar = nums + lower + upper + char
elif pass_type == "l":
usechar = lower + upper
elif pass_type == "n":
usechar = nums
else:
usechar = nums + lower + upper + char
try:
pass_file = open("Passwords.txt", "r")
print("Accessing Passwords")
except:
print("No file found")
quit()
st = time.time()
for word in pass_file:
enc_word = word.encode('utf-8')
digest = hashlib.md5(enc_word.strip()).hexdigest()
if digest == pass_hash:
print("Password found")
print("Password is " + word)
print("Time Completed(seconds): " + str(time.time() - st))
flag = 1
break
if flag == 0:
print("Password is not in the list. Using brute-force")
for password_length in range(1, 20):
processes = []
comb = itertools.product(usechar, repeat=password_length)
thr = 0
leng = 0
for i in range(1,20):
leng += len(usechar)^i
for i in range(0,2):
processes.append(Process(target=getpass, args=[list(comb)[thr:round(leng/2)+thr], usechar, pass_hash]))
thr+=round(leng/2)
for process in processes:
process.start()
for process in processes:
process.join()
if flag2==0:
print("password is over 20 characters long")
一方面,变量 comb
是一个非常长的列表,您正在将这个非常长的片段传递给您的每个子进程。这可能是您所有记忆的去处。
使用一定规模的线程池,并根据文本的前两个字母创建多个作品可能会更聪明。然后每个工作人员将使用前两个字母生成所有密码(作为生成器,而不是作为一个完整的列表)并查看他们找到了什么。你会发现你根本不需要太多内存。
这里是一个简短的大纲,只在第一个字符上分解。
def worker(start_character):
for length in range(1, max_length):
for password_suffix in itertools.product(usechar, length - 1)
password = start_character + password_suffix
......
with multiprocessing.Pool() as pool:
pool.map(cracker, usechar)
每个线程几乎不使用内存。您可以使用与您的机器的 CPU 一样多的线程。
我正在为密码破解程序制作多进程,最后一次 运行 我的电脑真的死机了。有什么办法可以防止这种情况发生吗?我使用的内存量达到 100%,我的电脑死机了。我需要 运行 多个进程以允许不同的程序一次测试部分猜测。如果我有更多的内存,这会起作用,但是如果有人有任何解决方案,请说出来。
import hashlib
import itertools
import time
flag2=0
def getpass(comb, usechar, pass_hash):
global flag2
st = time.time()
for guess in comb:
guess = ''.join(guess)
digest = hashlib.md5(guess.encode('utf-8').strip()).hexdigest()
if digest == pass_hash:
print("password is: " + guess)
flag2=1
print("Time Completed(seconds): " + str(time.time() - st))
break;
if flag2==1:
break;
if __name__ == '__main__':
from multiprocessing import Process
flag = 0
lower = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
upper = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
nums = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
char = ["~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "-", "+", "=", "[", "]", "{", "}", ":", ";", "\'", "\"", "\", "|", ",", ".", "<", ">", "?", "/"]
pass_hash = input("Enter md5 hash: ")
#a=all, l=letters, n=numbers
pass_type = input(str("Enter Password Type: "))
usechar = []
processes = []
if pass_type == "a":
usechar = nums + lower + upper + char
elif pass_type == "l":
usechar = lower + upper
elif pass_type == "n":
usechar = nums
else:
usechar = nums + lower + upper + char
try:
pass_file = open("Passwords.txt", "r")
print("Accessing Passwords")
except:
print("No file found")
quit()
st = time.time()
for word in pass_file:
enc_word = word.encode('utf-8')
digest = hashlib.md5(enc_word.strip()).hexdigest()
if digest == pass_hash:
print("Password found")
print("Password is " + word)
print("Time Completed(seconds): " + str(time.time() - st))
flag = 1
break
if flag == 0:
print("Password is not in the list. Using brute-force")
for password_length in range(1, 20):
processes = []
comb = itertools.product(usechar, repeat=password_length)
thr = 0
leng = 0
for i in range(1,20):
leng += len(usechar)^i
for i in range(0,2):
processes.append(Process(target=getpass, args=[list(comb)[thr:round(leng/2)+thr], usechar, pass_hash]))
thr+=round(leng/2)
for process in processes:
process.start()
for process in processes:
process.join()
if flag2==0:
print("password is over 20 characters long")
一方面,变量 comb
是一个非常长的列表,您正在将这个非常长的片段传递给您的每个子进程。这可能是您所有记忆的去处。
使用一定规模的线程池,并根据文本的前两个字母创建多个作品可能会更聪明。然后每个工作人员将使用前两个字母生成所有密码(作为生成器,而不是作为一个完整的列表)并查看他们找到了什么。你会发现你根本不需要太多内存。
这里是一个简短的大纲,只在第一个字符上分解。
def worker(start_character):
for length in range(1, max_length):
for password_suffix in itertools.product(usechar, length - 1)
password = start_character + password_suffix
......
with multiprocessing.Pool() as pool:
pool.map(cracker, usechar)
每个线程几乎不使用内存。您可以使用与您的机器的 CPU 一样多的线程。