簡體   English   中英

使用短於8位的PacketField構建scapy數據包

[英]Building scapy packets with PacketFields shorter than 8 bits

我正在嘗試使用scapy添加一個新協議,並且我在構建存儲其他BitEnumField“數據包”的數據包時遇到了困難,這些數據包長度不超過一個字節。 我想知道是否有一種解決方法使它工作(沒有將數據包捆綁到完整的字節字段)。 這是一個例子:

from scapy.packet import Packet
from scapy.fields import *    

class Status(Packet):
    name = '4 bit status'

    fields_desc = [
        BitEnumField('a', 0, 1, {0:'Disabled', 1:'Enabled'}),
        BitEnumField('b', 0, 1, {0:'Disabled', 1:'Active'}),
        BitEnumField('c', 0, 1, {0:'Disabled', 1:'Active'}),
        BitEnumField('d', 0, 1, {0:'Disabled', 1:'Active'}),
        ]

    #this is added for debug purposes only
    def post_build(self, pkt,pay):
        print "pkt:", pkt, "type:", type(pkt)
        return pkt+pay

現在我可以理解為什么Status().show2()失敗, pkt只有4位長。 但是這個也死了(我猜因為每個數據包是獨立形成的):

class TotalStatus(Packet):
    name = "8 bit status"

    fields_desc = [
        PacketField('axis0', Status(), Status),
        PacketField('axis1', Status(), Status),
        ]

TotalStatus().show2()為您提供冗長的回溯,以self.post_build()結束,無法cat pkt元組和其余的有效負載,即空字符串。 即: >>> TypeError: can only concatenate tuple (not "str") to tuple

有沒有辦法避免將位字段捆綁成完整的字節?

我猜一個數據包總是字節對齊的,所以你可能不得不以某種方式使用一個字段,例如:

class StatusField(FlagsField):
  name = '4 bit status'
  def __init__(self, name):
    FlagsField.__init__(self, name, 0, 4, ["a", "b", "c", "d"])

class TotalStatus(Packet):
  name = "8 bit status"
  fields_desc = [
    StatusField("axis0"),
    StatusField("axis1"),
  ] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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