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使用相同的过滤器名称。谢谢