如何使用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
相关产品推荐
相关产品推荐

