簡體   English   中英

scapy中的可變長度填充

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

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