在显示过滤器中使用 Wireshark 字段出现情况

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

使用 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"
),则会获得奖励积分。

wireshark
1个回答
0
投票

您可以尝试使用 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

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