构建 Wireshark 解剖器以使过滤更容易

Structuring Wireshark dissector to make filtering easier

我正在编写我的第一个 Wireshark 解析器。我在 Lua 中使用 this as an example 编写它。我的通信协议在响应 header 中嵌入了一个命令 ID,后跟根据命令 ID 不同的 well-defined 有效负载。到目前为止,我一直在构造 ProtoFields,以便字段的缩写名称(过滤器中使用的字符串)遵循这样的命名约定

proto_name.command_name.field_name

一些命令具有相似的字段,如下例所示

myproto.cmd_update.updateId
myproto.cmd_update_ack.updateId

其中,根据协议,必须使用具有相同 updateId 负载的 update_ack 命令确认 update 命令。理想情况下,我想创建一个 wireshark 过滤器,这样我就可以看到与 updateId 字段有关的所有数据包。我尝试创建一个像

这样的过滤器
myproto.*.updateId == 0x1234

但这似乎是无效的 wireshark 过滤器语法。我不想像

这样明确地设置过滤器
myproto.cmd_update.updateId == 0x1234 or myproto.cmd_update_ack.updateId == 0x1234

因为在我的实际协议中有更多带有 similar/related 字段的命令。有我可以使用的过滤器语法吗?或者,我是否应该以不同的方式构建解剖器的 ProtoField 缩写?

过滤器行似乎没有通配符语法,所以我最终在解析器中解决了这个问题。除了 myproto.*.updateId 字段之外,我还添加了另一个名为 myproto.updateId 的字段(注意中间缺少通配符)。它的值设置为与完整字段名称相同的值,这意味着我现在只有一个字段名称可供搜索。我还将此字段设置为 hidden = true 以将其隐藏起来。

有点乱,但给了我想要的东西。

您可以尝试使用 Wireshark display filter macro