- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章利用Python实现端口扫描器的全过程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
socket又称套接字,可以看做是不同主机之间的进程进⾏双向通信的端点,简单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程,发出网络请求或者应答网络请求.
socket起源于Unix,⽽Unix/Linux基本哲学之⼀就是"⼀切皆⽂件",对于⽂件⽤"打开"、"读写"、"关闭"模式来操作。而socket就是该模式的⼀个实现,说白了socket就是⼀种特殊的⽂件,⼀些socket函数就是对其进⾏的操作,包括读/写IO、打开、关闭等.
Python 中,我们使用socket()函数来创建套接字,语法格式如下:
1
2
|
import
socket
socket.socket(family,
type
)
|
函数socket.socket创建一个socket套接字,该函数带有两个参数:
1
2
3
4
5
6
7
8
|
import
socket
# 创建tcp的套接字
s
=
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ...这⾥是使⽤套接字的功能(省略)...
# 关闭套接字
s.close()
|
1
2
3
4
5
6
7
|
import
socket
# 创建udp的套接字
s
=
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...这⾥是使⽤套接字的功能(省略)...
# 不⽤的时候,关闭套接字
s.close()
|
函数 | 描述 |
---|---|
服务器端套接字 | |
s.bind() | 绑定地址(host, port)到套接字, 在AF_INET下,以元组(host, port)的形式表示地址。 |
s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量,该值⾄少为1。 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来。 |
客户端套接字 | |
s.connect() | 主动初始化TCP服务器连接,。⼀般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 |
s.connect_ex() | connect()函数的扩展版本,出错时返回出错码,⽽不是抛出异常。 |
公共⽤途的套接字函数 | |
s.recv() | 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最⼤数据 量。flag提供有关消息的其他信息,通常可以忽略。 |
s.send() | 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送 的字节数量,该数量可能⼩于string的字节⼤⼩。 |
s.sendall() | 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的 套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。 |
s.recvfrom() | 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data 是包含接收数据的字符串,address是发送数据的套接字地址。 |
s.sendto() | 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr, port)的元组,指定远程地址。返回值是发送的字节数。 |
s.close() | 关闭套接字 |
s.getpeername() | 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。 |
s.getsockname() | 返回套接字⾃⼰的地址。通常是⼀个元组(ipaddr,port) 。 |
s.setsockopt(level,optname,value) | 设置给定套接字选项的值。 |
s.getsockopt(level,optname,buflen) | 返回套接字选项的值。 |
s.settimeout(timeout) | 设置套接字操作的超时期,timeout是⼀个浮点数,单位是秒。值为 None表示没有超时期。⼀般,超时期应该在刚创建套接字时设置,因为 它们可能⽤于连接的操作(如connect()) |
s.gettimeout() | 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。 s.fileno() |
s.setblocking(flag) | 如果flag为0,则将套接字设为⾮阻塞模式,否则将套接字设为阻塞模式 (默认值)。⾮阻塞模式下,如果调⽤recv()没有发现任何数据,或 send()调⽤⽆法⽴即发送数据,那么将引起socket.error异常。 |
s.makefile() | 创建⼀个与该套接字相关连的⽂件。 |
了解了socket及socket相关函数之后,我们就来实现一个端口扫描的小工具.
所谓端口扫描,就是对指定服务器地址的指定端口进行扫描,通过扫描结果就可以知道一台计算机上都开放了哪些端口,如果你懂一些漏洞知识或者黑客攻击的话,就可以通过开放端口进行攻击,甚至有些很厉害的黑客,通过一个不起眼的端口,就能造成整个局域网内所有的主机沦陷。当然,我们学习的目的,不是为了攻击.
端口扫描的原理:向远端指定服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方没有此项服务时,对方就无应答。利用这个原理,我们可以指定一些端口,然后针对这些接口分别建立连接,并获取对方是否应答,便可知道对方哪些端口是开放的.
上面我们说了socket.connect_ex((ip, port)),调用该函数对指定ip和端口发出连接请求,如果返回0则证明该端口是开放的,返回错误代码说明该接口是不开放的.
下面是端口扫描程序的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import
socket
from datetime
import
datetime
from multiprocessing.dummy
import
Pool as ThreadPool
class
ScanPort:
def __init__(self):
self.ip = None
def scan_port(self, port):
try
:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = s.connect_ex((self.ip, port))
if
res ==
0
: # 端口开启
print(
'Ip:{} Port:{} IS OPEN'
.format(self.ip, port))
else
:
print(
'Ip:{} Port:{}: IS NOT OPEN'
.format(self.ip, port))
except Exception as e:
print(e)
finally
:
s.close()
def start(self):
remote_server = input(
"输入要扫描的远程主机:"
)
self.ip = socket.gethostbyname(remote_server)
ports = [i
for
i in range(
1
,
1025
)]
socket.setdefaulttimeout(
0.5
)
# 开始时间
t1 = datetime.now()
# 设置多进程
threads = []
pool = ThreadPool(processes=
8
)
pool.map(self.scan_port, ports)
pool.close()
pool.join()
print(
'端口扫描已完成,耗时:'
, datetime.now() - t1)
ScanPort().start()
|
加入了线程池,加快了运行速度.
运行截图:
到此这篇关于如何利用Python实现端口扫描器的文章就介绍到这了,更多相关Python端口扫描器内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/6995351390008655903 。
最后此篇关于利用Python实现端口扫描器的全过程的文章就讲到这里了,如果你想了解更多关于利用Python实现端口扫描器的全过程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在后台开启了“URL Rewrite”,看起来一切正常,可是点击某一栏目的时候却怎么都进不去,显示的依然是论坛的首页。看了一下论坛目录下,原来这下面并没有自己的.htaccess文件,所以默认使用的
本文实例为大家分享了.net发送邮件的实现代码,供大家参考,具体内容如下 关键代码: 需要引用命名空间: using System.Net.Mail; using System.Net;
今天的一个小测试是老师让用.NET用控件来制作一个拉菜单要求如下: 将鼠标移到父菜单上弹出3个子菜单,而且每个子菜单都有超链接。 以下是我自己做的代码: 复制代
我有以下内容 static const unsigned int chromosome = 6; double bestFitness[chromosomes]; for(int i = 0; i
关于附图,我需要一个计算算法来将 A 轴向下移动 n 英寸,将 B 轴从左向右移动 m 英寸,以便组件圆 D 遵循抛物线的曲线;圆 D 并不总是 10 英寸,可以更小。我不是数学专业的,所以这对我来说
我正在尝试利用我的格式字符串错误,它存在于这个程序中: #include #include #include #include #include void foo(char* tmp, ch
用Matplotlib和Seaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化。要是在你下次的演示、视频、社交媒体Po文里能用短视频呈现数据变化,是不
1、进程介绍 进程:正在执行的程序,由程序、数据和进程控制块组成,是正在执行的程序,程序的一次执行过程,是资源调度的基本单位。 程序:没有执行的代码,是一个静态的。 2、线程
1、前言 在开发过程中,有时会遇到需要控制任务并发执行数量的需求。 例如一个爬虫程序,可以通过限制其并发任务数量来降低请求频率,从而避免由于请求过于频繁被封禁问题的发生。 接下来
Opera 管理着一个漏洞赏金计划,研究人员可以在该计划中报告 Opera 软件中的漏洞并获得奖励。 这篇文章就是我发现的一个漏洞——网页可能会从用户那里检索本地文件的屏幕截图。 考虑到 O
C++ 文件查找 在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfi
1、前言 本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。 2、关键技术 本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,
最近在将一些项目的rest api迁移到.net core中,最开始是用的Nginx做反向代理,将已经完成切换的部分切入系统,如下图所示: 由于迁移过程中也在进行代码重构,需要经常比较频繁的测
前言 最近学习了python,感觉挺多地方能用到它的。打包 测试 上传 爬电影....而且代码量是真少。人生苦短,我用python。而今天写的这个是因为下载电影时总会发现除了视频还会有这两个文件,
1、Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序
一直想写一套生成静态页面的文章系统 但面对生成静态后的一些复杂数据库交互问题。又望而却步! 于是就想 有没有 在不耽误数据交互的情况下,而又能降低服务器负
Qt 利用大量第 3 方库进行图像编码、压缩、加密、音频和视频编解码器支持等。 从历史上看,当我想使用它们时,我总是必须将它们作为附加依赖项包含在内。我一直想知道是否有一种方法可以简单地重用 Qt 已
我想知道是否可以使用属性将功能“混合”到类/方法/属性中。 就像是: [TrackChanges] public Foo { get; set; } 如果可能的话,有谁会如何实现? 最佳答
有些站点位于共享主机(Windows 2003 Server)上,因此我无法访问服务器配置。 我到处都读到关于杠杆浏览器缓存的信息,特别是静态文件(jpg,css,js等)的信息,但是...在我的情况
我想在我的项目中使用 Julia 的主要原因之一是它的速度,尤其是在计算积分方面。 我想在某个区间 [a,b] 上积分一维函数 f(x)。一般来说,Julia 的 quadgk 函数将是一个快速而准确
我是一名优秀的程序员,十分优秀!