简单的端口扫描器代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import sys from socket import * host = sys.argv[1] ports = sys.argv[2].split('-') start_port = int(ports[0]) end_port = int(ports[1]) target_ip = gethostbyname(host) opened_ports = [] for port in range(start_port, end_port): sock = socket(AF_INET, SOCK_STREAM) sock.settimeout(10) result = sock.connec_ex(target_ip, port) if result == 0: opened_ports.append(port) print('Opened poers:') for i in opened_ports: print(i)
|
然后用命令行的方式进行传参python wsw.py 127.0.0.1 100-200
先用命令行进入wsw.py文件所在的文件,再执行上方代码。
AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6则是IPv6 的;而 AF_UNIX 则是 Unix 系统本地通信。
选择 AF_INET 的目的就是使用 IPv4 进行通信。因为 IPv4 使用 32 位地址,相比IPv6 的 128 位来说,计算更快,便于用于局域网通信。而且 AF_INET 相比 AF_UNIX 更具通用性,因为 Windows 上有 AF_INET 而没有 AF_UNIX。
SOCK_STREAM:TCP是连接的,提供序列化的,可靠的,双向连接的字节流。支持带外数据传输
多线程端口扫描代码:
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
| import sys import threading from socket import * print('dsjfhdj') def tcp_test(port): sock = socket(AF_INET, SOCK_STREAM) sock.settimeout(10) result = sock.connect_ex((target_ip, port)) if result == 0: lock.acquire() print("Opened Port:",port) lock.release() if __name__=='__main__': host = sys.argv[1] portstrs = sys.argv[2].split('-') start_port = int(portstrs[0]) end_port = int(portstrs[1]) target_ip = gethostbyname(host) lock = threading.Lock() for port in range(start_port, end_port): threading.Thread(target = tcp_test, args = (port,))
|
ading.Thread(target = tcp_test, args = (port,)) 用来创建一个线程,该函数的第一个参数是一个线程中执行的函数,第二个参数必须是个元组,作为函数的输入,由于 tcp_test 函数只有一个参数,所以我们使用(port,)这种形式表示这个参数为元组。
实现TCP测试函数,需要注意print输出时候需要加锁,如果不加锁可能会出现多个输出混合在一起的错误状态,而锁需要在程序启动时创建,从而能让新建的线程共享这个锁, 注意当输出执行完后要释放锁lock。
端口扫描: http://www.yukaige.com/?p=160
创建服务端和客户端:
代码详解:
http://www.cnblogs.com/kellyseeme/p/5525026.html
python socket编程详细介绍:
http://blog.csdn.net/rebelqsp/article/details/22109925