[英]Variable length padding in scapy
基本上我希望能夠使用下面的類構建我的協議,如果該層不是字節對齊的,請添加填充以使其字節對齊。
通用示例:
class Test(Packet):
fields_desc = [ BitField("field1", 0, 2),
BitField("field2", 0, 2),
ConditionalField(BitField("field3", 0, 1), lambda pkt:pkt.field1 == 1),
<variable_length_bitfield_padding>, ]
我希望上面的例子能夠構建,任何建議將不勝感激。
我目前的解決方法是:
class Test(Packet):
fields_desc = [ BitField("field1", 0, 2),
BitField("field2", 0, 2),
ConditionalField(BitField("field3", 0, 1), lambda pkt:pkt.field1 == 1),
ConditionalField(BitField("padAlign", 0, 3), lambda pkt:pkt.field1 == 1)),
ConditionalField(BitField("padAlign", 0, 4), lambda pkt:pkt.field1 == 0)),]
這不是一個很好的解決方法,因為協議會變得更加復雜並且包含更多的“ConditionalField”。
PadField 並不是我真正想要的(我不認為),更多的是 PadLayer:padAlign = len(layer)%8
您可以使用PadField
help(PadField)
Help on class PadField in module scapy.fields:
class PadField(builtins.object)
| Add bytes after the proxified field so that it ends at the specified
| alignment from its beginning
|
它將填充特定的字段,例如
fields_desc = [ BitField("field1", 0, 2),
BitField("field2", 0, 2),
PadField(
ConditionalField(BitField("field3", 0, 1), lambda pkt:pkt.field1 == 1),
1
)
]
遇到類似的問題。 Scapy 對非字節對齊的自定義數據包不滿意。 我的傳入原始數據也被填充。 這是我想出的解決方案。 仔細檢查這是否適用於您的協議。 特別是位移位可能會有所不同。 只需使用PaddedPacket
類作為基類而不是原始Packet
。
import bitstring
from scapy.all import Packet
class PaddedPacket(Packet):
def pre_dissect(self, s):
""" Pre dissect will fix padding problems for payload layer """
if type(s) is tuple:
s = bitstring.BitArray(bytes=s[0]) << s[1]
s = s.bytes
return s
def extract_padding(self, s):
"""
Extract current layer's padding.
:param str s: the current layer
:return: a couple of strings (actual layer, padding)
"""
if type(s) is tuple:
# Reconstruct padding
pad = bitstring.BitArray(bytes=s[0]) << s[1]
pad = pad.bytes
return None, pad
else:
return s, None
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.