Как улучшить рабочий процесс для создания рассеивателя Wireshark на основе Lua

Я наконец создал Dissector для моего протокола UDP в Lua для Wireshark, но рабочий поток просто ужасен. Он состоит из редактирования моего пользовательского файла Lua в моем редакторе, затем двойного щелчка на моем примере захвата файла, чтобы запустить Wireshark, чтобы увидеть изменения. Если произошла ошибка, Wireshark сообщает мне через диалоговые окна или красную строку в подсистеме анализа дерева. Затем я повторно редактирую свой пользовательский файл Lua, а затем закрываю экземпляр Wireshark, а затем снова дважды щелкаю мой файл захвата примера. Это похоже на компиляцию файла C и только просмотр одной ошибки компилятора за раз.

Есть ли лучший (быстрый) способ взглянуть на мои изменения, не перезапуская Wireshark все время?

В то время я использовал Wireshark 1.2.9 для Windows с включенным Lua.

Ответ 1

Лучший способ автоматизировать это - с помощью командной строки. Да, используйте tshark вместо загрузки gui thingy.

Если ваш lua script называется "proto.lua" и он определяет протокол под названием "MyProto", который использует порт 8888, вы можете протестировать ваш диссектор, используя:

tshark -X lua_script:proto.lua -O MyProto -V -f "port 8888"
  • -V позволяет tshark распечатывать всю информацию обо всех протоколах. Опция
  • -O фильтрует параметр -V, чтобы он отображал всю информацию только в перечисленных протоколах (CSV). Параметр
  • -f фильтрует все пакеты, которые не соответствуют правилу. В этом случае любой пакет, который не находится в правом порту.

Ответ 2

Возможно, вы сможете написать тривиальную функцию-обертку, которую загружает Wireshark, и просто загрузите реальный файл с диска (например, через dofile()). Возможно, это может "обмануть" Wireshark, чтобы всегда перезагружать ваш код Lua, пока вы не будете более комфортно с ним и сможете удалить этот хак.

Ответ 3

Последняя версия Wireshark поставляется с примитивной консолью для запуска lua script. Его можно найти в разделе Инструменты → Lua → Evaluate. Оттуда вы сможете перезагрузить свой диссектор, запустив dofile(). Вам также придется удалить предыдущую версию вашего диссектора.

Вот пример для диссектора на основе TCP.

local tcp_dissector_table = DissectorTable.get("tcp.port")
tcp_dissector_table:remove(pattern, yourdissector)
yourdissector = nil

dofile("c:/path/to/dissector.lua")

Я рекомендую разместить этот код в функции внутри вашего файла.

Теперь возникает проблема с этим ответом: Если ваш script создал объект Proto, кажется, что вы не можете создать его снова с тем же id. Конструктор класса Proto вызывает функцию C proto_register_protocol() (см. epan/wslua/wslua_proto.c). Я не могу найти никакой функции lua, которая будет отменять регистрацию протокола. На самом деле, я даже не могу найти функцию C, чтобы отменить регистрацию.