Преобразование пользовательских данных в шестнадцатеричный формат в Wireshark Dissector

Сейчас я пишу lua-скрипт Wireshark Dissector.

Как преобразовать userdata в шестнадцатеричную строку?
Я хочу получить такой вывод 0102030405060708000a0b0c0d0e0f10

Я могу преобразовать шестнадцатеричную строку с помощью tostring.
Но в ней не используются длинные данные. Выходное изображение

Как преобразовать userdata в шестнадцатеричную строку без пропуска длинных данных?

proto = Proto("Test", "My Test Protocol")

function proto.dissector(buffer, pinfo, tree)
  print(tostring(buffer()))
  -- "userdata"
  -- print(type(buffer()))
end

tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(1234, proto)

Окружающая обстановка

  • Wireshark 3.2.1

person bugggy    schedule 07.06.2020    source источник


Ответы (1)


Я не очень хорошо знаком с Wireshark, но из беглого просмотра руководства я понял, что буфер имеет вид TVB

а buffer() эквивалентен buffer:range(), который возвращает TvbRange.

Существует функция Tvb:__tostring, которая утверждает, что

Преобразуйте байты Tvb в строку. Это в первую очередь полезно для целей отладки, так как строка будет усечена, если она слишком длинная.

Печать TvbRange усекается до 24 байт.

Я бы попытался получить ByteArray с вашего телевизора и получить шестнадцатеричная строка этого ByteArray с использованием

11.8.1.14. bytearray:tohex([lowercase], [separator]) Получить строку Lua байтов в ByteArray в виде hex-ascii с заданным разделителем

Таким образом, ваш код может выглядеть примерно так

proto = Proto("Test", "My Test Protocol")
function proto.dissector(buffer, pinfo, tree)
  print(buffer:bytes():tohex())
  -- or print(buffer():bytes():tohex())
  -- but I guess if you don't give a range in buffer()
  -- it will be pretty much the same as buffer.
end
person Piglet    schedule 07.06.2020