Ошибка Wireshark Dissector в Lua: недопустимый дескриптор ProtoField/Protocol элемента дерева

Я новичок в Lua, и это моя первая попытка написать анализатор wireshark.
Я хочу анализировать SSH без шифрования с помощью Lua-скрипта. Я пишу скрипт для определения длины пакета и длины заполнения для первого шага.

Вот мой сценарий:

do
    local p_test = Proto("test","Test.");

    local f_packet_length = ProtoField.uint32("packet_length")
    local f_padding_length = ProtoField.uint8("padding_length")


    p_test.fields = {
        f_packet_length,
        f_padding_length
    }

    function p_test.dissector(buf,pkt,root)
        local offset = 0
        local buf_len = buf:len()

        local t = root:add(p_test, buf:range(offset))

        t:add(f_packet_length,buf:range(offset,4))
        offset = offset+4
        t:add(f_padding_length,buf:range(offset,1))
        offset = offset+1

    end

    local tcp_table = DissectorTable.get("tcp.port")

    tcp_table:add(22,p_test)
end

После запуска кода через Evalutate Lua и применения тестового фильтра я обнаружил ошибку в Packet Details:

Lua Error: [string "do..."]:19: Tree item ProtoField/Protocol handle is invalid (ProtoField/Proto not registered?)

Строка 19 соответствует строке t:add(f_packet_length....

Кто-нибудь может помочь объяснить эту ошибку?
Заранее спасибо.


person user3656207    schedule 11.08.2014    source источник


Ответы (1)


Приведенный выше код будет работать нормально, если он находится в реальном скрипте Lua для Wireshark... либо в файле .lua в каталоге личных плагинов, либо при загрузке с помощью переключателя командной строки "-X lua_script:<filename>".

Но вы не можете зарегистрировать новый протокол в окне tools->evaluate, потому что к тому времени уже слишком поздно регистрировать новый протокол (или новые поля). К сожалению, ошибка, о которой сообщает Wireshark, не дает ясного представления об этом, потому что она работает наполовину, но на самом деле она не работает и не может работать.

Проблема заключается в том, что регистрация нового протокола происходит внутри в два этапа: первый этап — это когда скрипты Lua загружаются и выполняются, что добавляет протокол и поля во внутреннюю временную таблицу, а затем, после загрузки всех скриптов lua, выполняется второй этап. новые протоколы и поля перемещены из временной таблицы в их окончательные таблицы времени выполнения и зарегистрированы, а затем wireshark завершает загрузку, и вы видите графический интерфейс. Эта вторая фаза происходит один и только один раз, когда Wireshark впервые запускается. Но запуск окна tools->evaluate происходит после всего этого, так что уже поздно.

person hadriel    schedule 12.08.2014