Сканер портов с резьбой Python - PullRequest
3 голосов
/ 09 января 2011

У меня проблемы со сканером портов, который я редактирую, чтобы использовать потоки.Это основы для исходного кода:

for i in range(0, 2000):  

    s = socket(AF_INET, SOCK_STREAM)  
    result = s.connect_ex((TargetIP, i))  

    if(result == 0) :  
        c = "Port %d: OPEN\n" % (i,)  

    s.close()

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

import threading
from socket import *
import time

a = 0
b = 0
c = ""
d = ""

def ScanLow():
    global a
    global c

    for i in range(0, 1000):  
        s = socket(AF_INET, SOCK_STREAM)  
        result = s.connect_ex((TargetIP, i))  

        if(result == 0) :  
            c = "Port %d: OPEN\n" % (i,)  

        s.close()  
        a += 1

def ScanHigh():
    global b
    global d

    for i in range(1001, 2000):  
        s = socket(AF_INET, SOCK_STREAM)  
        result = s.connect_ex((TargetIP, i))  

        if(result == 0) :  
            d = "Port %d: OPEN\n" % (i,)  

        s.close()  
        b += 1

Target = raw_input("Enter Host To Scan:")
TargetIP = gethostbyname(Target)

print "Start Scan On Host ", TargetIP
Start = time.time()

threading.Thread(target = ScanLow).start()
threading.Thread(target = ScanHigh).start()

e = a + b

while e < 2000:
    f = raw_input()

End = time.time() - Start
print c
print d
print End

g = raw_input()

Ответы [ 2 ]

5 голосов
/ 09 января 2011

Здесь ваш код не работает.

threading.Thread(target = ScanLow).start()
threading.Thread(target = ScanHigh).start()

e = a + b

while e < 2000:
   f = raw_input()

Сразу после запуска темы вы установите значение e. Однако после этого вы никогда не обновите e, поэтому цикл никогда не завершится.

Также кажется, что вы делаете это, чтобы дождаться окончания обоих потоков. Метод join() - лучший способ сделать это.

from threading import Thread
threads = []
threads.append(Thread(target = ScanLow))
threads.append(Thread(target = ScanHigh))
for thread in threads:
  thread.start()
//both threads are running
for thread in threads:
  thread.join()
//both threads have stopped

Изменить: Не связанный с вашим вопросом, но полезный комментарий. Обе ваши функции сканирования делают одно и то же. Вы можете заменить их одной функцией, которая принимает диапазон сканирования в качестве аргументов, и запустить оба потока одной функцией.

from threading import Thread
def Scan(start, stop):
    global a
    global c

    for i in range(start, stop):  
        s = socket(AF_INET, SOCK_STREAM)  
        result = s.connect_ex((TargetIP, i))  

        if(result == 0) :  
            c = "Port %d: OPEN\n" % (i,)  

        s.close()  
        a += 1

threadCount = 2
totalPorts = 2000
threads = []
for start in xrange(0, totalPorts, totalPorts/threadCount):
    threads.append(Thread(target = Scan, args = (start, totalPorts/threadCount)))

for thread in threads:
  thread.start()
//both threads are running
for thread in threads:
  thread.join()
//both threads have stopped

И теперь вы можете легко настроить количество потоков и портов для сканирования.

1 голос
/ 09 января 2011

У вас есть неудобный метод для мониторинга потоков. Использование join укажет, когда поток завершится. Нет причин не раскручивать больше потоков, чтобы получить результаты быстрее:

import threading
import socket
import time

ports = []
def check_port(ip,port):
    s = socket.socket()
    if s.connect_ex((ip,port)) == 0:
        ports.append(port)
    s.close()

target = raw_input('Target? ')
s = time.time()
threads = []
for port in range(2000):
    t = threading.Thread(target=check_port,args=(target,port))
    t.start()
    threads.append(t)
for t in threads:
    t.join()
print ports
print time.time() - s

Выход

[80, 135, 445, 1028]
6.92199993134
...