Взломщик паролей Python

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

#!/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()

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

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

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

1 ответ

Решение

Я сделал для вас пример, который будет относительно легко добавить в ваш код. Вот как это работает; Во-первых, нам нужно затормозить wordlist в управляемые куски, которые мы можем бросить в многопроцессорный модуль. Я делаю это путем составления списка со словарем точек "начало" и "остановка". Затем я передаю эти аргументы в 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 убить процессоры.

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

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

Другие вопросы по тегам