gpt4 book ai didi

python - sr*() 方法不在 scapy 中剖析回答的数据包

转载 作者:太空宇宙 更新时间:2023-11-04 05:55:39 25 4
gpt4 key购买 nike

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

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

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

我添加的协议(protocol)是基于 tcp 的 PCEP 协议(protocol),在端口 4189 上运行。我创建了一个 python 套接字并使用 StreamSocket() 将其转换为 scapy supersocket。我们在 scapy 的 super 套接字之上发送这些 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.

示例数据包:

如果我想发送保活消息,这就是我制作消息的方式。 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 的响应。我看到 sndrcv() 中使用了 hashret()answers() 方法。这些方法有什么用。有人可以帮我解决问题吗?

>>> 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' |>

最佳答案

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

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

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

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

hashret() 不是强制性的,但如果实现得当,它将提高性能。

关于python - sr*() 方法不在 scapy 中剖析回答的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27958567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com