0

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

4

2 回答 2

0

在 scapy 中,从较低层(第二层或第三层)剖析数据包通常更容易,因为剖析方法可能有多么不同。

你可以试试hacky

a = IPv6(nh=58)
cls = a.default_payload_class(p)
pkt = cls(p)
于 2018-08-28T00:45:30.537 回答
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当 ICMPv6(消息)类型无法映射到已知消息类时,该类是 Scapy 使用的默认类。这确保了总有一个合理的构造函数被调用,即使我们不了解接收到的数据包的全部细节。

于 2018-08-28T17:00:40.037 回答