python – 使用短于8位的PacketField构建scapy数据包

我正在尝试使用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元组和其余的有效负载,即空字符串. I.e.:\u0026gt;\u0026gt;\u0026gt; TypeError:只能将元组(不是“str”)连接到元组

有没有办法避免将位字段捆绑成完整的字节?

解决方法:

我猜数据包始终是字节对齐的,所以你可能不得不以某种方式使用某个字段,例如:

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"),
  ] 
上一篇:使用Scapy构建探测请求请求


下一篇:Scapy在Python脚本中