使用 Scapy 更改数据包 - 在编辑数据包的有效负载后自动更新属性(长度、校验和等)
Altering packets using Scapy - automatically update properties (length, checksum etc.) after editing packet's payload
我目前正在使用 Python 中的 scapy
修改 pcap
文件(在 Linux 系统上)。我这样做有两个原因:
- 我需要更改某些数据包负载的特定部分,然后重放这些数据,以便我正在测试的软件接收更改后的数据,从而允许我观察其行为
- 当我尝试使用
tcpreplay
或 scapy
自己的 sendp(...)
时,我得到了一些数据包(带有原始负载)的 "message too long"。减少负载应该(如果我没记错的话)让我解决这个问题。
这是我所做的一个小例子(我使用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
所以这个问题可能太明显了,但是有没有办法改变负载,使其属性也自动更新?
Scapy 避免在编码员不想要的情况下做事。例如,您必须能够为您的测试手动指定一个错误的校验和,而无需 scapy 修改它。
一般情况下,当一个属性为None
时,scapy会自动计算该值。例如,将所有的校验和和长度设置为None
,scapy会在构建时根据数据包计算它们。
如果你不想写,你也可以使用
来构建它
pkt = Ether(bytes(pkt))
(假设 Ether 是最低层),将值设置为 None 后,这也会重新计算校验和
在执行 wrpcap(..)
、bytes(packet)
或 packet.show2()
时也会构建数据包
这应该可以解决您的问题
我目前正在使用 Python 中的 scapy
修改 pcap
文件(在 Linux 系统上)。我这样做有两个原因:
- 我需要更改某些数据包负载的特定部分,然后重放这些数据,以便我正在测试的软件接收更改后的数据,从而允许我观察其行为
- 当我尝试使用
tcpreplay
或scapy
自己的sendp(...)
时,我得到了一些数据包(带有原始负载)的 "message too long"。减少负载应该(如果我没记错的话)让我解决这个问题。
这是我所做的一个小例子(我使用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
所以这个问题可能太明显了,但是有没有办法改变负载,使其属性也自动更新?
Scapy 避免在编码员不想要的情况下做事。例如,您必须能够为您的测试手动指定一个错误的校验和,而无需 scapy 修改它。
一般情况下,当一个属性为None
时,scapy会自动计算该值。例如,将所有的校验和和长度设置为None
,scapy会在构建时根据数据包计算它们。
如果你不想写,你也可以使用
来构建它pkt = Ether(bytes(pkt))
(假设 Ether 是最低层),将值设置为 None 后,这也会重新计算校验和
在执行 wrpcap(..)
、bytes(packet)
或 packet.show2()
这应该可以解决您的问题