Wireshark Lua Dissector - 如何使用TAP?

时间:2012-02-10 17:51:22

标签: lua wireshark wireshark-dissector

我想在我通过我的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 tap中获得解剖数据呢?

提前致谢。

1 个答案:

答案 0 :(得分:3)

known problem自定义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 )
    
  4. XXX:需要全局;复制已存在于协议树中的变量的存储(并且应该可以从抽头中访问)。


    选项2:使用pinfo.private

    这是在dev build(1.7.0)中添加的。它与上面的解决方案类似。 pinfo.privatePrivateTable,它是一个只存储字符串的哈希表。

    1. 在您的解剖器中,将您的数据添加到数据包的私有表中:

      pinfo.private["src"] = tostring(m_src)
      pinfo.private["dest"] = tostring(m_dest)
      
    2. 点按即可访问pinfo对象中的数据:

      print('dest', pinfo.private["dest"] )
      
    3. XXX:只能存储字符串值


      选项3:重新分析缓冲区

      1. 点按即可调用您的解析器(例如,从parser.lua)重新分析buffer中的数据,该数据将传递给点按。
      2. XXX:重复解剖器已经完成的工作(可以将X大型捕获文件的处理时间缩短一倍)