如何在Scapy中使用import_hexcap()?ICMP字段修改遇阻求助
问题解决:修改ICMP Unused字段及
import_hexcap()停滞问题 为什么直接改ICMP Unused字段始终为0?
Scapy在处理ICMP数据包时,会自动维护协议合法性,Unused这类预留字段通常会被Scapy在数据包构建/发送阶段自动重置为0,所以直接修改pkt[ICMP].unused往往不会生效。
import_hexcap()程序停滞的原因
import_hexcap()默认从标准输入读取十六进制dump内容,你直接调用时程序会卡住等待输入,这就是停滞的根源。它需要明确传入格式化后的十六进制字符串,或者指定输入源。
正确使用import_hexcap()的流程
如果坚持用导出-修改-导入的方式,按以下步骤来:
- 用
hexdump(pkt, dump=True)获取仅包含字节的纯十六进制字符串(不带地址和ASCII注释) - 修改对应位置的字节
- 将修改后的字符串传入
import_hexcap()
示例代码:
from scapy.all import * # 1. 生成原始数据包并导出十六进制 pkt = Ether()/IP(dst="4.2.2.1")/ICMP()/Raw(b"test data") raw_hex = hexdump(pkt, dump=True) # 2. 定位并修改Unused字段(根据你的dump调整索引) hex_parts = raw_hex.split() # 假设Unused字段对应第28-31位(示例值,需根据实际dump确认) hex_parts[28:32] = ["AA", "BB", "CC", "DD"] modified_hex = " ".join(hex_parts) # 3. 导入修改后的数据包 modified_pkt = import_hexcap(modified_hex) hexdump(modified_pkt)
更高效的直接修改方式(无需导出导入)
没必要绕弯子,直接操作数据包的原始字节更简单:
from scapy.all import * pkt = Ether()/IP(dst="4.2.2.1")/ICMP()/Raw(b"test data") # 定位ICMP Unused字段的字节偏移(Echo Request中Unused是ICMP头的第6-9字节) icmp_header_start = pkt[IP].payload_offset unused_offset = icmp_header_start + 4 # ICMP类型(1)+代码(1)+校验和(2)之后就是Unused字段 # 修改Unused字段为0xAABBCCDD pkt.raw_packet[unused_offset:unused_offset+4] = b"\xAA\xBB\xCC\xDD" # 让Scapy重新计算校验和(可选,Scapy发送时会自动计算) pkt[ICMP].chksum = None # 验证修改结果 hexdump(pkt) # 发送数据包 sendp(pkt)
关键注意点
- 修改字节后,记得让Scapy重新计算ICMP校验和,否则数据包可能被目标丢弃
- 不同ICMP类型的Unused字段位置不同,需要对照数据包的hexdump确认准确偏移
内容的提问来源于stack exchange,提问作者anonymous bear
相关产品推荐
相关产品推荐

