基于Scapy与Python的隐秘端口扫描器作业问题求助
隐秘端口扫描器代码问题及改进建议
我正在完成大学作业,需使用Python结合Scapy开发一款隐秘端口扫描器(Stealth Port Scanner)。目前已完成41个任务小节中的11个,但怀疑代码存在问题,希望得到改进方向的指导。
以下是我的代码:
target = input("Adres IP: ") Registered_Ports = range(1023) open_ports = [] def scanport(port): port = RandShort() conf.verb = 0 SYNACKpkt = sr1(IP(dst=target) / TCP(sport=srcport, dport=port, flags="S", timeout=0.5)) flags = SYNACKpkt.getlayer(TCP).flags if flags == SYNACKpkt: return True else: return False SynPkt1 = IP() / TCP() SynPkt1.haslayer(TCP) 1 SynPkt2 = IP() / UDP() SynPkt2.haslayer(TCP) 0
代码存在的问题及改进方向
- 未定义变量报错:函数
scanport中使用的srcport变量未定义,运行时会抛出NameError,需改为用RandShort()生成随机源端口并赋值给变量(如src_port = RandShort())。 - 端口参数被覆盖:函数接收
port参数后立刻用port = RandShort()覆盖,导致无法扫描指定端口,应删除这行代码,使用传入的port参数作为目标端口。 - 标志位判断逻辑错误:
if flags == SYNACKpkt是将TCP标志位与数据包对象做比较,永远不会成立。正确的判断是检查标志位是否为0x12(对应SYN+ACK)或字符'SA'。 - 未处理空响应:当
sr1超时返回None时,调用SYNACKpkt.getlayer(TCP).flags会抛出异常,需先判断SYNACKpkt是否不为空。 - 冗余代码无意义:
SynPkt1和SynPkt2相关代码仅用于测试协议层,对扫描功能无帮助,可直接删除。 - 未实现批量端口扫描:定义了
Registered_Ports但未遍历这些端口调用扫描函数,需添加循环遍历端口并收集开放端口。
改进后的示例代码片段
from scapy.all import IP, TCP, sr1, RandShort, conf target = input("目标IP地址: ") registered_ports = range(1, 1024) # 注册端口范围为1-1023 open_ports = [] conf.verb = 0 # 全局关闭Scapy的冗余输出 def scan_port(port): src_port = RandShort() # 构造SYN包 syn_packet = IP(dst=target) / TCP(sport=src_port, dport=port, flags="S") # 发送包并等待响应 response = sr1(syn_packet, timeout=0.5) # 处理空响应(端口可能关闭或过滤) if response is None: return False # 检查响应是否包含TCP层 if response.haslayer(TCP): tcp_flags = response.getlayer(TCP).flags # 判断是否收到SYN+ACK if tcp_flags == 0x12: # 发送RST包终止连接,避免留下半开连接痕迹(隐秘扫描核心) sr1(IP(dst=target) / TCP(sport=src_port, dport=port, flags="R"), timeout=0.1) return True return False # 遍历所有注册端口进行扫描 for port in registered_ports: if scan_port(port): open_ports.append(port) print(f"检测到的开放端口: {open_ports}")
内容的提问来源于stack exchange,提问作者Jennifer
相关产品推荐
相关产品推荐

