Scapy sr()与自定义层

2024-10-01 22:35:07 发布

您现在位置:Python中文网/ 问答频道 /正文

当使用sr()或srp()函数时-Scapy如何知道收到的数据包是我发送的数据包的应答?在

我写了一个模仿BACNet的自定义协议。我可以向BACNet设备发送WHO'u IS数据包,设备用I\u AM数据包进行应答,由于层绑定,该数据包被正确分解,但sr函数不将其识别为应答。我怎么接受这些答案?在

更新: 这就是我的图层类的样子。我认为answers()方法看起来不错,但仍然不起作用。在实现answers()方法时,我是否有什么误解? 在我的理解中,self指的是层本身的类,other是所讨论的接收包。因此,为了将有效负载传递到下一个更高的层,我传递other.payload并使用下一个更高层的类调用answers()方法。 这些层堆叠成Ether/IP/UDP/BVLC/NPDU/APDU。在

class BVLC(Packet):

    name = "BVLC"
    fields_desc = [
       # many fields
                   ]

    def post_build(self, pkt, pay):
        if self.length == None:                
            pkt = pkt[0:2] + struct.pack('!H', len(pay)+len(pkt)) + pkt[4:]  
        return pkt+pay

    def answers(self, other):
        if not isinstance(other,BVLC):
            return 0
        else:
            return NPDU.answers(other.payload)


class NPDU(Packet):

    name = "NPDU"
    fields_desc = [ 
        # again, many fields
                   ]

    def answers(self, other):
        if not isinstance(other,NPDU):
            return 0
        else:
            return APDU.answers(other.payload)

class APDU(Packet):

    name = "APDU"
    fields_desc = [
          # many fields and the only relevant field in this case
            ConditionalField(
                ByteEnumField(
                    "serviceChoice", None, APDU_Service_Unconfirmed.revDict()),
                    lambda pkt: pkt.pduType == APDU_Type.CONFIRMED_SERVICE_REQUEST or
                                pkt.pduType == APDU_Type.UNCONFIRMED_SERVICE_REQUEST), 
                   ]

    def answers(self, other):
        if not isinstance(other,APDU):
            return 0
        else:
            if self.serviceChoice == APDU_Service_Unconfirmed.WHO_IS and\
               other.serviceChoice == APDU_Service_Unconfirmed.I_AM:
                return 1
        return 0

Tags: 方法selffieldsreturnifdef数据包class
1条回答
网友
1楼 · 发布于 2024-10-01 22:35:07

Scapysr只对发送的每个包调用recv_packet.answers(sent_packet)。 因此,您必须为您的层实现def answers(),请参见:

def answers(self, other):
    """DEV: true if self is an answer from other"""
    if other.__class__ == self.__class__:
        return self.payload.answers(other.payload)
    return 0

以下是原始TCP层的摘录:

^{pr2}$

相关问题 更多 >

    热门问题