如何在Python中复现Wireshark捕获的设备请求包以测试端口状态?
解决方案:用Scapy构造原始数据包测试端口
直接用socket建立TCP连接的方式会触发设备异常逻辑,改用Scapy构造并发送你在Wireshark中抓到的原始请求数据包,无需完成完整TCP握手,就能避免设备主动连接的问题,同时通过是否收到正常响应判断端口状态。
步骤说明
安装Scapy
执行命令安装依赖:pip install scapy解析Wireshark捕获的数据包
从Wireshark中提取以下关键信息:- 源IP(你的电脑IP)、目标IP(设备IP)
- 目标端口(要测试的端口)
- TCP数据包的标志位(比如
PSH+ACK,取决于你抓到的请求包) - 请求包中的应用层payload数据(复制十六进制后转为bytes)
编写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
相关产品推荐
相关产品推荐

