如何通过Scapy实现发送100字节但抓包显示ICMP长度为1字节?
ICMP数据包长度篡改实现方案
你的需求是发送100字节数据,但让抓包工具显示ICMP数据部分长度为1字节,本质是篡改ICMP头部的长度字段,绕过Scapy的自动计算逻辑即可实现,但需要注意这种数据包不符合ICMP协议规范。
原代码问题分析
你手动设置ICMP(length=1)但抓包仍显示真实长度,是因为Scapy在通过/拼接负载时,会自动根据负载长度重新计算ICMP的length字段,覆盖你手动设置的值。
实现方法
手动拼接ICMP数据包
绕过Scapy的自动字段计算,直接构造ICMP头部字节并拼接负载,代码示例:
from scapy.all import IP, ICMP, Raw, send # 准备100字节数据 data = b'A' * 100 # 构造ICMP头部,强制设置length=1 icmp_header = ICMP(length=1) # 将ICMP头部转为字节,手动拼接负载 icmp_packet = bytes(icmp_header) + data # 构造IP包,将拼接后的ICMP数据作为原始负载发送 packet = IP(dst='1.1.1.1') / Raw(load=icmp_packet) send(packet)
注意事项
- 这种数据包属于畸形包,违反ICMP协议规范:接收方会根据length字段只读取1字节数据,剩余99字节会被视为无效内容,大概率会被丢弃或无法正常解析。
- 部分抓包工具可能会标记该数据包为异常,或显示实际捕获到的总长度,但ICMP头部的length字段会显示为你设置的1。
内容的提问来源于stack exchange,提问作者Dion
相关产品推荐
相关产品推荐

