设计思路
该程序由python语言编写,其功能为在局域网中对特定的主机进行端口扫描,并得到开放的端口列表。所使用的端口扫描技术为全连接扫描。
在编码实现的过程中,通过使用系统提供的connect函数来对目标主机的特定端口进行连接,如果连接成功则可视为该端口处于侦听状态,如果连接失败则说明该端口未提供服务。
采用全连接对端口进行扫描的优点在于不需要使用管理员权限以及导入scapy库来发送特定的数据包进行其他类型的端口扫描技术,但是该扫描技术最大的缺点在于耗时较长,而在实现过程中通过多线程调度可以大幅度缩短扫描时间。
为优化该程序的使用体验,在设计与编写时,对于数据与参数的设置通过以命令行来对程序进行执行时附加的参数来实现,这样编写有利于代码测试与程序运行,同时防止了因输入错误而导致的程序崩溃所造成的严重后果。
代码结构
该程序主要由三部分代码组成,分别为负责输入输出的main函数;进行多线程调度的portScanner_2函数;以及负责进行端口扫描的portScanner_1函数:
-
portScanner_1:该函数的参数由目标主机IP,要扫描的端口号,以及开放的端口列表组成。该函数通过错误处理的方式来判断所进行的连接是否成功,如果成功则将该端口添加至开放端口的列表中,如果未成功则终止运行。
-
portScanner_2:该函数的参数由目标主机IP,要扫描的端口号列表以及开放的端口号列表组成,而执行过程则是为每个要监测的端口建立一个进程,再将这些进程并行执行,从而大幅缩短总执行时间。
-
main:该函数为程序的主函数,运行时首先获取附加的参数并对参数进行处理,确定要扫描的目标主机IP以及扫描的端口范围,随后执行portScanner_2函数并导入参数,最后输出得到的结果。
运行流程
程序的运行在安装有python3以上版本的windows或Linux系统上运行,运行命令为:
python3 main.py -h (目标主机IP) -p (起始端口)-(结束端口)
运行流程图如下:
数据结构
在程序中定义的各个常量与变量的含义如下:
变量名称 | 数据类型 | 变量含义 |
---|---|---|
host | 字符串 | 目标主机IP地址 |
openports | 列表 | 目标主机中扫描出开放的端口号 |
portlist | 列表 | 要扫描的端口号列表 |
start_port | 数字 | 要扫描的端口号最小值 |
end_port | 数字 | 要扫描的端口号最大值 |
源代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading
import re
import sys
import getopt
# 扫描函数