Python scapy中的可变长度填充
基本上,我希望能够使用下面的类来构建我的协议,如果层没有字节对齐,则添加填充以使其字节对齐 一般示例:Python scapy中的可变长度填充,python,python-2.7,protocols,scapy,Python,Python 2.7,Protocols,Scapy,基本上,我希望能够使用下面的类来构建我的协议,如果层没有字节对齐,则添加填充以使其字节对齐 一般示例: class Test(Packet): fields_desc = [ BitField("field1", 0, 2), BitField("field2", 0, 2), ConditionalField(BitField("field3", 0, 1), lambda pkt:pkt.field1 == 1),
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>, ]
这不是一个很好的解决方案,因为协议将变得更加复杂,并且包含更多的“条件字段”
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
导入位字符串
从scapy.all导入数据包
类填充数据包(数据包):
def预分解(自身):
“”“预剖析将修复负载层的填充问题”“”
如果类型为元组:
s=bitstring.BitArray(bytes=s[0])感谢您的分享,但这并不是我想要的,我已经更新了我的问题,希望能更清楚一点。等等,您不是在进行字节对齐(Byte=8bit),而是进行4位对齐,对吗?因此层(数据包)将进行字节对齐(可被8位w/填充整除)但其中的字段根本没有对齐。(字段可以是任意宽度:17位、19位等)。也许有一种方法可以在scapy的“构建”函数中实现这一点?您可能希望使用长度为4的FlagsField:/
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