Рассеиватель 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" в информационный столбец, чтобы вы знали, что это было называется. В моем тестировании все это работает как ожидалось. Возможно, этот простой пример поможет вам?

Другие вопросы по тегам