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