sr *()方法没有在scapy中解析回答的数据包

问题描述 投票:2回答:1

我扩展了Scapy以支持我的测试新协议。我看到sniff()命令能够在使用bind_layers()将2层拼接在一起后自动剖析数据包。我期待它应该足够好解剖。每当我使用sniff()时,我看到解剖正在发挥作用。

但是,当我使用sr()sr1()函数时,我看到答案包没有被解剖,Scapy将其报告为Raw。我也看到它有一些额外的数据包作为回答的一部分。

有关正在添加的协议的更多细节:

我添加的协议是一个基于tcp的PCEP协议,在端口4189上运行。我创建了一个python套接字并使用StreamSocket()将其转换为scapy超级套接字。我们在scapy的超级插件之上发送这些PCEP消息。

数据包将分层如下:IP()/ TCP()/ PCEP()

connection, pcc_address = pce.accept() <---- This accepts a TCP connection from the client
pcc_client=StreamSocket(connection) <---- Here I convert the python socket into scapy super socket.

示例包:

如果我想发送一个keepalive,这就是我如何制作信息。 pcc_client对象是发送数据包。

>>>>>> pkt.show2()
###[ PCEP common header ]###
  Version= 1L
  Flags= 0L
  Type= PCEPKeepaliveMsg
  Length= 4
>>>  pcc_client.send(pkt) 
>>> pcc_client
<scapy.supersocket.StreamSocket object at 0x115b890>

问题:

我创建一条名为PCInitiate的消息的方式与我发送的方式相同

>>>pcc_client.sr1(pccinit)

a[0][0]下面是我发送的数据包,接收的数据包存储为Raw。我期待它被解剖。出于某种原因,我发现它没有得到解剖。我还注意到一堆字符串' \x02\x00\x04'附加到UUT的响应中。我可以识别这些Keepalive消息的字符串。这些不是对我发送的数据包的响应,但它以某种方式显示在此输出中。如何使sr()功能剖析UUT的响应。我看到hashret()中使用的answers()sndrcv()方法。这些方法有什么用?有人可以帮我查询吗?

>>> a[0][0]
<PCEPCommonHeader  Type=PCInitiate |<PCInitiate  srp_object=<SRP_Object  srpIdNumber=0x10     path_setup_type=<path_setup_type_tlv  |> |> lsp_object=<LSP_Object  plspid=0x0 symbolic_path_name=    <symbolic_path_name_tlv  tlvValue='SERVICE-1418979625354-9F1166-10.126.147.23-10.126.147.1' |> |>     end_points_object=<End_Points_Object  SourceIPv4Address=10.0.0.1 DestinationIPv4Address=10.0.0.6 |>     ero_object=<ERO_Object  sr_eros=[<SR_ERO_SubObject  Fflag=F Mflag=M SID=2260992 |>, <SR_ERO_SubObject      Fflag=F Mflag=M SID=2674688 |>, <SR_ERO_SubObject  Fflag=F Mflag=M SID=3096576 |>] |> |>>
>>> a[0][1]
<Raw  load=' \n\x00x!\x10\x00\x14\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1b\x00\x04\x00\x00\x00\x01 \x10\x00DT\x00`\x91\x00\x11\x007SERVICE-1418979625354-9F1166-10.126.147.23-10.126.147.1\x00\x07\x10\x00\x1c\x05\x08\x10\t\x00"\x80\x00\x05\x08\x10\t\x00(\xd0\x00\x05\x08\x10\t\x00/@\x00 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04 \x02\x00\x04' |>        
python scapy
1个回答
1
投票

您必须告诉StreamSocket它将接收的数据包类型(Raw是默认值)。你可以使用basecls=可选参数来做到这一点:

connection, pcc_address = pce.accept()
pcc_client = StreamSocket(connection, basecls=PCEPCommonHeader)

然后,您需要实现hashret()answers。他们来自Packet的文章解释得很好:

  • hashret()是一种哈希函数,它“返回一个对请求及其答案具有相同值的字符串”。
  • answers()“如果自我是对其他人的回答,那就是真的”。

hashret()不是强制性的,但如果实施得当,它将改善表现。

© www.soinside.com 2019 - 2024. All rights reserved.