使用 Wireshark 4.2.2,我可以创建一个自定义显示列,显示某个字段出现的值。我希望能够执行类似的操作并在显示过滤器中使用字段出现,但我找不到任何有关如何执行此操作的参考。
具体来说,我正在查看一个捕获文件,其中包含具有 SDP 正文的 SIP 消息。在SDP中,定义了每个媒体流有多个媒体线。我想创建一个显示过滤器,当第一个媒体流支持某种格式而第二个媒体流不支持该格式时显示。
我可以从
sdp.media
字段创建 2 个自定义显示列,其中一列的字段出现次数设置为 1,另一列的字段出现次数设置为 2; Wireshark 表将正确显示两个媒体流,每列 1 个。我可以根据我的情况手动检查这些,但更愿意创建一个显示过滤器来帮助检查。
我尝试过类似
sdp.media[1] contains "0" && !sdp.media[2] contains "0"
或sdp.media#1 contains "0" && !sdp.media#2 contains "0"
之类的东西。但是,我知道切片运算符 ([1]
) 是在字节数组上操作而不是字段出现,而层运算符 (#1
) 是在网络层上操作而不是在字段出现上操作。
这对于 Wireshark 是否可行,还是我必须执行手动检查?如果我可以使用
sdp.media.format
字段而不仅仅是 sdp.media
(例如 sdp.media[1].format contains "PCMU" && !sdp.media[2].format contains "PCMU"
),则会获得奖励积分。
您可以尝试使用 Lua 后解析器来实现您的目标。例如:
local sdp_post = Proto("sdp_post", "SDP post-dissector")
local sdp_media_formats = {
[1] = ProtoField.string("sdp_post.media.format.1", "Media Format 1"),
[2] = ProtoField.string("sdp_post.media.format.2", "Media Format 2"),
[3] = ProtoField.string("sdp_post.media.format.3", "Media Format 3"),
[4] = ProtoField.string("sdp_post.media.format.4", "Media Format 4"),
[5] = ProtoField.string("sdp_post.media.format.5", "Media Format 5"),
[6] = ProtoField.string("sdp_post.media.format.6", "Media Format 6"),
[7] = ProtoField.string("sdp_post.media.format.7", "Media Format 7"),
[8] = ProtoField.string("sdp_post.media.format.8", "Media Format 8"),
[9] = ProtoField.string("sdp_post.media.format.9", "Media Format 9"),
[10] = ProtoField.string("sdp_post.media.format.10", "Media Format 10")
}
sdp_post.fields = sdp_media_formats
local sdp_media_format_f = Field.new("sdp.media.format")
function sdp_post.dissector(tvb, pinfo, tree)
local sdp_media_format = {sdp_media_format_f()}
if sdp_media_format then
local sdp_post_tree = tree:add(sdp_post, "SDP Postdissector: " .. #sdp_media_format .. " Media Formats")
for i, v in pairs(sdp_media_format) do
if sdp_media_formats[i] then
sdp_post_tree:add(sdp_media_formats[i], v.value)
else
sdp_post_tree:append_text(" (Only showing the first " .. i-1 .. ")")
break
end
end
end
end
register_postdissector(sdp_post)
将其保存到诸如
sdp-postdissector.lua
之类的文件中,并将其放置在“个人Lua插件”目录中,您可以从“Wireshark:帮助->关于Wireshark->文件夹”中找到该目录。完成此操作后,重新启动 Wireshark 或使用 “分析 -> 重新加载 Lua 插件 (Ctrl+Shift+L)” 来加载它。现在您应该能够使用 sdp_post.media.format.i
后解析器显示过滤器来实现您的目标。例如:sdp_post.media.format.1 contains "PCMA"
将在捕获文件中显示数据包 1 和 11。
注意:如果您想使用除
sdp.media.format
之外的其他sdp字段,那么您可能需要参考我对此相关问题的回答:How to add an array of fields as a ProtoField in Lua Dissector