Scapy:如何解剖C联盟?

时间:2016-02-22 11:10:53

标签: python c scapy

我想使用Scapy来剖析由以下C结构定义的数据包:

struct {
    int type;
    union {
        int int_value;
        char byte_value;
    } data;
} MyPacket;

消息由type字段组成,该字段指定数据字段的类型:0和dataint(编码为4个字节),1和它是char(在一个字节上编码)。

重要的是要注意联合的大小等于其最大成员的大小。 在我的情况下,即使type为1而datachar,数据的大小也始终为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'

正如您所看到的,在datachar的情况下,联合的某些数据未被消耗。 如果另一个字段跟随数据字段,这可能很麻烦。所以我的问题是: 有没有办法使用Scapy消耗C联合的所有字节?

0 个答案:

没有答案