Wireshark Lua рассекатель строка utf16 - PullRequest
0 голосов
/ 08 ноября 2019

Я пишу пользовательский диссектор 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)

Однако это добавляет только первый символ, а не всю строку. Кроме того, в окне «Информация об эксперте» появляется предупреждение о незакодированных конечных / случайных символах.

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 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)
0 голосов
/ 12 ноября 2019

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

...