背景
没啥背景,因为之前上课有用到一些的扫描端口的工具,都挺完美的了,但是想深入了解实现的原理。同时也希望可以有自己用的一些脚本。因此就有了写这个程序的想法咯。
一、思路
找端口,首先要像端口发送连接吧,成功跟失败返回结果我们不就清楚这个端口是否开放了吗。ok,python的socket模块完美的解决了这个问题。总结思路:发起连接->成功->打印端口
二、实现
不多bb啦,直接甩代码:
import socket
import time
import threading
allport = (allp for allp in range(65536)) #所有端口集 端口相关功能信息参考https://www.cnblogs.com/cctest/p/9111506.html
commonports = (7,9,13,21,22,25,37,53,79,80,88,106,110,113,119,135,139,143,179,199,389,427,443,444,
465,513,514,543,548,554,587,631,646,873,990,993,995,1025,1026,1027,1028,1110,1433,
1720,1723,1755,1900,2000,2049,2121,2717,3000,3128,3306,3389,3986,4899,5000,5009,5051,
5060,5101,5190,5357,5432,5631,5666,5800,5900,6000,6646,7070,8000,8008,8080,8443,8888,
9100,9999,32768,49152,49153,49154,49155,49156) #网上统计常用端口集
starttime = time.time() #开始的时间(用来统计扫描时间)
def paduankou(ip,port): #扫描的核心函数
conn = socket.socket() #创建套接字
pa = conn.connect_ex((ip,port)) #创建连接,ip为地址,port为端口connect_ex是connect()函数的扩展版本,成功返回0出错时返回出错码,而不是抛出异常
conn.settimeout(3) #设置超时时间
if(pa == 0):
print(f"端口{port}打开") #连接成功打印出来端口号
else:
pass
for i in allport :
threading.Thread(target=paduankou,args=('127.0.0.1',i)).start() #创建线程使函数跑的效率更高 (没有创建线程时扫描经常用的端口用17秒,创建后0.04秒,跑完所有也就用22秒,时间在我本人接受范围内哈)
jieshutime = time.time()
shijian = jieshutime-starttime #统计扫描用的时间
print(f"扫描完毕,使用时间:{shijian}秒")
效果图(上面还有一些端口没截到图0.0):
三、结束
emm,写这个程序第一为了学习,第二也为了摆脱只会使用人家的东西,并且网上很多脚本都是用参数设置具体的值,但是本人非常讨厌记参数哈,所以,我宁愿在自己的程序里面修改哈哈,这是一个挺不好的习惯来的。欢迎各位大哥指出问题跟建议。我还是一个!小白!终极小白!