添加新数据包scapy:随机位置字段的奇怪错误

时间:2016-04-20 13:02:06

标签: python-2.7 scapy

这是一个奇怪的竞争对手:

ReturnCodeEnum = {
    0x1: "vardiag",
    0x2: "gambit"
}

TransportSizeEnum = {
    0x10: "No error",
    0x11: "Error: ressource not find",
    0x21: "Error: busy"
}


class UNSPECIFIED(Packet):
    name = "UNSPECIFIED"
    fields_desc = {
        ByteEnumField("returncode", 0x00, ReturnCodeEnum),
        ByteEnumField("transportsize", 0x0, TransportSizeEnum),
        FieldLenField("len", None, length_of="datapart"),
        StrLenField("datapart", "", length_from=lambda pkt: pkt.len)
    }


In [21]: a = UNSPECIFIED()

In [24]: a.show()
###[ UNSPECIFIED ]###
  len       = None
  returncode= 0
  datapart  = ''
  transportsize= 0

In [25]: # Reloading the file
In [26]: a = UNSPECIFIED()

In [27]: a.show()
###[ UNSPECIFIED ]###
  datapart  = ''
  transportsize= 0
  len       = None
  returncode= 0

In [28]: a.show2()
###[ UNSPECIFIED ]###
  datapart  = '\x00\x00\x00\x00'
  transportsize= 0
  len       = 0
  returncode= 0

In [29]:
In [30]: a = UNSPECIFIED()

In [33]: a.show()
###[ UNSPECIFIED ]###
  len       = None
  returncode= 0
  datapart  = ''
  transportsize= 0

In [34]: a.show2()
###[ UNSPECIFIED ]###
  len       = 0
  returncode= 0
  datapart  = ''
  transportsize= 0

不尊重数据包字段位置。每次重新加载此源时,字段的位置都在变化。我构建了很多scapy数据包,但这是我第一次遇到这个bug。也许我没有正确使用关联FieldLenField / StrLenField?

1 个答案:

答案 0 :(得分:0)

“每次重新加载此来源时,字段的位置都会发生变化”

我可能错了,但只要您的键/值对保持不变,我认为您所看到的是字典本身无序的结果。来自the docs

  

最好将字典视为一组无序的键:值   对,要求密钥是唯一的(在一个内   字典)

一个简单的测试:

dict_order_test.py

my_dict = {"a":1, "b":2, "c":3}
print (my_dict)

终端输出:

$ python3 dict_order_test.py 
{'b': 2, 'c': 3, 'a': 1}
$ python3 dict_order_test.py 
{'b': 2, 'a': 1, 'c': 3}
$ python3 dict_order_test.py 
{'c': 3, 'a': 1, 'b': 2}
$ python3 dict_order_test.py 
{'c': 3, 'a': 1, 'b': 2}

要稍微修改我上面写的内容,词典有某种顺序,但你不能指望它,而且每次运行脚本时它经常会改变。如果我没记错的话,顺序取决于它们包含哪些类型的数据以及Python如何在内部进行哈希处理。有时订单不会改变,有时它会改变;无论哪种方式,它都是不可靠的,所以如果重要的话,请使用listOrderedDict