Перебор нескольких файлов с использованием Threading и Queue в Python - PullRequest
0 голосов
/ 19 мая 2019

У меня возникли некоторые трудности с масштабированием сценария путем добавления потоков. Я пишу фаззер для чего-то и решил реализовать queue, который работает с threading. Скрипт принимает файл с запросами на фазз, с точками вставки, разделенными %__v__%. А также файл полезных данных.

Например, при условии, что следующие два файла используются в качестве ввода:

requests_file

Test1: %__v__%
Test2: %__v__%
Test3: %__v__%
Test4: %__v__%
Test5: %__v__%

payloads_file

1
2
3
4
5

Скрипт должен выдавать запросы следующим образом, перебирая все возможности:

Test1: 1
Test1: 2
Test1: 3
Test1: 4
Test1: 5
Test2: 1
Test2: 2
Test2: 3
...
etc.

Я знаю, что это можно реализовать с помощью циклов for без очереди или потоков, но это медленнее, чем с использованием потоков. Я намереваюсь использовать это с некоторыми довольно большими файлами, и делать некоторую обработку в том, что получено.

Я попробовал тонну вещей и, очевидно, просто не понимаю, как работают потоки / очереди. До сих пор я получал вывод, близкий к следующему:

Test1: 1
Test1: 1
Test1: 1
Test1: 1
Test1: 1
Test1: 2
Test1: 2
Test1: 2
Test1: 2
Test1: 2
...

Затем он в конечном итоге достигает Test1: 5 и завершается быстрой посылкой Test2 - Test5, например:

Test2: 1
Test3: 1
Test4: 1
Test5: 1

Вот пример того, что я пробовал. Если у меня есть request_file и payload_file, я делаю что-то похожее на следующее:

import threading
import queue

threads = 5
def build_wordlist(input_file):
    <queue building logic>
    return queue

def send(payloads_queue, requests_file):
    while not payloads_queue.empty():
        p = payload_queue.get()
        with open(requests_file) as fin:
            for r in fin:
                <send logic>

payloads_queue = build_wordlist('payloads.txt')

for i in range(threads):
    t = threading.Thread(target=send, args=(payloads_queue,requests_file))
    t.start()

Я тоже попробовал противоположное вышесказанному - и получил схожий результат:

import threading
import queue

threads = 5

def build_wordlist(input_file):
    <queue building logic>
    return queue

def send(requests_queue, payloads_file):
    while not requests_queue.empty():
        r = requests_queue.get()
        with open(payloads_file) as fin:
            for r in fin:
                <send logic>

requests_queue = build_wordlist('requests.txt')

for i in range(threads):
    t = threading.Thread(target=send, args=(requests_queue, payloads_file))
    t.start()

Еще одна вещь, которую я попробовал, это вызвать потоки и передать в глобальный список и очередь. Используя ту же логику queue.get (), что и выше, я попытался использовать list.pop() в глобальном списке, чтобы получить значение для каждого потока. Что-то вроде:

global payloads
payloads = []

def build_wordlist(input_file):
    <queue building logic>
    return queue

with open(payload_File) as fin:
    for payload in fin:
        payloads += payload

def send(rq, p):
    while not request_queue.empty():
        request = request_queue.get()
        <send logic>

requests_queue = build_wordlist('requests.txt')

while len(payloads) != 0:
    payload = payloads.pop()

    for i in range(threads):
        t = threading.Thread(target=send, args=(request_queue, payload))
        t.start()

Я также пытался перебирать две очереди, загружая оба файла в очереди и перебирая их, чтобы получить похожие результаты, когда первая очередь очищается.

Это сводит меня с ума, так как этого легко добиться, используя итерации без потоков. Извините за длинный пост, это, вероятно, простой ответ, и я что-то упускаю, но сейчас это просто не имеет смысла.

В любом случае, дайте мне знать, если вам нужна дополнительная информация. Я не копировал и не вставлял свой текущий код, но он очень похож на примеры, которые я предоставляю.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...