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

如何在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()的流程

如果坚持用导出-修改-导入的方式,按以下步骤来:

  1. 用hexdump(pkt, dump=True)获取仅包含字节的纯十六进制字符串(不带地址和ASCII注释)
  2. 修改对应位置的字节
  3. 将修改后的字符串传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:55:31