如何在Wireshark中过滤动态字段名称

问题描述 投票:1回答:1

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

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就是

ServerBlocks

我在DataBlock 3中查找名称的过滤器是...

ServerBlocks.3.name

我遇到的问题是我想对字段应用通配符。我需要这个,因为我不知道名称=='John'

的索引号是什么

我正在寻找的是:

ServerBlocks.*.name == 'John'

每个ServerBlocks帧中的数组的大小可能不同,因此永远不知道要筛选多少索引。 John可能是索引1或索引X,但我只想在其中一个DataBlocks具有名称=='John'

的ServerBlocks上应用显示过滤器

我看过:https://wiki.wireshark.org/DisplayFiltershttps://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html

并没有发现任何可以帮助的东西。

仅供参考:我可以更改Lua定义的ProtoField,因此数组索引不必位于字段的中间,但也可以位于字段的结尾或开头...例如:

ServerBlocks.name.1

1.ServerBlocks.name

但是即使具有这种灵活性,我也不确定如何正确过滤,因此我可以在不知道确切索引的情况下找到name == John的位置

filter lua wireshark
1个回答
0
投票

我将免除字段名称的索引,而只对它们使用通用过滤器。如果ServerBlocks代表all块,则每个块可能都应该有一个可折叠的树,每个块都有一个摘要行,因此您不必扩展该树即可轻松查看其中包含的信息。这样,您可以在任何块中过滤名称。

因此,您将不会像现在那样显示块,而是会有类似的东西:

[+] DataBlocks: 3 blocks

如果您展开该树,则会看到:

[-] DataBlocks: 3 blocks
    [+] DataBlock 1: name1, city1, origin1
    [+] DataBlock 2: name2, city2, origin2
    [+] DataBlock 3: name3, city3, origin3

当然,如果您扩展特定的数据块,那么您将看到上面提供的单个详细信息。

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

因此,如何在仍使用相同过滤器名称的同时为每个块应用枚举?首先,您可能需要提前知道有多少个块,或者可能只是一直循环遍历数据,直到用完字节为止-这一切都取决于协议协议及其编码。在这里,我假设您有一种确定有多少个块的方法,在这种情况下,以下pseudo

代码可能对您有所帮助:
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_len,可以先确定blocks_tree:set_len(somelen)多长时间,然后再使用。我还假设名称,城市和起源都是字符串,并且您知道如何确定每个字符串的长度(即,namelen,citylen和originlen)。

请参阅Wireshark Lua和相关的Wiki页面以获取更多信息,包括一些示例脚本,这些脚本可能会或可能不会对您有用。并且不要忘记Wireshark’s Lua API Reference Manual

© www.soinside.com 2019 - 2024. All rights reserved.