m1n9yu3-博客园

端口扫描器编写 python

今天来编写一个 端口扫描器, 扫描某个主机 ,开放的端口

原理

对某个端口进行 socket 连接, 如果连接成功, 则代表 该端口有效,
可以根据端口,判断 是 哪个服务, 很多情况下,都是很准确的。
80 http
443 https
22 ssh
23 telnet
59 dns
3389 microsoft rdp

一共有 1-65535 个端口(其实0也可以用)

简单代码


# coding = utf-8

import socket
socket.setdefaulttimeout(0.1)

def get_port(host, port):
    try:
        obj = socket.socket()
        obj.connect((host,port))
        return True
    except:
        return False

def port_scan_test():
    if get_port('127.0.0.1',135):
        print('open!!!')
    else:
        print("No No No!!!")


代码优化

对代码进行优化, 刚才的代码,运行的时间非常慢,还只是在扫描一个端口的情况下

  1. 如果扫描一个 不存在的端口的时候, 会超时, 可以把 超时时间 设置短一点
  2. 对代码进行 多线程 或者 多进程的优化 ,大大缩短 扫描所有端口的时间

最后的代码


# coding = utf-8


import socket
import queue
socket.setdefaulttimeout(0.1)
import threading

def get_port(host, port):
    try:
        obj = socket.socket()
        obj.connect((host,port))
        return True
    except:
        return False






class mutit_scan(threading.Thread):

    def __init__(self, host, port_queue):
        threading.Thread.__init__(self)
        self.port_queue = port_queue
        self.host = host
    
    def run(self):
        while not self.port_queue.empty():
            port = self.port_queue.get()
            self.get_port_sign(port)

    
    def get_port_sign(self, port):
        # print(port)
        if get_port(self.host, port):
            print(port, 'is open!!!')





def mutili_port_scan_all():
    """ 多线程优化 """
    ip = '60.172.40.204'
    thread_count = 500
    threads = []
    port_que = queue.Queue()
    port_list = []
    for i in range(1,65536):
        port_list.append(i)
        port_que.put(i)
    
    for _ in range(thread_count):
        thread = mutit_scan(ip, port_que)
        threads.append(thread)
        thread.start()
    
    for i in threads:
        i.join()

    
mutili_port_scan_all()

差不多 7 秒跑完, 那个 socket 超时时间可以设置成 0.01s

记录一下, 写这个东西的思路, 虽然很简单,但是千里之行始于足下嘛

posted @ 2021-02-15 20:13  m1n9yu3  阅读(209)  评论(0编辑  收藏  举报