簡體   English   中英

使用 scapy 向數據包添加以太網填充

[英]Adding ethernet padding to packet using scapy

我需要編寫一個可以接收 pcap 文件並重寫所有短於 60 字節的數據包的工具,並將以太網填充應用於它們。 這是為了避免在我運行 tcpreplay 時讓 NIC 更改發送的字節數。

當我嘗試這段代碼時,我可以看到 scapy 可以檢測到我文件中某些數據包中的填充字段。

pkts = rdpcap(infile)
for pkt in pkts:
    if len(pkt) = 60:
        print pkt.show()

這將返回帶有填充的數據包的以下輸出。

###[ Ethernet ]###                               
  dst       = fe:ff:20:00:01:00                  
  src       = 00:00:01:00:00:00                  
  type      = 0x800                              
###[ IP ]###                                     
     version   = 4L                              
     ihl       = 5L                              
     tos       = 0x0                             
     len       = 40                              
     id        = 3929                            
     flags     = DF                              
     frag      = 0L                              
     ttl       = 128                             
     proto     = tcp                             
     chksum    = 0xa438                          
     src       = 145.254.160.237                 
     dst       = 216.239.59.99                   
     \options   \                                
###[ TCP ]###                                    
        sport     = 3371                         
        dport     = www                          
        seq       = 918692089                    
        ack       = 778787258                    
        dataofs   = 5L                           
        reserved  = 0L                           
        flags     = A                            
        window    = 8760                         
        chksum    = 0x5902                       
        urgptr    = 0                            
        options   = {}                           
###[ Padding ]###                                
           load      = '\x00\x00\x00\x00\x00\x00'

然后我嘗試更改我的代碼以寫入更短的數據包的填充字段。

pkts = rdpcap(infile)
for pkt in pkts:
    if len(pkt) < 60:
        print pkt.show()
        pad_len = 60 - len(pkt)
        pkt[Padding].load = '\x00' * pad_len
    if len(pkt) == 60:
        print pkt.show()

但是這會返回一個錯誤

Traceback (most recent call last):                                              
  File "rewrite_pcap.py", line 18, in <module>                                  
    pkt[Padding].load = '\x00' * pad_len                                        
  File "/usr/lib/pymodules/python2.7/scapy/packet.py", line 758, in __getitem__ 
    raise IndexError("Layer [%s] not found" % lname)                            
IndexError: Layer [Padding] not found                                           

如何使用 scapy 將一些填充數據附加到數據包的末尾?

所以結果證明這比我預期的要簡單。 我只需要先初始化一個 Padding 對象,然后將它添加到我的數據包中。

pkts = rdpcap(infile)
for pkt in pkts:
    print len(pkt)
    if len(pkt) < 60:
        pad_len = 60 - len(pkt)
        pad = Padding()
        pad.load = '\x00' * pad_len
        pkt = pkt/pad
    if len(pkt) == 60:
        print pkt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM