wireshark lua debug.getinfo - ноль - PullRequest
       81

wireshark lua debug.getinfo - ноль

0 голосов
/ 09 марта 2020

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

Теперь, чтобы получить доступ к другим файлам из " Основной файл "Мне нужно сделать это:

package.prepend_path(".\plugins\3.3\modulesDir") local mymodule= require "module"

Это прекрасно работает, но имеет некоторые недостатки. Наиболее важно, если пользователь использует другую версию Wireshark, мне нужно изменить путь в коде Lua. То же самое, если это другой каталог (Linuy, Ma c OS).

Чтобы обойти это, я провел некоторое исследование о том, как получить путь к текущему файлу Lua и придумал следующее:

local moduleDir = debug.getinfo(2, "S").source:sub(2) moduleDir = moduleDir:match("(.*[/\\])")

Эта платформа работает независимо, поэтому она выглядит идеальным решением для того, что я хочу. Если я выполню это с помощью Wireshark> Инструменты> Lua> Оценить, это работает отлично.
НО: если я делаю это в файле Lua (который является моим диссектором), то я получаю ошибку "попытка проиндексировать нулевое значение ". Я пробовал разные версии этой строки, но всегда кажется, что таблица отладки равна нулю. Я использую Wireshark версии 3.3.

Кто-нибудь знает, как запустить его? Или другой подход к получению каталога, в котором находится файл Lua? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

На Windows, мои Lua файлы находятся в каталоге «Персональные Lua Плагины» , который при просмотре справки Wireshark «-> О Wireshark -> Папки» Msgstr " диалог, просто %APPDATA%\Wireshark\plugins. Так что, возможно, вы можете просто переместить вашу папку из path\to\plugins\3.3\modulesDir в path\to\plugins\modulesDir?

Я полагаю, что вам потребуется только:

package.prepend_path("modulesDir")

И это позволит вашему Lua диссектор и модули для работы не только с версией разработки Wireshark 3.3, но и с будущими выпусками. И если ваш диссектор по какой-то причине не может работать со старыми версиями Wireshark, вы всегда можете сделать что-то вроде:

if get_version() < "3.3" then
    return
end

Наконец, посмотрите, как Адриэль Каплан решил это для своего протобуфа. lua диссектор, где его необходимые модули находятся в каталоге «модули». Это в основном, как я описал выше. См .: https://github.com/128technology/protobuf_dissector

0 голосов
/ 09 марта 2020

Если вы ищете «глобальный каталог конфигурации», вы можете использовать Dir.global_config_path(). Здесь у вас есть этот init. lua находится на этом пути, а здесь lua функция dtails.

...