我正在尝试在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
});
}
}
但是后来我陷入困境,因为我需要使用该字段的实际值并可能在循环中生成其他字段。
这怎么办?
答案 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
... PacketListField
。与FielfListField
相比,它具有更多选项。无论如何,请看看https://scapy.readthedocs.io/en/latest/build_dissect.html#fields
和help(...)
(如果需要:-)