1

我正在尝试构建 LDPHello 数据包,但我无法使用 scapy 添加可选参数,例如 IPv4 传输层。

我已经这样做了:

ip = IP(src=src_ipv4, dst= '224.0.0.2', proto=17, ttl=1)
udp = UDP(sport=646, dport=646)
hello = LDPHello(params=[180,0,0,0,0,"2.2.2.2",0])
packet = ip / udp / hello

这给了我这样的输出:

###[ IP ]### 
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 54
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 1
  proto     = udp
  chksum    = 0x6c44
  src       = 10.110.99.2
  dst       = 224.0.0.2
  \options   \
###[ UDP ]### 
     sport     = 646
     dport     = 646
     len       = 34
     chksum    = 0xa34c
###[ LDP ]### 
        version   = 1
        len       = 22
        id        = 2.2.2.2
        space     = 0
###[ LDPHello ]### 
           u         = 0
           type      = 256
           len       = 12
           id        = 0
           params    = [180, 0, 0]


来自 scapy 的 LDPHello 定义:

class LDPHello(_LDP_Packet):
    name = "LDPHello"
    fields_desc = [BitField("u", 0, 1),
                   BitField("type", 0x0100, 15),
                   ShortField("len", None),
                   IntField("id", 0),
                   CommonHelloTLVField("params", [180, 0, 0])]

CommonHelloTLVField没有我们可以添加可选参数(如 IPv4 传输地址)的字段之后。

而通过 RFC,整个数据结构如下:


    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |0|   Hello (0x0100)            |      Message Length           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Message ID                                |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Common Hello Parameters TLV               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Optional Parameters                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

我不知道如何获得如下输出:包含 IPv4 传输层

4

0 回答 0