我如何使用 scapy 将特殊层从 pkt1 获取到另一个 pkt2?

how can i use scapy to get special layers from pkt1 to another pkt2?

现在我有一个这样的 pkt:ether-ip-udp-vxlan-ether-ipv6-tcp,我想得到一些层,比如:ether_ip_udp,我不想要层共 ether_ipv6_tcp.

pkt=Ether()/IP()/UDP()/VXLAN()/Ether()/IPv6()/TCP()

我试过使用getlayer,但是它会得到下一层,这不是我想要的。 pkt=Ether()/IP()/UDP()/VXLAN()/Ether()/IPv6()/TCP()

pkt.getlayer(Ether)

它将获得所有下一层。

我如何在 scapy 中执行此操作?

为了获得前 3 层,您需要将数据包转换为层,然后用您关心的层构建一个新数据包。可能还有其他方法可以做同样的事情。

# original_name_for_script.py
from scapy.all import *

pkt = Ether()/IP()/UDP()/VXLAN()/Ether()/IPv6()/TCP()
layers = pkt.layers()
# Equivalent of calling Ether()/IP()/UDP(), but for existing packet
new_pkt = layers[0]()/layers[1]()/layers[2]()
new_pkt.summary()

运行这个脚本,我们得到

$ python original_name_for_script.py
'Ether / IP / UDP 127.0.0.1:domain > 127.0.0.1:domain'

您可以复制并trim数据包:

pkt = Ether()/IP()/UDP()/VXLAN()/Ether()/IPv6()/TCP()
pkt2 = pkt.copy()
pkt2[UDP].remove_payload()