Python 多处理密码破解器
Python Multiprocessing password cracker
我一直在利用业余时间学习 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()
这很好用,但让我想要更多,所以我想我可以给它添加一些多处理能力来加快速度——使用各种不同的说明和指南,我未能获得成功的结果! (虽然感觉很亲近)
请有人指点我 "An idiots guide to multicore python password cracking" 或帮助我修改我的代码以适应。
P.S。我最初的计划是使用 opencl 或 cuda...但我很快就知道我是多么的不知所措!
我已经为您制作了一个示例,添加到您的代码中应该相对容易。下面是它的工作原理;首先,我们需要将 wordlist
分解为可管理的块,我们可以将其放入多处理器模块中。我通过制作一个包含 'starting' 和 'stopping' 点的字典的列表来做到这一点。接下来,我将这些参数传递给 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了解更多。
我希望这对您有所帮助,或者至少能让您更好地了解多处理!
我一直在利用业余时间学习 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()
这很好用,但让我想要更多,所以我想我可以给它添加一些多处理能力来加快速度——使用各种不同的说明和指南,我未能获得成功的结果! (虽然感觉很亲近)
请有人指点我 "An idiots guide to multicore python password cracking" 或帮助我修改我的代码以适应。
P.S。我最初的计划是使用 opencl 或 cuda...但我很快就知道我是多么的不知所措!
我已经为您制作了一个示例,添加到您的代码中应该相对容易。下面是它的工作原理;首先,我们需要将 wordlist
分解为可管理的块,我们可以将其放入多处理器模块中。我通过制作一个包含 'starting' 和 'stopping' 点的字典的列表来做到这一点。接下来,我将这些参数传递给 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了解更多。
我希望这对您有所帮助,或者至少能让您更好地了解多处理!