Рассеиватель Lua не вызывается при использовании tshark (Windows 10)
Я уже разместил этот вопрос в сообществе Wireshark ( ссылка), в настоящее время еще нет ответов.
У меня есть куча диссекторов, которые я написал на Lua, которые я использовал до сих пор в графическом интерфейсе Wireshark - теперь я хочу использовать их с tshark (под Windows 10). Проблема в том, что один из моих диссекторов не работает при вызове в tshark (хотя он инициализируется). tshark не выводит никаких пакетов вообще, хотя все остальные диссекторы работают нормально. Я звоню диссектору одного из моих
[...]
info("calling dissector")
Dissector.get("myproto"):call(payload_tvb, packet_info, tree)
в то время как сам диссектор выглядит так:
function myproto.init()
info("Initialization of myproto dissector")
end
function myproto.dissector(buffer, packet_info, tree)
info("dissector successfully called")
[...]
end
На самом деле ничего особенного. Из журнала я вижу, что диссектор инициализируется. Но когда я открываю файл.pcapng с помощью tshark, тогда сообщение журнала "успешно вызванный диссектор" никогда не печатается, а в графическом интерфейсе Wireshark - так и есть.
Я не вижу сообщения об ошибке, поэтому понятия не имею, в чем проблема. Вызов функции getDissector не возвращает nil, я проверял это. Файлы lua находятся в моем каталоге AppData\Roaming\Wireshark\plugins, и у tshark, похоже, нет проблем с их поиском там. У кого-нибудь есть идея, что может быть не так с этим диссектором? Любая помощь приветствуется, спасибо заранее.
2 ответа
Вам нужно передать файл lua в tshark, используя аргумент командной строки -X.
Скрипты загружаются автоматически при открытии wireshark, но не при запуске tshark.
Я не знаком с getDissector()
; ты не должен использовать Dissector.get
?
Например, все мои диссекторы lua делают так:
local data_handle = Dissector.get("data")
function my_proto.dissector(tvb, pinfo, tree)
...
data_handle:call(...)
end
Я не уверен, почему это не работает для вас, но я могу привести рабочий пример, который может вам помочь. Ниже приведены два глупых диссектора, foo.lua и bar.lua. Вы можете использовать пример файла захвата foo.pcapng, размещенный на облачном хранилище, если вы хотите проверить его. (Я опубликовал это давно в качестве примера к этому вопросу на ask.wireshark.org.)
Во-первых, foo.lua:
-- foo.lua
local p_foo = Proto("foo", "FOO Protocol")
local f_foo_val8 = ProtoField.uint8("foo.val8", "Value 8", base.OCT)
local f_foo_val16 = ProtoField.uint16("foo.val16", "Value 16", base.DEC)
local f_foo_val32 = ProtoField.uint32("foo.val32", "Value 32", base.HEX)
local f_foo_ipv4 = ProtoField.ipv4("foo.ipv4", "IPv4 Address")
local f_foo_ipv6 = ProtoField.ipv6("foo.ipv6", "IPv6 Address")
p_foo.fields = { f_foo_val8, f_foo_val16, f_foo_val32, f_foo_ipv4, f_foo_ipv6 }
bar_handle = Dissector.get("bar")
function p_foo.dissector(buf, pinfo, tree)
local foo_tree = tree:add(p_foo, buf(0,-1))
pinfo.cols.protocol:set("FOO")
foo_tree:add(f_foo_val8, buf(0, 1))
foo_tree:add(f_foo_val16, buf(1, 2))
foo_tree:add(f_foo_val32, buf(3, 4))
foo_tree:add(f_foo_ipv4, buf(7, 4))
foo_tree:add(f_foo_ipv6, buf(11, 16))
bar_handle:call(buf, pinfo, tree)
end
local udp_table = DissectorTable.get("udp.port")
udp_table:add(33333, p_foo)
-- end of foo.lua
... и теперь bar.lua:
local p_bar = Proto("bar", "BAR Protocol")
function p_bar.dissector(buf, pinfo, tree)
pinfo.cols.info:append(", BAR")
end
-- end of bar.lua
Итак, общая идея здесь заключается в том, что foo.lua выполняет нормальное рассечение, как это было в моем примере, но теперь он также вызывает разбиватель баров, который действительно прост и просто добавляет "BAR" в информационный столбец, чтобы вы знали, что это было называется. В моем тестировании все это работает как ожидалось. Возможно, этот простой пример поможет вам?