|
|
|
@ -0,0 +1,199 @@
|
|
|
|
|
import hashlib,binascii
|
|
|
|
|
import tkinter as tk
|
|
|
|
|
import tkinter.messagebox
|
|
|
|
|
import tkinter.ttk
|
|
|
|
|
import sys
|
|
|
|
|
import keyboard
|
|
|
|
|
import time
|
|
|
|
|
from multiprocessing import Pool
|
|
|
|
|
g = ['!','@','#','$','%','^','&','*','0','1','2','3','4','5','6','7','8','9','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','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']
|
|
|
|
|
Z=10**8
|
|
|
|
|
l1=20
|
|
|
|
|
checkPointHeavy=[0.0416,0.0855,0.1316,0.2318,0.2870,0.4117,0.5684,0.7381]
|
|
|
|
|
checkpoint=[]
|
|
|
|
|
for i in checkPointHeavy:
|
|
|
|
|
if int(i*l1) not in checkpoint:
|
|
|
|
|
checkpoint.append(int(i*l1))
|
|
|
|
|
rainbowTableSum=20
|
|
|
|
|
rainbowTable= {}
|
|
|
|
|
rainbowTables=[]
|
|
|
|
|
coefficient=[]
|
|
|
|
|
coefficientCheckPoint=''
|
|
|
|
|
|
|
|
|
|
win=tk.Tk()
|
|
|
|
|
win.title('彩虹表破解程序')
|
|
|
|
|
win.geometry('400x400')
|
|
|
|
|
entry=tk.Entry(win,width=50)
|
|
|
|
|
entry.place(x=20,y=100)
|
|
|
|
|
cobox=tkinter.ttk.Combobox(win)
|
|
|
|
|
cobox.place()
|
|
|
|
|
cobox['value']=('NTLM','sha256')
|
|
|
|
|
cobox.place(x=20,y=20)
|
|
|
|
|
def NTLMOrSha256(str,mode):
|
|
|
|
|
if mode==0:
|
|
|
|
|
return binascii.hexlify(hashlib.new('md4', str.encode('utf-16le')).digest())
|
|
|
|
|
elif mode==1:
|
|
|
|
|
return binascii.hexlify(hashlib.new('sha256',str.encode('utf-8')).digest())
|
|
|
|
|
def R(x,i,r,l2):
|
|
|
|
|
x=int(x.decode(),16)
|
|
|
|
|
x+=i
|
|
|
|
|
x=str(hex(x))[2:]
|
|
|
|
|
str1=''
|
|
|
|
|
for j in range(l2):
|
|
|
|
|
x1=(int(x[j%len(x)],16)+int(x[(j+l2)%len(x)],16)+Z//(i+1)+r)%len(g)
|
|
|
|
|
str1+=g[x1]
|
|
|
|
|
return str1
|
|
|
|
|
def select(lenth):
|
|
|
|
|
f=open('rockyou1.txt','r')
|
|
|
|
|
list1=list(f.read().split('\n'))
|
|
|
|
|
f.close()
|
|
|
|
|
coefficient=[]
|
|
|
|
|
for i in list1:
|
|
|
|
|
if len(i)==lenth:
|
|
|
|
|
coefficient.append(i)
|
|
|
|
|
return coefficient
|
|
|
|
|
def createRainbowTableProcess(*cRTP):
|
|
|
|
|
dic=cRTP[0][0]
|
|
|
|
|
st=cRTP[0][1]
|
|
|
|
|
r=cRTP[0][2]
|
|
|
|
|
rs=cRTP[0][3]
|
|
|
|
|
mode=cRTP[0][4]
|
|
|
|
|
for t in st:
|
|
|
|
|
dic[t] = ''
|
|
|
|
|
x = t
|
|
|
|
|
j = 0
|
|
|
|
|
coefficientCheckPoint = ''
|
|
|
|
|
for i in range(l1):
|
|
|
|
|
x = NTLMOrSha256(x,mode)
|
|
|
|
|
if i == int(checkpoint[j]):
|
|
|
|
|
coefficientCheckPoint += str(int(x.decode(), 16) & 1)
|
|
|
|
|
j = (j + 1) % len(checkpoint)
|
|
|
|
|
x = R(x, i + 1, r, rs)
|
|
|
|
|
c = int(coefficientCheckPoint, 2)
|
|
|
|
|
if c <= 15:
|
|
|
|
|
x = x[:-2] + '0' + hex(c)[2:]
|
|
|
|
|
else:
|
|
|
|
|
x = x[:-2] + hex(int(coefficientCheckPoint, 2))[2:]
|
|
|
|
|
dic[t] = x
|
|
|
|
|
dic_key=list(dic.keys())
|
|
|
|
|
dic_value=list(dic.values())
|
|
|
|
|
return dic_key,dic_value
|
|
|
|
|
def createRainbowTable():
|
|
|
|
|
if cobox.get()!='NTLM':
|
|
|
|
|
mode=1
|
|
|
|
|
else:
|
|
|
|
|
mode=0
|
|
|
|
|
pool = Pool()
|
|
|
|
|
global coefficientCheckPoint
|
|
|
|
|
rs=5
|
|
|
|
|
#表头输入
|
|
|
|
|
st=select(rs)
|
|
|
|
|
while st!=[]:
|
|
|
|
|
rainbowTable={}
|
|
|
|
|
for r in range(rainbowTableSum):
|
|
|
|
|
dic = {}
|
|
|
|
|
if r!=0:
|
|
|
|
|
st=list(rainbowTable[r-1].values())
|
|
|
|
|
args=([dic,st,r,rs,mode],)
|
|
|
|
|
returnDic=pool.map(createRainbowTableProcess,args)
|
|
|
|
|
returnDic=dict(zip(returnDic[0][0],returnDic[0][1]))
|
|
|
|
|
rainbowTable[r]=returnDic
|
|
|
|
|
rainbowTables.append(rainbowTable)
|
|
|
|
|
rs+=1
|
|
|
|
|
st = select(rs)
|
|
|
|
|
pool.close()
|
|
|
|
|
pool.join()
|
|
|
|
|
returnDict[0]=rainbowTables
|
|
|
|
|
returnDict[1]=mode
|
|
|
|
|
def useRainbowTableProcess(*uRTP):
|
|
|
|
|
key=uRTP[0][0]
|
|
|
|
|
value=uRTP[0][1]
|
|
|
|
|
inputValue=uRTP[0][2]
|
|
|
|
|
mode=uRTP[0][3]
|
|
|
|
|
returntutle=[]
|
|
|
|
|
for k_value, v_value in value.items():
|
|
|
|
|
for i in range(l1, 0, -1):
|
|
|
|
|
coefficientCheckPoint = ''
|
|
|
|
|
|
|
|
|
|
for execR in range(l1 + 1 - i):
|
|
|
|
|
if execR == 0:
|
|
|
|
|
inputValue1 = R(inputValue, i + execR, key, len(k_value))
|
|
|
|
|
if i + execR - 1 in checkpoint:
|
|
|
|
|
coefficientCheckPoint += str(int(inputValue.decode(), 16) & 1)
|
|
|
|
|
else:
|
|
|
|
|
inputValue1 = NTLMOrSha256(inputValue1,mode)
|
|
|
|
|
if i + execR - 1 in checkpoint:
|
|
|
|
|
coefficientCheckPoint += str(int(inputValue1.decode(), 16) & 1)
|
|
|
|
|
inputValue1 = R(inputValue1, i + execR, key, len(k_value))
|
|
|
|
|
if i==1 and len(k_value)==6:
|
|
|
|
|
pass
|
|
|
|
|
if inputValue1[:-2] == v_value[:-2]:
|
|
|
|
|
if len(coefficientCheckPoint) and int(bin(int(v_value[-2:], 16))[2:].zfill(8)[0-len(coefficientCheckPoint):],2) != int(coefficientCheckPoint, 2):
|
|
|
|
|
continue
|
|
|
|
|
returntutle.append((k_value, i - 1, key))
|
|
|
|
|
return returntutle
|
|
|
|
|
|
|
|
|
|
def useRainbowTable(rainbowTables,mode):
|
|
|
|
|
inputValue = entry.get().rstrip()
|
|
|
|
|
inputValue = inputValue.encode()
|
|
|
|
|
returnValues=[]
|
|
|
|
|
returnValue=[]
|
|
|
|
|
pool=Pool()
|
|
|
|
|
global coefficientCheckPoint
|
|
|
|
|
for table in rainbowTables:
|
|
|
|
|
for key,value in table.items():
|
|
|
|
|
args = ([key, value, inputValue,mode],)
|
|
|
|
|
returnValues.append(pool.map(useRainbowTableProcess,args))
|
|
|
|
|
for i in returnValues:
|
|
|
|
|
if i[0]!=[]:
|
|
|
|
|
for j in i:
|
|
|
|
|
returnValue.append(j)
|
|
|
|
|
pool.close()
|
|
|
|
|
pool.join()
|
|
|
|
|
if returnValue != []:
|
|
|
|
|
t = 1
|
|
|
|
|
for i in returnValue:
|
|
|
|
|
rainbowtop,location,judgetable = i[0][0], i[0][1], i[0][2]
|
|
|
|
|
length = len(rainbowtop)
|
|
|
|
|
for i in range(location):
|
|
|
|
|
rainbowtop = NTLMOrSha256(rainbowtop, mode)
|
|
|
|
|
rainbowtop = R(rainbowtop, i + 1, judgetable, length)
|
|
|
|
|
decyptstr=rainbowtop
|
|
|
|
|
decyptstr_NTLM=str(NTLMOrSha256(rainbowtop, mode))[2:-1]
|
|
|
|
|
if decyptstr_NTLM == inputValue:
|
|
|
|
|
tkinter.messagebox.showinfo(title='提示信息', message=decyptstr)
|
|
|
|
|
t = 0
|
|
|
|
|
if t:
|
|
|
|
|
print("破解失败!这可能是由于输入的hash值不一致导致的")
|
|
|
|
|
else:
|
|
|
|
|
print("破解失败!")
|
|
|
|
|
returnDict = {}
|
|
|
|
|
def main():
|
|
|
|
|
|
|
|
|
|
btn1 = tk.Button(win, text='创建彩虹表', command=lambda: createRainbowTable())
|
|
|
|
|
btn1.place(x=260, y=98)
|
|
|
|
|
# rainbowTableFile=open('rainbowtable.txt','w')
|
|
|
|
|
# count=0
|
|
|
|
|
# for i in returnDict[0]:
|
|
|
|
|
# for j in i:
|
|
|
|
|
# for k in i[j]:
|
|
|
|
|
# rainbowTableFile.write(str(k)+':'+str(i[j][k])+'\t')
|
|
|
|
|
# count = (count+1)%5
|
|
|
|
|
# if count==4:
|
|
|
|
|
# rainbowTableFile.write('\n')
|
|
|
|
|
|
|
|
|
|
btn=tk.Button(win,text='破解',command=lambda :useRainbowTable(returnDict[0],returnDict[1]))
|
|
|
|
|
btn.place(x=360,y=98)
|
|
|
|
|
win.mainloop()
|
|
|
|
|
if __name__=='__main__':
|
|
|
|
|
main()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|