防止多进程使用所有内存

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 一样多的线程。