我想使用Python在Python程序中检查/分析ICMPv6路由器通告(RA),在该程序中,我得到(不是这样)原始数据包数据如下:
import socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_ICMPV6)
p, addr = sock.recvfrom(4096)
当收到ICMPv6数据包时,数据包p将仅包含(!)ICMPv6部分本身,但不包含任何其他外部元素,因此没有IPv6标头,以太网标头,...
如何从我的原始数据包数据创建正确的Scapy ICMPv6派生数据包类? _ICMPv6
似乎只是一个后备课程。是否有某种工厂可以从中获取正确的子类(例如ICMPv6ND_RA
)?
答案 0 :(得分:0)
从解剖角度来说,从较低层(第二层或第三层)解剖数据包比较容易,因为解剖方法可能有很大差异。
您可以尝试破解
a = IPv6(nh=58)
cls = a.default_payload_class(p)
pkt = cls(p)
答案 1 :(得分:0)
在阅读了Scapy的inet6.py的源代码之后,我注意到,比Cukic0d的很好的回答,还有一种更“直接”的方法(但不一定是“更干净的”)来获取正确的Scapy ICMPv6消息对象:有一种不需要“伪”外部IPv6对象外壳的替代方式的感觉(尽管我非常感谢Cukic0d的回答,因为它将是将发送方地址转储到其中的好地方!):
from scapy.layers.inet6 import *
icmpv6_packet = icmp6typescls.get(p[0], ICMPv6Unknown)(p)
这使用icmp6typescls
字典将ICMPv6(消息)类型(从套接字返回的数据包的第一个八位字节中)映射到其对应的Scapy ICMPv6消息类……然后调用构造函数,将有效负载移交给它。
类ICMPv6Unknown
是Scapy在无法将ICMPv6(消息)类型映射到已知消息类时使用的默认类。这样可以确保始终有一个明智的构造函数被调用,即使我们不了解收到的数据包的全部详细信息。