wireshark lua tapdata nil

Feb 15, 2016 19:48

Пост с "решением" проблемы, когда Lua TAP для Wireshark вместо полезной информации отдает в коллбэк nil. Вдруг, кто-то будет искать решение и найдет его здесь.

У нас на работе используется LBM, Wireshark умеет парсить его пакеты, но хотелось бы делать это еще и без GUI в скриптах. Можно вызывать tshark, печатать нужные поля и потом парсить вывод с помощью awk, sed и прочих, но это неспортивно и на многогигабайтных дампах превращается в мучение. Но если попробовать написать простой Lua TAP script, то в него прилетает чуть менее, чем ничего:

tap = Listener.new("lbm", "lbmr.hdr.tirs > 0")

function tap.packet(pinfo, tvb, tapinfo)
  -- Самый интересный аргумент tapinfo здесь всегда nil
end

С этим мириться было нельзя, и я скачал код Wireshark, вот что нашлось:
  1. Первый аргумент - это имя TAP, в моем случае должно быть одно из: "lbm_lbmr_topic_advertisement", "lbm_lbmr_topic_query" и т.д. Смотреть надо здесь: epan/dissectors/packet-lbmr.c по имени функции register_tap
  2. После того, как диссектор распарсил всю инфу, он отдает это в Lua: epan/wslua/wslua_listener.c, функция lua_tap_packet. Строчка, на которой все разваливается - if (tap->extractor)... То есть для пакетов LBM не хватает парсера, чтобы по-красивому передать все в Lua.
  3. А экстрактор, оказывается, генерится автоматически веселым скриптом epan/wslua/make-taps.pl, для которого надо всего-лишь поправить файлик epan/wslua/taps, прописав что-то типа такого: lbm_lbmr_topic_advertisement ../dissectors/packet-lbm.h lbm_lbmr_topic_advertisement_tap_info_t
  4. Ну, и пересобрать Wireshark :)
Наверное, патч надо заслать, но что-то лень :)
Previous post
Up