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 タップで分析されたデータを取得するには、他にどのようにすればよいでしょうか?

前もって感謝します。

4

1 に答える 1

3

カスタムLuaオブジェクトがOSXで使用できないことは既知の問題です(Windows XPでは機能するようですが、Windows 7では機能しないようです)。Field

ディセクタからタップにデータを渡す方法はいくつかあります。


オプション1:共有Luaテーブルを使用する

  1. pinfo.numberパケット番号(ディセクタとタップの両方に表示されるから)でキー設定されたグローバルディクショナリを作成します。

    --「local」キーワードを省略して「dict」をグローバル変数にします
    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は、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ラージキャプチャファイルの処理時間を2倍にすることができます)

于 2012-02-11T20:54:45.777 に答える