1

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

提前致谢。

4

1 回答 1

3

自定义 Lua对象在 OSX 中不可用是一个已知问题(它显然适用于 Windows XP 但不适用于 Windows 7)。Field

有几种方法可以将数据从解剖器传递到水龙头。


选项 1:使用共享 Lua 表

  1. 创建一个以数据包编号为键的全局字典(从pinfo.number,解析器和点击都可见)。

    -- 我们省略 'local' 关键字以使 `dict` 成为全局变量
    字典 = {}
    
  2. 在您的解析器中,将数据包数据添加到字典中:

    dict[pinfo.number] = { dest = m_dest, src = m_src }
    
  3. 在您的水龙头中,您可以通过简单的查找来访问数据。

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

XXX:需要全局;为已经保存在协议树中的变量复制存储(并且应该可以从水龙头访问)。


选项 2:使用pinfo.private

这是在开发版本 (1.7.0) 中添加的。它类似于上面的解决方案。pinfo.private是 a PrivateTable,它是一个只存储字符串的哈希表。

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

    pinfo.private["src"] = tostring(m_src)
    pinfo.private["dest"] = tostring(m_dest)
    
  2. 在您的水龙头中,访问pinfo对象中的数据:

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

XXX:只能存储字符串值


选项 3:重新解析缓冲区

  1. 在您的水龙头中,调用您的解析器(即 from parser.lua)以重新解析 中的数据buffer,这些数据将传递给水龙头。

XXX:复制解剖器已经完成的工作(可以使 X-large 捕获文件的处理时间加倍)

于 2012-02-11T20:54:45.777 回答