MyUtils

View on GitHub

WireShark

ネットワークパケット解析ツール「Wireshark」 GUIが利用できない場合は使いにくいが、tshark,tcpdumpといったでCUIツールもある。 また、tsharkは取得したキャプチャをWiresharkと連携させることもできる。 tshark,tcpdumpはまた別の機会で、今回は自作プロトコルを表示する方法について書いていく

Luaファイルについて

表示するパケットについて

wiresharkはluaファイルを設定することで自身で作成したプロトコルに合わせて表示することができる。 デフォルトで以下のパスにinstallされinit.luaがここに格納される。

C:\Program Files\Wireshark\

init.luaに自作のluaのパスを追加することで新規のプロトコル表示させることができる

dofile(DATA_DIR.."myprotocol.lua")

サンプルとしてはこんな感じ
公式サンプル

-- 1.プロトコルを定義する
myproto = Proto("MyProto", "My Protocol")

-- 2.プロトコル解析用の関数を定義する
function myproto.dissector(buffer, pinfo, tree)
  pinfo.cols.protocol = "MyProto" -- (1)
  local subtree = tree:add(myproto, buffer(), "My Protocol Data") -- (2)
  subtree:add(buffer(0,2),"command: ", buffer(0,2):uint()) -- (3)
  subtree:add(buffer(2,1),"flag: ", buffer(2,1):uint()) -- (4)
  -- (5)🌟 le_でlittle Endianでintにできる
  subtree:add(buffer(2,1),"flag: ", buffer(2,1):le_uint()) 

end

-- 3.TCPのポートとプロトコルを紐づける
tcp_table = DissectorTable.get("tcp.port") -- TCPポートのテーブルを取得する
tcp_table:add(777,myproto) -- TCPの777番ポートとプロトコルの紐付けする

関数

関数の作り方としてはこんな感じ

function p_multi.dissector(buf, pkt, tree)

        local subtree = tree:add(p_multi, buf(0,2))
        subtree:add(f_proto, buf(0,1))
        subtree:add(f_dir, buf(1,1))
        local proto_id = buf(0,1):uint()
        local dissector = protos[proto_id]

        if dissector ~= nil then
                -- Dissector was found, invoke subdissector with a new Tvb,
                -- created from the current buffer (skipping first two bytes).
                dissector:call(buf(2):tvb(), pkt, tree)
        elseif proto_id < 2 then
                subtree:add(f_text, buf(2))
                -- pkt.cols.info:set(buf(2, buf:len() - 3):string())
        else
                -- fallback dissector that just shows the raw data.
                data_dis:call(buf(2):tvb(), pkt, tree)
        end

end