Filter 如何在动态字段名上过滤Wireshark

Filter 如何在动态字段名上过滤Wireshark,filter,lua,wireshark,Filter,Lua,Wireshark,我有一个协议,其中数据有效负载位于结构化数组中。 例如: DataBlock 1: name: xxx city: xxx origin: xxx DataBlock 2: name: xxx city: xxx origin: xxx DataBlock 3: name: xxx city: xxx origin: xxx 这都在一个名为ServerBlocks的协议中的一个帧内 用于查找所有服务器块的wireshark筛选器只是 Ser

我有一个协议,其中数据有效负载位于结构化数组中。 例如:

DataBlock 1:
   name: xxx
   city: xxx
   origin: xxx
DataBlock 2:
   name: xxx
   city: xxx
   origin: xxx
DataBlock 3:
   name: xxx
   city: xxx
   origin: xxx
这都在一个名为ServerBlocks的协议中的一个帧内

用于查找所有服务器块的wireshark筛选器只是

ServerBlocks
在数据块3中查找名称的筛选器是

ServerBlocks.3.name
我遇到的问题是我想对字段应用通配符。我需要这个,因为我不知道name=='John'的索引号是什么

我要找的是:

ServerBlocks.*.name == 'John'
每个ServerBlocks框架中的数组可能大小不同,因此我永远不知道有多少索引可供筛选。John可以是索引1或索引X,但我只想在其中一个数据块的名称为“John”的ServerBlock上应用一个显示筛选器

我查过: 及

而且还没有找到任何有帮助的

供参考: 我能够改变Lua定义的PrimeField,所以数组索引不需要在字段的中间,但是它可以在结尾或开始。例如:

DataBlock 1:
   name: xxx
   city: xxx
   origin: xxx
DataBlock 2:
   name: xxx
   city: xxx
   origin: xxx
DataBlock 3:
   name: xxx
   city: xxx
   origin: xxx
ServerBlocks.name.1


但是,即使有这种灵活性,我也不确定如何正确过滤,这样我就可以在不知道确切索引的情况下找到name==John的位置。我将省去字段名的索引,而只使用一个通用的过滤器。如果
ServerBlocks
表示所有块,那么每个块都应该有一个可折叠的树,每个块都有一个摘要行,这样就不必展开树来轻松查看它包含的信息。通过这种方式,可以在任何块中筛选名称

因此,您不必像以前那样显示块,而是可以使用如下内容:

[+] DataBlocks: 3 blocks
如果你展开这棵树,你会看到:

[-] DataBlocks: 3 blocks
    [+] DataBlock 1: name1, city1, origin1
    [+] DataBlock 2: name2, city2, origin2
    [+] DataBlock 3: name3, city3, origin3
当然,如果您展开一个特定的数据块,那么您将看到上面提供的各个细节

然后,对特定名称进行过滤将使用一个过滤器,例如
myproto.datablock.datablock.name==foo
。这将匹配名称为foo的所有数据包,而不管它位于哪个数据块中

那么,在仍然使用相同的过滤器名称的情况下,如何为每个块应用枚举?首先,您需要提前知道有多少个块,或者您只需在数据中循环,直到字节用完—这一切都取决于您的协议及其编码。在这里,我假设您有一种方法来确定有多少块,在这种情况下,以下代码可能对您有所帮助:

blocks_tree = myproto_tree:add(datablocks, tvbuf(offset, datablocks_len))

for i = 1, numblocks do
    datablock_len = TODO
    block_tree = blocks_tree:add(datablock, tvbuf(offset, datablock_len):set_text(
        string.format("DataBlock %d: ", i)

    block_tree:add(datablock_name, tvbuf(offset, namelen))
    block_tree:append_text(tvbuf(offset, namelen):string() .. ", ")

    block_tree:add(datablock_city, tvbuf(offset + namelen, citylen))
    block_tree:append_text(tvbuf(offset + namelen, citylen):string() .. ", ")

    block_tree:add(datablock_origin, tvbuf(offset + namelen + citylen, originlen))
    block_tree:append_text(tvbuf(offset + namelen + citylen, originlen):string())

    offset = offset + namelen + citylen + originlen
end
如果您事先不知道
datablocks\u len
,您可以稍后使用
blocks\u tree:set\u len(somelen)
,一旦您确定了它的长度。我还假设name、city和origin都是字符串,并且您知道如何确定每个字符串的长度(即namelen、citylen和originlen)


有关更多信息,请参阅Wireshark和相关wiki页面,包括一些可能对您有用或不有用的示例脚本。不要忘记。

使用相同的过滤器名称是我解决问题的方法。我可以做循环,并确定阵列的大小没有问题。我没有意识到我可以为多个protofield使用相同的过滤器名称。谢谢