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