[英]How to add bits to the application layer when building a packet with 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.