如何从套接字(AF_INET6,SOCK_RAW,IPPROTO_ICMPv6)的原始字节串创建ICMPv6 scapy对象?

时间:2018-08-25 17:27:47

标签: python-3.x ipv6 scapy icmpv6

我想使用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)?

2 个答案:

答案 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(消息)类型映射到已知消息类时使用的默认类。这样可以确保始终有一个明智的构造函数被调用,即使我们不了解收到的数据包的全部详细信息。