我目前正在Python中使用pcap
来修改scapy
文件(在Linux系统上)。我这样做有两个原因:
tcpreplay
或scapy
自己的sendp(...)
时,收到的消息“太长”。减少负载(如果我没记错的话)应该可以解决这个问题。这是我所做的一个小例子(我使用ipython
):
from scapy.all import rdpcap, wrpcap
from scapy.utils import sendp
import re
# Load PCAP file. In my case I have 24 packets
pkts = rdpcap('dump.pcap')
# Change the load of packet 16 by removing some of the data inside
pkts[16].load = re.sub(r'<Stop[0-9]+>[0-9]+</Stop[0-9]+>', '', pkts[16].load)
# Write the changes to a new file
wrpcap('dump_edited.pcap', pkts)
# and send those (the operation requires admin privileges!)
sendp(pkts) # or use tcpreplay in the terminal
现在的问题是,以这种方式编辑负载意味着与负载相关的其他属性将不会更新。例如,如果长度以前是 2982 (使用pkts[16].show()
,您可以在编辑包的负载后获得该包属性的详细概述),则长度仍然相同。校验和也不会改变。当然这是可以预期的,因为我所做的只是直接编辑字符串,这显然不会触发数据包属性的任何更新。
我刚刚发现scapy
,所以问题可能太明显了,但是有没有办法改变负载以使其属性也自动更新?
答案 0 :(得分:2)
Scapy避免在编码人员不想要的情况下做事。例如,您必须能够为测试手动指定错误的校验和,而不必费力地修改它。
通常,当属性为None
时,scapy会自动计算该值。例如,将所有校验和和长度设置为None
,scapy会在构建时根据数据包为您计算它们。
如果您不想编写它,也可以使用
进行构建pkt = Ether(bytes(pkt))
(假设以太是最低层),将值设置为None后,这还会重新计算校验和
在进行wrpcap(..)
,bytes(packet)
或packet.show2()
时也会建立一个数据包
这应该可以解决您的问题