Wireshark Lua 解析器 utf16 字符串

Wireshark Lua dissector utf16 string

我正在编写自定义 Wireshark Lua 解析器。解析器中的一个字段是 UTF16 字符串。我试图用

指定这个字段
msg_f = ProtoField.string("mydissector.msg", "msg", base.UNICODE)
local getMsg = buffer(13) -- starting on byte 13
subtree:add_le(m.msg_f, getMsg)

但是,这只会添加第一个字符而不是整个字符串。它还会引发专家信息警告未解码 trailing/stray 个字符。

解析 UTF16 字符串的正确方法是什么?

您没有指定组成字符串的范围字节。这通常由显式长度字段或 NULL 终止符确定。确定范围的确切方法取决于所讨论的特定协议和字段。

每种类型的示例:

  • 如果有一个长度字段,比如说字符串前面的 1 个字节的长度,那么您可以使用类似的东西:
    local str_len = buffer(13, 1):le_uint()

    subtree:add_le(m.msg_len_f, buffer(13))
    if str_len > 0 then
        subtree:add_le(m.msg_f, buffer(14, str_len))
    end
  • 如果字符串以 NULL 结尾,您可以使用类似的东西:
    local str = buffer(13):stringz()
    local str_len = str:len()
    subtree:add_le(m.msg_f, buffer(13, str_len + 1))

这些只是伪示例,因此您需要应用任何方法(可能 none)来拟合您的数据。

请参阅 Wireshark's Lua API Reference Manual for more details, or to the Wireshark LuaAPI 维基页面。

我想到的解决方案很简单:

msg_f = ProtoField.string("mydissector.msg", "msg")
local getMsg = buffer(13) -- starting on byte 13
local msg = getMsg:le_ustring()
subtree:add(msg_f,  getMsg, msg)