Wireshark Lua Dissector - Как использовать TAP? - PullRequest
1 голос
/ 10 февраля 2012

Я хотел бы провести некоторый анализ поверх моего собственного протокола, который анализируется через мой диссектор lua. Поэтому я попытался сделать это

myproto_proto = Proto("myproto", "Myproto Protocol")
m_dest = ProtoField.uint16("myproto.dest", "Destination", base.HEX)
m_src = ProtoField.uint16("myproto.src", "Source", base.HEX)
myproto_proto.fields = { sm_dest, sm_src }

dofile(MYPROTO_PROTO_PATH.."parser.lua")

function myproto_proto.dissector(buffer, pinfo, tree)
   pinfo.cols.protocol = "MYPROTO"

   local subtree = tree:add(myproto_proto, buffer(), "Myproto Protocol Data")
   parse_msg(buffer, pinfo, subtree) -- does the actual parsing and sets the fields
end

udp_table = DissectorTable.get("udp.port")
udp_table:add(9000,myproto_proto)

-- LISTENER / TAP

f_test = Field.new("myproto.dest") -- fails because "field does not exist"
local function my_tap()
   local window = TextWindow.new("Myproto Tap")
   local tap = Listener.new(nil, "myproto")

   local counter = 0
   function remove()
      tap:remove()
   end

   window:set_atclose(remove)

   function tap.packet(pinfo, buffer)
      counter = counter + 1
   end

   function tap.draw(t)
      window:append("Counter: \t" .. counter .. "\n")
   end

   function tap.reset()
      window:clear()
      counter = 0
   end
   retap_packets()
end

register_menu("My Tap", my_tap, MENU_TOOLS_UNSORTED)

Моя проблема в том, что я не могу получить доступ к рассеченным данным с помощью экстрактора поля. Так, как еще я мог получить вскрытые данные в моем кране lua?

Заранее спасибо.

1 Ответ

3 голосов
/ 12 февраля 2012

Известная проблема в том, что пользовательские объекты Lua Field нельзя использовать в OSX (по-видимому, работает в Windows XP, но не в Windows 7).

Есть несколько способов передать данные с вашего диссектора на ваш кран.


Вариант 1. Использование общей таблицы Lua

  1. Создайте глобальный словарь, в котором используется номер пакета (от pinfo.number, который виден как для анализатора, так и для касания).

    -- we omit the 'local' keyword to make `dict` a global variable
    dict = {}
    
  2. В вашем диссекторе добавьте пакетные данные в словарь:

    dict[pinfo.number] = { dest = m_dest, src = m_src }
    
  3. В вашем кране вы можете получить доступ к данным с помощью простого поиска.

    print('dest', dict[pinfo.number].dest )
    

XXX: Требуется глобальное; Хранилище дубликатов для переменной, которая уже содержится в дереве протокола (и должна быть доступна из-под крана).


Вариант 2: использовать pinfo.private

Это было добавлено в сборку dev (1.7.0). Это похоже на решение выше. pinfo.private - это PrivateTable, хеш-таблица, в которой хранятся только строки.

  1. В своем диссекторе добавьте ваши данные в личную таблицу пакета:

    pinfo.private["src"] = tostring(m_src)
    pinfo.private["dest"] = tostring(m_dest)
    
  2. В вашем кране получить доступ к данным из pinfo объекта:

    print('dest', pinfo.private["dest"] )
    

XXX: Может хранить только строковые значения


Вариант 3. Повторная обработка буфера

  1. В вашем кране вызовите ваш анализатор (т. Е. С parser.lua), чтобы проанализировать данные в buffer, которые передаются на кран.

XXX: Дублирует работу, уже выполненную диссектором (может удвоить время обработки для файлов захвата X-Large)

...