You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:51:21