[英]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.