如何使用Scapy定义具有可变字段数量的数据包?

时间:2019-06-17 16:10:55

标签: scapy

我正在尝试在Scapy中定义某种类型的数据包。 数据包的所有字段都具有相同的类型,除了第一个字段为ByteField,并且字段的数目将由该ByteField字段的值确定。例如,如果值为8,则数据包中总共将有9个字段。

我看过Scapy文档,但在那里找不到任何相关内容。 问题是我必须在数据包本身的定义内进行操作,而且我认为“ fields_desc”结构中不接受循环和变量。

它显然开始于某事:

module.exports = Database;
function Database() {
    this.db;
    this.videos;
    this.playlists;

    this.init = function () {
        const loki = require("lokijs");
        const lfsa = require('../../node_modules/lokijs/src/loki-fs-structured-adapter.js');

        var adapter = new lfsa();
        this.db = new loki(`${localPath}db.json`, { adapter: adapter, autoload: true, autosave: true, autosaveInterval: 4000 });
        this.db.loadDatabase({}, function (result) {
            console.log(result); // This is null
            alert(this.db); // This is undefined
            alert(this.db.getCollection("SampleCollection")); // Uncaught TypeError: Cannot read property 'getCollection' of undefined
        });
    }
}

但是后来我陷入困境,因为我需要使用该字段的实际值并可能在循环中生成其他字段。

这怎么办?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用ConditionalField

从Scapy文档中:

ConditionalField(fld, cond)
        # Wrapper to make field 'fld' only appear if
        # function 'cond' evals to True, e.g.
        # ConditionalField(XShortField("chksum",None),lambda pkt:pkt.chksumpresent==1)

所以您可以做类似的事情-

ConditionalField(IntField('Field_1', 0), lambda pkt: pkt.NumOfFields >= 1)

我在this question的代码中以类似的上下文使用了它,也许对您有用。

答案 1 :(得分:1)

您有几种选择:

  • 如果字段具有相同的类型:FieldListField具有length_from属性。
  • 创建您自己的自定义字段:使用i2m ...
  • 对大小为1的数据包使用PacketListField。与FielfListField相比,它具有更多选项。

无论如何,请看看https://scapy.readthedocs.io/en/latest/build_dissect.html#fieldshelp(...)(如果需要:-)