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

如何在Python中复现Wireshark捕获的设备请求包以测试端口状态?

解决方案:用Scapy构造原始数据包测试端口

直接用socket建立TCP连接的方式会触发设备异常逻辑,改用Scapy构造并发送你在Wireshark中抓到的原始请求数据包,无需完成完整TCP握手,就能避免设备主动连接的问题,同时通过是否收到正常响应判断端口状态。

步骤说明

  1. 安装Scapy
    执行命令安装依赖:

    pip install scapy
    
  2. 解析Wireshark捕获的数据包
    从Wireshark中提取以下关键信息:

    • 源IP(你的电脑IP)、目标IP(设备IP)
    • 目标端口(要测试的端口)
    • TCP数据包的标志位(比如PSH+ACK,取决于你抓到的请求包)
    • 请求包中的应用层payload数据(复制十六进制后转为bytes)
  3. 编写Python脚本
    以下是示例代码,根据你实际提取的参数修改:

    from scapy.all import IP, TCP, send, sniff
    
    # 替换为你从Wireshark提取的参数
    SRC_IP = "192.168.1.100"  # 你的电脑IP
    DST_IP = "192.168.1.200"  # 设备IP
    SRC_PORT = 45678  # 选一个本地未占用的端口
    DST_PORT = 8080   # 要测试的设备端口
    # 替换为抓到的请求payload(十六进制转bytes)
    REQUEST_PAYLOAD = b"\x00\x01\x02\x03\x04\x05..."
    
    # 构造完整数据包
    ip_layer = IP(src=SRC_IP, dst=DST_IP)
    # 根据抓到的包设置TCP标志位,比如"PA"代表PSH+ACK
    tcp_layer = TCP(sport=SRC_PORT, dport=DST_PORT, flags="PA", seq=12345, ack=67890)
    request_packet = ip_layer / tcp_layer / REQUEST_PAYLOAD
    
    # 定义响应处理函数
    def handle_response(pkt):
        # 验证是否是设备返回的目标响应
        if IP in pkt and pkt[IP].src == DST_IP and TCP in pkt and pkt[TCP].dport == SRC_PORT:
            print(f"端口 {DST_PORT} 开放,收到设备响应")
            print("响应内容:", pkt[TCP].payload.original)
            return True
    
    # 发送请求并监听10秒内的响应
    send(request_packet, verbose=0)
    sniff(
        filter=f"tcp and src host {DST_IP} and dst port {SRC_PORT}",
        prn=handle_response,
        timeout=10,
        count=1  # 只捕获第一个匹配的响应
    )
    

关键注意事项

  • 必须严格匹配Wireshark中抓到的请求包细节,尤其是TCP标志位和payload数据,否则设备可能不返回响应。
  • 如果设备对TCP的seq/ack序号有严格校验,需要从Wireshark的请求包中提取对应的序号填入脚本。
  • 运行脚本可能需要管理员权限(因为要发送原始网络数据包)。

内容的提问来源于stack exchange,提问作者Jonathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:03:14