使用Scapy更改数据包 - 在编辑数据包的有效负载后自动更新属性(长度,校验和等)

问题描述 投票:1回答:1

我目前正在使用Python中的pcap修改scapy文件(在Linux系统上)。我这样做有两个原因:

  • 我需要更改某些数据包的负载的特定部分然后重放这些部分,以便我正在测试的软件接收到已更改的数据,从而允许我观察其行为
  • 对于一些数据包(带有原始负载),当我尝试使用tcpreplayscapy自己的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,所以这个问题可能太明显但有没有办法以这样的方式改变负载,使其属性也自动更新?

python scapy pcap
1个回答
2
投票

Scapy避免在没有编码器想要的情况下做事。例如,您必须能够为测试手动指定错误的校验和,而无需修改scapy。

通常,当属性为None时,scapy会自动计算该值。例如,将所有校验和和长度设置为None,scapy将根据构建时的数据包为您计算它们。

如果您不想编写它,也可以使用它来构建它

pkt = Ether(bytes(pkt))

(假设Ether是最低层),在将值设置为None后,这也会重新计算校验和

在做wrpcap(..)bytes(packet)packet.show2()时也会建立一个数据包

这应该可以解决您的问题

© www.soinside.com 2019 - 2024. All rights reserved.