Как добавить в Lua DissectorTable?

Я пишу диссектор Lua для Wireshark для сложного протокола. У протокола есть заголовок сообщения, который включает поле msgType. Я хочу написать субдиссектор для каждого типа сообщения, причем каждый субдиссектор хранится в отдельном исходном файле.

Мой сценарий верхнего уровня - general.lua, который анализирует заголовок сообщения и создает таблицу диссектора:

DissectorTable.new("myProtocol.Message")
dofile(DATA_DIR.."cplane.lua")

cplane.lua является субдиссектором для типа сообщения cplane и включает в себя код:

my_dissector_table = DissectorTable.get("myProtocol.Message")
my_dissector_table:add(0x02, myProtocol_cplane_proto)

Оба сценария находятся в одном подкаталоге каталога плагинов Wireshark.

Когда я загружаю плагины, я получаю сообщение об ошибке:

Lua: Error during loading:
 [string "C:\Program Files (x86)\Wireshark\plugins\2.4...."]:9: bad argument 
#1 to 'get' (DissectorTable_get: no such dissector_table)

Lua: Error during loading:
 [string "C:\Program Files (x86)\Wireshark\plugins\2.4...."]:170: bad 
argument #1 to 'dofile' (dofile: file does not exist)

Как я могу это исправить? Проблема в порядке загрузки скриптов? Необходим ли вызов dofile ()?


person DavidA    schedule 11.07.2018    source источник


Ответы (2)


Нет необходимости использовать dofile, так как все скрипты в каталоге плагинов загружаются. Однако порядок загрузки не фиксирован (по крайней мере, не задокументирован, чтобы его исправить). В настоящее время плагины Lua загружаются после других диссекторов, поэтому попытка поиска таблиц диссекторов в «глобальной области видимости» будет работать только для встроенных диссекторов, таких как tcp.port:

local myproto = Proto("myproto", "My Protocol")
function myproto.dissector(tvb, pinfo, tree)
    ...
end
-- Register with a built-in dissector table
DissectorTable.get("tcp.port"):add(1234, myproto)

Для регистрации в пользовательских таблицах диссектора эту регистрацию необходимо отложить. В диссекторах C вы бы поместили регистрацию в proto_reg_handoff_PROTOABBREV (где PROTOABBREV следует заменить соответствующим образом), но в Lua такой функции нет.

Самое близкое, что вы можете получить, - это процедура "init" (свойство класса Proto, proto.init). Они вызываются при открытии файла захвата перед анализом любых пакетов. Пример:

function myproto.init()
    DissectorTable.get("your-custom-table"):add(1234, myproto)
end
person Lekensteyn    schedule 11.07.2018
comment
Спасибо. Метод init () устранил проблему. - person DavidA; 12.07.2018

  1. Lua: Error during loading:  [string "C:\Program Files
        (x86)\Wireshark\plugins\2.4...."]:9: bad argument 
        #1 to 'get' (DissectorTable_get: no such dissector_table)
    

Ответ: Эта ошибка означает, что таблица Dissector не найдена. Причина может заключаться в неверном пути или в последовательности выполнения файла.

  1. Lua: Error during loading:  [string "C:\Program Files
        (x86)\Wireshark\plugins\2.4...."]:170: bad  argument #1 to 'dofile'
        (dofile: file does not exist)
    

Ответ: Для меня эта ошибка исчезла при вводе точно правильного пути

person Muhammad Awais Manzoor    schedule 24.06.2019