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

时间:2015-01-15 07:28:51

标签: python scapy

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

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

有关正在添加的协议的更多详细信息:

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

数据包的分层结构如下: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。我期待它被解剖。出于某种原因,我发现它没有得到解剖。我还注意到来自UUT的响应附加了一串字符串' \x02\x00\x04'。我可以识别这些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' |>        

1 个答案:

答案 0 :(得分:1)

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

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

然后,您需要实施hashret()answers。来自Packet的文档字符串解释得很好:

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

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