Как я могу использовать Scapy, чтобы получить специальные слои от pkt1 к другому pkt2? - PullRequest
1 голос
/ 02 апреля 2020

Теперь у меня есть один 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 ?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вы можете скопировать и обрезать пакет:

pkt = Ether()/IP()/UDP()/VXLAN()/Ether()/IPv6()/TCP()
pkt2 = pkt.copy()
pkt2[UDP].remove_payload()
0 голосов
/ 02 апреля 2020

Чтобы получить первые 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'
...