栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

常见的端口扫描工具(python端口扫描器源代码)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

常见的端口扫描工具(python端口扫描器源代码)

文章目录

python网络编程

socket函数

服务器端套接字函数客户端套接字函数公共用途套接字 C/S架构实践 编写端口扫描器

多线程端口扫描2.0

python网络编程

socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答请求。使主机间或者一台计算机上的进程间可以通讯。

C/S架构:

socket函数

socket()函数创建套接字,语法:socket.socket([family[,type[,proto]]])family:套接字家族可以为AF_UNIX(本机内进程间)或者AF_INET(主机与主机间通信)type:套接字类型可以根据面向链接还是非链接分为SOCK_STREAM或SOCK_DGRAMprotocol:协议,一般不填 服务器端套接字函数

s.bind()绑定地址(host,port)到套接字(传入的参数为元组)s.listen()开始tcp监听s.accept()被动接收tcp客户端链接 客户端套接字函数

s.connect() 主动初始化tcp服务器链接s.connect_ex()上个函数的扩展版本,出错返回错误码而不是报异常 公共用途套接字

可能看到这里都很懵,看看实际代码吧

C/S架构实践

0.0.0.0代表所有网卡,死循环表示一直接收客户端请求

写一个客户端请求:

# encoding:utf-8

import socket
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server_host = '127.0.0.1'
server_port = 8888
c.connect((server_host,server_port))
print c.recv(1024)
c.close()

这种网页只能实现服务器向客户端发送信息,如果是双向发送,在客户端加send()函数在服务器端加recv()函数

编写端口扫描器

前面我写了编写目录扫描工具,有兴趣的可以康康
首先,如何判断端口是否开放。直接请求该端口,connect_ex请求错误时会返回ture

#!/usr/bin/python
# encoding:utf-8

import socket
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = '127.0.0.1'
port = 80
if c.connect_ex((host,port))==0
	print "%s:%d is open" % (host,port)
c.close()

但是一个socket对应一个connect,上述代码如果检测到一个端口开放就不会继续扫描,因为已经connect上了。所以创建套接字也要放入循环中

#!/usr/bin/python
# encoding:utf-8

import socket
import sys

ports = (1,65535)
host = sys.argv[1]#接收命令行传入的url

for port in ports:
	c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	if c.connect_ex((host,port))==0
		print "%s:%d is open" % (host,port)
	c.close()

现在就是65535个端口全扫啦,一个迷你namp就这十几行代码,但它还是有点慢,下面加入多线程

多线程端口扫描2.0
#!/usr/bin/python
# encoding:utf-8

import socket
import sys
import threading
import queue

def scan():
	while not q.empty():
		port = q.get()
		c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		if c.connect_ex((host,port))==0
			print "%s:%d is open" % (host,port)
		c.close()

if __name__=="__main__":
	host = sys.argv[1]
	thread_num = sys.argv[2]
	q = queue.Queue()
	for port in range(1,65535):
		q.put(port)
	
	for i in range(int(thread_num))
		t = threading.Thread(target=scan)
		t.start()
		t.join()#子线程全部运行完了结束进程,以免线程卡死

if name == ‘main’:的作用
一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/772402.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号