我想检查/分析使用Python程序中的ICMPv6路由器公告(RAs),在该程序中,我获得(不是这样)原始数据包数据,如下所示:
import socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_ICMPV6)
p, addr = sock.recvfrom(4096)
当接收到ICMPv6数据包时,数据包p将只包含(!)ICMPv6部件本身,但没有任何其他外部元素,所以没有IPv6头,没有以太网报头,.
如何从我的原始数据包数据创建正确的Scapy 6派生的数据包类?_ICMPv6
似乎只是一个后备类。是否有某种工厂可以从其中获得正确的子类(如ICMPv6ND_RA
)?
发布于 2018-08-28 17:00:40
在阅读了Scapy的inet6.py源代码之后,我注意到有一个更“直接”(但不一定更干净)的方法来获得正确的Scapy ICMPv6消息对象,而不是Cukic0d的精确答案:这意味着有另一种方式不需要“假的”外部IPv6对象外壳(尽管我真的很欣赏Cukic0d的回答,因为它是一个将发件人地址倒入的好地方!)
from scapy.layers.inet6 import *
icmpv6_packet = icmp6typescls.get(p[0], ICMPv6Unknown)(p)
这使用icmp6typescls
字典将从套接字返回的数据包的第一个八进制中的ICMPv6 (消息)类型映射到其相应的Scapy ICMPv6消息类.然后调用构造函数,将有效载荷交给它。
类ICMPv6Unknown
是ICMPv6 (消息)类型不能映射到已知消息类时使用的默认类。这确保了始终有一个合理的构造函数被调用,即使我们不理解在其全部细节中收到的数据包。
发布于 2018-08-28 00:45:30
从较低的层(第二层或第三层)解剖数据包是非常容易的,因为解剖方法有多么不同。
你可以试一试
a = IPv6(nh=58)
cls = a.default_payload_class(p)
pkt = cls(p)
https://stackoverflow.com/questions/52019635
复制相似问题