深圳宝安住房和建设局网站官网上海网络推广平台
用Pyhon编写一个属于自己的nmap
文章目录
- 用Pyhon编写一个属于自己的nmap
- 导入 socket 模块,确定目标主机 IP 或域名以及需要扫描的端口列表
- 开始扫描、扫描每个端口
- 创建一个 socket 对象,用于建立 TCP 连接
- 尝试连接目标主机的指定端口
- 如果连接成功,则表示该端口是开放的
- 如果用户按下键盘中断键,退出程序
- 如果无法解析主机名,退出程序
- 如果连接失败,退出程序
- 完整代码附上
要编写一个类似于nmap的端口扫描工具,我们需要:
- 确定要扫描的IP地址或主机名。
- 确定要扫描的端口范围。
- 创建一个Socket对象,使用Socket对象与目标主机建立TCP连接。
- 使用Socket对象发送TCP SYN包到目标主机上指定的端口。
- 接收目标主机返回的TCP SYN/ACK包。
- 根据目标主机返回的包,判断是否该端口处于打开状态。
重复步骤4-6,直到扫描完所有指定的端口。接着输出扫描结果。
导入 socket 模块,确定目标主机 IP 或域名以及需要扫描的端口列表
import socketclass PortScanner:def __init__(self, target, ports):self.target = targetself.ports = ports
开始扫描、扫描每个端口
def scan(self):print(f'Starting scan on {self.target}...\n')for port in self.ports:self.scan_port(port)
创建一个 socket 对象,用于建立 TCP 连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(0.5)
尝试连接目标主机的指定端口
result = sock.connect_ex((self.target, port))if result == 0:
如果连接成功,则表示该端口是开放的
print(f'Port {port} is open.')
如果用户按下键盘中断键,退出程序
print('Exiting...')exit()
如果无法解析主机名,退出程序
print('Hostname could not be resolved. Exiting...')exit()
如果连接失败,退出程序
print('Could not connect to server. Exiting...')exit()
完整代码附上
import socketclass PortScanner:def __init__(self, target, ports):self.target = targetself.ports = portsdef scan(self):print(f'Starting scan on {self.target}...\n')for port in self.ports:self.scan_port(port)def scan_port(self, port):try:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(0.5)result = sock.connect_ex((self.target, port))if result == 0:print(f'Port {port} is open.')sock.close()except KeyboardInterrupt:print('Exiting...')exit()except socket.gaierror:print('Hostname could not be resolved. Exiting...')exit()except socket.error:print('Could not connect to server. Exiting...')exit()