zoukankan      html  css  js  c++  java
  • 端口扫描器编写 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

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

  • 相关阅读:
    MySQL事务处理2
    servlet过滤器配置白名单、黑名单
    Freemarker生成静态代码实例
    FreeMarker---数据类型
    创建第一个freemarker
    JDBC编程之优化
    关于ComponentName的使用
    launchMode使用详解
    android开发之使用上下文菜单
    android开发之shape详解
  • 原文地址:https://www.cnblogs.com/shenshuoyaoyouguang/p/14404349.html
Copyright © 2011-2022 走看看