Creating a Fast Port Scanner

So I'm doing a port scanner in python ...

import socket ip = "External IP" s = socket.socket(2, 1) #socket.AF_INET, socket.SOCK_STREAM def porttry(ip, port): try: s.connect((ip, port)) return True except: return None for port in range(0, 10000): value = porttry(ip, port) if value == None: print("Port not opened on %d" % port) else: print("Port opened on %d" % port) break raw_input() 

But this is too slow, I want to somehow be able to somehow close or break the code after some period of time when I do not return anything.

+6
source share
7 answers

In addition to setting the socket timeout, you can also use a multi-threaded technique to speed up the process. At best, it will be N times faster if you have N ports to scan.

 # This script runs on Python 3 import socket, threading def TCP_connect(ip, port_number, delay, output): TCPsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) TCPsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) TCPsock.settimeout(delay) try: TCPsock.connect((ip, port_number)) output[port_number] = 'Listening' except: output[port_number] = '' def scan_ports(host_ip, delay): threads = [] # To run TCP_connect concurrently output = {} # For printing purposes # Spawning threads to scan ports for i in range(10000): t = threading.Thread(target=TCP_connect, args=(host_ip, i, delay, output)) threads.append(t) # Starting threads for i in range(10000): threads[i].start() # Locking the main thread until all threads complete for i in range(10000): threads[i].join() # Printing listening ports from small to large for i in range(10000): if output[i] == 'Listening': print(str(i) + ': ' + output[i]) def main(): host_ip = input("Enter host IP: ") delay = int(input("How many seconds the socket is going to wait until timeout: ")) scan_ports(host_ip, delay) if __name__ == "__main__": main() 
+13
source

Consider setting a timeout instead of a for loop with socket.setdefaulttimeout(timeout) .

+2
source

It should be a little faster.

 #-*-coding:utf8;-*- #qpy:3 #qpy:console import socket import os # This is used to set a default timeout on socket # objects. DEFAULT_TIMEOUT = 0.5 # This is used for checking if a call to socket.connect_ex # was successful. SUCCESS = 0 def check_port(*host_port, timeout=DEFAULT_TIMEOUT): ''' Try to connect to a specified host on a specified port. If the connection takes longer then the TIMEOUT we set we assume the host is down. If the connection is a success we can safely assume the host is up and listing on port x. If the connection fails for any other reason we assume the host is down and the port is closed.''' # Create and configure the socket. sock = socket.socket() sock.settimeout(timeout) # the SO_REUSEADDR flag tells the kernel to reuse a local # socket in TIME_WAIT state, without waiting for its natural # timeout to expire. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Like connect(address), but return an error indicator instead # of raising an exception for errors returned by the C-level connect() # call (other problems, such as "host not found," can still raise exceptions). # The error indicator is 0 if the operation succeeded, otherwise the value of # the errnovariable. This is useful to support, for example, asynchronous connects. connected = sock.connect_ex(host_port) is SUCCESS # Mark the socket closed. # The underlying system resource (eg a file descriptor) # is also closed when all file objects from makefile() are closed. # Once that happens, all future operations on the socket object will fail. # The remote end will receive no more data (after queued data is flushed). sock.close() # return True if port is open or False if port is closed. return connected con = check_port('www.google.com', 83) print(con) 
+1
source

I think this snippet can help you: http://www.coderholic.com/python-port-scanner/

0
source

socket.setdefaulttimeout (0,5) This will speed up the execution of the program!

0
source

socket.setdefualttimeout (time)

used to continue trying to connect to the port for a period of time as a dash ... when you send a request and a timeout of 2 seconds is set, so it will try to connect to the port for 2 seconds .... if there is no response from this port in 2 seconds .... it will be considered a dead port

0
source

here is a quick and easy port scanner, it scans 100,000 ports in 180 seconds:

 import threading import socket target = 'pythonprogramming.net' #ip = socket.gethostbyname(target) def portscan(port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(0.5)# try: con = s.connect((target,port)) print('Port :',port,"is open.") con.close() except: pass r = 1 for x in range(1,100): t = threading.Thread(target=portscan,kwargs={'port':r}) r += 1 t.start() 
0
source

Source: https://habr.com/ru/post/976193/


All Articles