2016-03-28 53 views
5

我正在使用F5網絡Big-IP產品,它們爲調試目的而附加了自定義以太網II預告片幀。我試圖與Scapy綁定這個預告片的新圖層,但我無法這樣做。Scapy - 如何解剖以太網拖車字段

我可以在填充字段中看到感興趣的有效載荷,但是使用bind_layers不會執行所需填充部分的適當解析。

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程序員,我不確定這是否是最好的選擇。

這是我應用bind_layers(TCP,MyEthTrailer)之後Scapy如何映射數據包的方式。我應該解析的信息是在填充類

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

[UPDATE-1]

我可以通過調用的力進行解碼的TCP SYN分組:

packet[TCP].decode_payload_as(MyEthTrailer) 

然而,bind_layers方法,似乎不能自動工作,並且這對於更復雜的數據包不起作用,因爲它將TCP Padding與MyEthTrailer負載混合在一起。

[更新2]

我得到它的工作的一部分,但每個數據包需要正確地鑄造,然後我可以讀取拖車的有效載荷,並對其進行解碼。例如,如果一個數據包是TCP/DNS/MyEthTrailer,這將起作用。如果我不知道它是DNS,但它沒有正確設置,它仍然在TCP有效載荷和填充中混合。

您的幫助表示讚賞。

+0

F5插件源代碼位於:https://devcentral.f5.com/wiki/AdvDesignConfig.F5WiresharkPlugin.ashx。希望這會幫助你隔離。 –

回答

0

我能夠通過重載我的新自定義類MyEthTrailer的pre_dissect函數來完成它。我嘗試解析具有Padding的最後一層的有效載荷,並驗證它是否具有正確的長度。

這是兩件事情處理:

PART 1個解剖部分
class MyEthTrailer(Packet): 
    def pre_dissect(self,s): 
     verify_if_payload_is_mine_and_assign_fields() 
PART 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上,並更新在這裏,如果有人有興趣。

+0

我希望看到一個GitHub鏈接 - 因爲我有一個問題迫使自定義圖層被解碼。我只是想試試你的包[TCP] .decode_payload_as(MyEthTrailer)的實現。 –