Wireshark Lua解析utf16字符串

我正在编写自定义Wireshark Lua解析器。解析器中的一个字段是UTF16字符串。我尝试使用以下方式指定这个字段:

msg_f = ProtoField.string("mydissector.msg", "msg", base.UNICODE)
local getMsg = buffer(13) -- 从第13个字节开始
subtree:add_le(m.msg_f, getMsg)

但是,这只添加了第一个字符,而不是整个字符串。它还会引发一个Expert Info警告,表示有未解码的尾随/杂项字符。

在解析UTF16字符串时,应该采用什么样的正确方式呢?

点赞
用户2755698
用户2755698

你没有指定包含该字符串的字节范围(range)。这通常由显式长度字段或 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))

这些只是伪示例,因此您需要应用任何方法(可能没有这些方法),以适应您的数据。

有关更多详细信息,请参见Wireshark 的 Lua API 参考手册,或参见 Wireshark LuaAPI wiki 页面。

2019-11-12 19:13:09
用户4071435
用户4071435

我想到的解决方案是:

msg_f = ProtoField.string("mydissector.msg", "msg")
local getMsg = buffer(13) --从第13个字节开始
local msg = getMsg:le_ustring()
subtree:add(msg_f,  getMsg, msg)
2019-11-12 19:18:27