我想使用Scapy来剖析由以下C结构定义的数据包:
struct {
int type;
union {
int int_value;
char byte_value;
} data;
} MyPacket;
消息由type
字段组成,该字段指定数据字段的类型:0和data
是int
(编码为4个字节),1和它是char
(在一个字节上编码)。
重要的是要注意联合的大小等于其最大成员的大小。
在我的情况下,即使type
为1而data
为char
,数据的大小也始终为4个字节。
以下是我创建的代码:
from scapy.all import Packet, IntEnumField, IntField, ByteField, ConditionalField
types = {
0:"int",
1:"byte"
}
class MyPacket(Packet):
fields_desc = [
# Type indicator
IntEnumField("type", 0, types),
# Union
ConditionalField(IntField("int_value", 0), lambda pkt: pkt.type==0),
ConditionalField(ByteField("byte_value",0), lambda pkt: pkt.type==1)
]
if __name__ == "__main__":
print "My packet with type int:"
p1 = MyPacket("\x00\x00\x00\x00" # type = int
"\x00\x00\x00\x10" # int_value = 16
)
p1.show()
print "\nMy packet with type char:"
p2 = MyPacket("\x00\x00\x00\x01" # type = byte
"\x10" # byte_value = 16
"\x00\x00\x00" # Unused.
)
p2.show()
输出:
My packet with type int:
###[ MyPacket ]###
type = int
int_value = 16
My packet with type char:
###[ MyPacket ]###
type = byte
byte_value= 16
###[ Raw ]###
load = '\x00\x00\x00'
正如您所看到的,在data
为char
的情况下,联合的某些数据未被消耗。
如果另一个字段跟随数据字段,这可能很麻烦。所以我的问题是:
有没有办法使用Scapy消耗C联合的所有字节?