如何在 Wireshark Lua 分析器中处理位字段?

我需要在 Wireshark Lua 分析器中分析一个位映射的八位字节。该字节的格式如下:

bit 0:     拼接 (0=不拼接,1=拼接)
bits 1..3: 保留
bits 4..7: 版本

我已经成功地用以下代码对其进行了分析:

Concatenation_F = ProtoField.uint8("Concatenation", "Concatenation", base.DEC, NULL, 0x1)
Version_F = ProtoField.uint8("Version", "Version", base.DEC, NULL, 0xF0)

my_protocol.fields = { Concatenation_F,
                   Version_F
}

<snip>

local Concatenation_range = buffer(0,1)
local Version_range = buffer(0,1)

local Concatenation = Concatenation_F:uint()
local Version = Version_range:uint()

subtree:add(Concatenation_F, Concatenation_range, Concatenation)
subtree:add(Version_F, Version_range, Version)

这可以工作,但我想展示 Concatenation 字段的含义,如下所示:

enter image description here

但要做到这一点,我需要获取 Concatenation 位的值。 我该如何做到这一点?

点赞
用户2755698
用户2755698

有两种解决方案。通常你只需要引入一个 valuestring 并在你的 ProtoField 调用中使用它。例如:

local yesno_types = {
    [0] = "No",
    [1] = "Yes"
}

Concatenation_F = ProtoField.uint8("Concatenation", "Concatenation", base.DEC, yesno_types, 0x1)

有关更多信息,请参考 Wireshark 开发者指南 第 11.6.7 节中的 ProtoField

但如果你仍然想要获取位域的值,那么你可以使用 Lua BitOp 支持,这已经对你可用。所以,可以像这样:

local function get_concat(x) return bit.band(x, 0x01) end

local concat = get_concat(buffer(0, 1):uint())
2018-07-10 14:26:35