Wireshark Lua диссектор utf16 строка

Пишу кастомный диссектор 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)

Однако при этом добавляется только первый символ, а не вся строка. Он также вызывает предупреждение Expert Info о незакодированных конечных / случайных символах.

Как правильно анализировать строку UTF16?


person Paul Grinberg    schedule 08.11.2019    source источник


Ответы (2)


Вы не указали диапазон байтов, который составляет строку. Обычно это определяется либо явным полем длины, либо 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))

Это просто псевдо-примеры, поэтому вам нужно будет применить любой метод, возможно, ни один из них, чтобы соответствовать вашим данным.

Дополнительные сведения см. В Справочном руководстве по Lua API от Wireshark или в Wireshark Вики-страницы LuaAPI.

person Christopher Maynard    schedule 12.11.2019

Решение, которое я придумал, простое:

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)
person Paul Grinberg    schedule 12.11.2019