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

如何使用Scapy替换PCAP文件中的IP地址

Scapy 替换PCAP双向流IP地址实现方案

首先安装依赖:
pip install scapy

实现逻辑说明

处理双向PCAP流的IP替换核心要注意两点:

  • 同时匹配源、目的位置的原始IP,保证双向流量的替换逻辑对称,不会出现流向错乱
  • 修改IP字段后必须删除原有IP层、传输层(TCP/UDP/ICMP)的校验和,Scapy会在输出时自动重算正确值,避免生成损坏的报文。

完整可直接运行的代码如下:

from scapy.all import *
# 关闭Scapy运行时的冗余日志输出
conf.verb = 0

# 配置参数
INPUT_PCAP = "eth0.pcap"       # 待处理的原始pcap路径
OUTPUT_PCAP = "modified.pcap"  # 替换完成后的输出pcap路径
NEW_IP_FOR_FIRST_SRC = "8.8.8.8"    # 首包源IP要替换成的新地址
NEW_IP_FOR_FIRST_DST = "1.1.1.1"    # 首包目的IP要替换成的新地址

# 读取所有报文
packets = rdpcap(INPUT_PCAP)
# 从首个IP报文提取原始通信IP对
first_pkt = packets[0]
if IP not in first_pkt:
    raise Exception("首个报文不是IP报文,无法自动提取原始IP对,请手动配置IP映射表")
old_ip_src = first_pkt[IP].src
old_ip_dst = first_pkt[IP].dst
ip_map = {
    old_ip_src: NEW_IP_FOR_FIRST_SRC,
    old_ip_dst: NEW_IP_FOR_FIRST_DST
}

modified_pkts = []
for pkt in packets:
    # 非IP报文直接保留,不做修改
    if IP not in pkt:
        modified_pkts.append(pkt)
        continue
    # 替换源IP
    if pkt[IP].src in ip_map:
        pkt[IP].src = ip_map[pkt[IP].src]
    # 替换目的IP
    if pkt[IP].dst in ip_map:
        pkt[IP].dst = ip_map[pkt[IP].dst]
    # 删除原有校验和,触发Scapy自动重算
    del pkt[IP].chksum
    if TCP in pkt:
        del pkt[TCP].chksum
    elif UDP in pkt:
        del pkt[UDP].chksum
    elif ICMP in pkt:
        del pkt[ICMP].chksum
    modified_pkts.append(pkt)

# 写入修改后的pcap文件
wrpcap(OUTPUT_PCAP, modified_pkts)
print(f"处理完成,输出文件:{OUTPUT_PCAP}")

注意事项

  • 如果需要替换成示例中提到的172.10.10.10、172.10.20.20地址,直接修改代码里NEW_IP_FOR_FIRST_SRC和NEW_IP_FOR_FIRST_DST的赋值即可
  • 如果PCAP里包含多组IP会话,不想从首包自动提取原始IP,可以直接跳过自动提取逻辑,手动写死ip_map的键值对映射即可
  • 脚本默认保留所有非IP报文(比如ARP、二层控制帧),不会做任何改动
  • 输出的PCAP可以直接用Wireshark打开验证,报文校验和合法,可直接用于流量重放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:01:18