Python Scapy-如何剖析以太网拖车字段

Python Scapy-如何剖析以太网拖车字段,python,network-programming,ethernet,scapy,f5,Python,Network Programming,Ethernet,Scapy,F5,我使用的是F5 Networks大IP产品,它添加了一个定制的Ethernet II拖车框架,用于调试。我正在尝试与Scapy绑定一个新的层为这个拖车,但我不能这样做 我可以在Padding字段中看到感兴趣的有效负载,但使用bind_layers无法正确解析所需的Padding部分 class MyEthTrailer(Packet): name = "Ethernet Trailer" fields_desc = [ ####Fields Mapping Section ]

我使用的是F5 Networks大IP产品,它添加了一个定制的Ethernet II拖车框架,用于调试。我正在尝试与Scapy绑定一个新的层为这个拖车,但我不能这样做

我可以在Padding字段中看到感兴趣的有效负载,但使用bind_layers无法正确解析所需的Padding部分

class MyEthTrailer(Packet):
    name = "Ethernet Trailer"
    fields_desc = [ ####Fields Mapping Section ]
    def dissect(self, s):
        self.payl,self.pad = self.extract_padding(s)
        s = self.do_dissect(self.pad)
我考虑的一个解决方案是创建一个新的以太网替换类(或重载),然后我可以引用典型的以太网负载和我的新拖车。但我不是一个超级Python/scapy程序员,我也不确定这是否是最好的选择

这就是Scapy在我应用bind_层(TCP,MyEthTrailer)后当前映射我的数据包的方式。我应该解析的信息在Padding类中

<Ether  dst=00:00:00:00:00:00 src=00:00:00:00:00:01 type=0x8100 |<Dot1Q  prio=0L id=0L vlan=01L type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=67 id=1 flags=DF frag=0L ttl=255 proto=tcp chksum=0x01 src=10.0.0.1 dst=10.0.1.1 options=[] |<TCP  sport=1111 dport=https seq=1 ack=1 dataofs=5L reserved=0L flags=PA window=4380 chksum=0xb718 urgptr=0 options=[] |<MyEthTrailer  |<Padding  load='\xPayload of MyEtherTrailer' |>>>>>>
然而,bind_layers方法似乎无法自动工作,而且这无法处理更复杂的数据包,因为它将TCP填充与MyEthTrailer负载混合在一起

[更新-2]

我让它部分工作,但每个包都需要正确浇铸,然后我可以读取拖车负载并解码它。例如,如果一个数据包是TCP/DNS/MyEthTrailer,这将起作用。如果我不知道它是DNS,并且没有正确设置,它仍然混合在TCP负载和填充中


非常感谢您的帮助。

我可以通过重载新自定义类MyEthTrailer的pre_dissect函数来实现这一点。我尝试解析最后一层的有效负载,它有填充,并验证它是否有正确的长度

这需要处理两件事:

第1部分解剖部分
class MyEthTrailer(Packet):
    def pre_dissect(self,s):
        verify_if_payload_is_mine_and_assign_fields()
第2部分手动力有效载荷解码
_debug=True

if re.match(r'F5\-Pseudo-\pkt.+tcpdump',str(packets[0][Raw])):
        if re.match(r'.+CMD\:.+\-s0.+VER\:.+',str(packets[0][Raw])): has_F5_trailer=True
        if re.match(r'.+CMD\:.+\:nnn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=3
        elif re.match(r'.+CMD\:.+\:nn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=2
        elif re.match(r'.+CMD\:.+\:n.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=1
        else:
            if _debug: print "No F5 EthTrailer F5_Noise_level visible from packets[0]"
    if has_F5_trailer:
        #Skip the F5 first packet, which only contains the info. 
        for pk in packets[1:]:
            try:
                if isinstance(pk.lastlayer(),Padding):
                    pk.lastlayer().underlayer.decode_payload_as(MyEthTrailer)
            except:
                #Errorhandling

如果有人感兴趣,我会将整个解决方案发布到Github,并在此处更新。

F5插件源代码在此处:。希望这将帮助你隔离。我希望看到一个GitHub链接请-因为我有一个问题,迫使自定义层被解码。我只是在尝试将数据包[TCP]解码为(MyEthTrailer)实现。
_debug=True

if re.match(r'F5\-Pseudo-\pkt.+tcpdump',str(packets[0][Raw])):
        if re.match(r'.+CMD\:.+\-s0.+VER\:.+',str(packets[0][Raw])): has_F5_trailer=True
        if re.match(r'.+CMD\:.+\:nnn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=3
        elif re.match(r'.+CMD\:.+\:nn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=2
        elif re.match(r'.+CMD\:.+\:n.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=1
        else:
            if _debug: print "No F5 EthTrailer F5_Noise_level visible from packets[0]"
    if has_F5_trailer:
        #Skip the F5 first packet, which only contains the info. 
        for pk in packets[1:]:
            try:
                if isinstance(pk.lastlayer(),Padding):
                    pk.lastlayer().underlayer.decode_payload_as(MyEthTrailer)
            except:
                #Errorhandling