Python编写的Masscan扫描器优化指南

2023-04-21 00:00:00 优化 编写 扫描器
  1. 使用多个线程扫描
    使用多个线程可以提高扫描速度,可以使用Python的multiprocessing库或者threading库实现多线程扫描。
    示例代码:
import threading
class PortScanner():
    def __init__(self):
        self.threads = []
    def start_threads(self, ip, ports):
        for port in ports:
            t = threading.Thread(target=self.scan, args=(ip, port))
            self.threads.append(t)
            t.start()
        for t in self.threads:
            t.join()
    def scan(self, ip, port):
        # 扫描ip的port端口
        pass
  1. 设置超时时间
    设置超时时间可以避免程序长时间等待,提高扫描速度。
    示例代码:
import socket
def scan(ip, port):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(2)
        s.connect((ip, port))
        s.send(b"GET / HTTP/1.1\r\nHost: pidancode.com\r\n\r\n")
        banner = s.recv(1024)
        print(ip, port, "open", banner)
    except:
        pass
    finally:
        s.close()
  1. 使用协程
    使用协程可以避免创建多个线程的开销,提高扫描速度。
    示例代码:
import gevent.socket
import gevent.monkey
gevent.monkey.patch_socket()
def scan(ip, port):
    s = gevent.socket.socket()
    s.settimeout(2)
    try:
        s.connect((ip, port))
        s.send(b"GET / HTTP/1.1\r\nHost: pidancode.com\r\n\r\n")
        banner = s.recv(1024)
        print(ip, port, "open", banner)
    except:
        pass
    finally:
        s.close()
  1. 批量扫描IP与端口
    批量扫描IP与端口可以提高扫描效率。
    示例代码:
def batch_scan(ips, ports):
    for ip in ips:
        for port in ports:
            scan(ip, port)
  1. 使用IP地址范围扫描
    使用IP地址范围可以快速扫描大量IP地址。
    示例代码:
import ipaddress
def scan_network(network):
    for ip in ipaddress.IPv4Network(network):
        scan(str(ip), 80)
  1. 使用异步IO
    使用异步IO可以避免程序在等待网络I/O时阻塞,提高扫描速度。
    示例代码:
import asyncio
async def scan(ip, port):
    conn = asyncio.open_connection(ip, port)
    try:
        reader, writer = await asyncio.wait_for(conn, timeout=2)
        writer.write(b"GET / HTTP/1.1\r\nHost: pidancode.com\r\n\r\n")
        banner = await asyncio.wait_for(reader.read(1024), timeout=2)
        print(ip, port, "open", banner)
    except:
        pass
    finally:
        writer.close()
        await writer.wait_closed()

相关文章