メイン 他の Wireshark で Lua Dissector を使用する方法

Wireshark で Lua Dissector を使用する方法



世界最高のネットワーク パケット キャプチャ ツールの 1 つである Wireshark を使用すると、特定のデータ パケットを取得して、オフラインとリアルタイムの両方で分析できます。このアプリは、ネットワークを流れるデータを詳しく調べて、問題や異常を発見できるようにする手段であると考えてください。

  Wireshark で Lua Dissector を使用する方法

パケットのデータの特定の部分を分析したい場合は、ディセクタを使用できます。名前が示すように、このプロセスはコードを「分析」し、注意が必要な特定の側面を切り取ることができます。このチュートリアルでは、Lua スクリプト言語を使用して Wireshark でディセクタを作成および使用する方法を説明します。

始める前に – ディセクターについて知っておくべきこと

ディセクタは Wireshark でデータ パケットの一部を分析する簡単な方法を提供しますが、効果的に機能するにはいくつかのプロトコルに従う必要があります。これらのプロトコルには次のものが含まれます。

  • 作成するすべてのディセクターは、異なるプロトコルからの設定されたタイプのペイロードを処理するために登録する必要があります。この登録を完了するには、以下に示すように、「Proto」オブジェクトをディセクターに割り当てる必要があります。
  • Wireshark 経由で dissector を呼び出すと、アプリから 3 つの情報を受け取ります。
    • TVB オブジェクト – データ パケットからの TVB バッファー。
    • TreeItem オブジェクト – データ ツリー内の単一ノードを表すツリー ルート。
    • Pinfo オブジェクト – パケット情報レコード。
  • データ パケットが「Proto」オブジェクトに設定した DissectorTable と一致する場合にのみ、ディセクターを呼び出すことができます。
    • 「Decode As」機能を使用してディセクターの使用を強制することで、この要件を回避できます。ただし、それでも、「Proto」オブジェクトに設定した DissectorTable が正しいタイプである場合にのみ、ディセクターを強制できます。

LUA を使用したディセクターのセットアップ

Wireshark は C プログラミング言語で書かれており、それを使用しているため、ほとんどのディセクターも同様に C で書かれています。ただし、Lua を使用することもできます。このスクリプト言語は C よりも単純であるため、コーディングの初心者や、より軽量な言語を使用してディセクターを作成したいだけの人にとってもアクセスしやすい言語です。

コードは単純になりますが、Lua を使用すると得られるディセクタは、通常、C を使用して作成するものよりも遅くなります。それでも、Lua を使用して Wireshark ディセクタを作成する場合は、次の手順に従う必要があります。

ステップ 1 – Wireshark で Lua をセットアップする

これまで Wireshark で Lua を使用したことがない場合は、Lua をセットアップする必要があります。

スナップスコアはどのように上がりますか
  1. 「ヘルプ」をクリックし、「Wireshark について」をクリックします。
  2. 「フォルダ」をクリックします。
  3. 次のいずれかを選択して、アクティブな Lua スクリプトを作成します。
    • グローバル Lua プラグイン
    • 個人用 Lua プラグイン
    • 個人的

アクティブ化すると、Wireshark を起動するたびにスクリプトが準備完了になります。スクリプトに変更を加えるたびに、Wireshark を再起動して変更を登録するか、「Ctrl + Shift + L」を押してすべての Lua スクリプトをリロードして変更を有効にする必要があります。

ステップ 2 – ディセクターを作成するための基本的な手順

すでに Lua に精通している場合は、次の手順を使用して、Wireshark で動作する独自のディセクター スクリプトを作成できます。

  • ディセクタのプロトコルを宣言します。これには、プロトコル ツリーで使用する長い名前と、ディセクタの表示フィルタ名として機能する短い名前の両方を設定する必要があります。
    • 次の 3 つのフィールドを適切なタイプで作成します。
    • 質問 - 質問の種類を表示します。
    • 回答 – 回答のタイプを表示します。
  • MessageType – パケットが質問または回答を要求しているかどうかを示します。
  • Wireshark がフィールドを表示する方法を認識できるようにフィールドを登録します。フィールドが登録されていない場合、「Lua エラー」メッセージが表示され、通常はツリー アイテムの ProtoField が無効であることが示されます。
  • 前述の Pinfo (パケットに関するデータを含む) と Tree Items (サブツリーに追加するツリーの作成) を含む分析関数を作成します。 TCP の上に置かれる「バッファ」も作成する必要があります。
  • Wireshark がディセクタを使用する必要があるプロトコルとポートの両方を指定します。たとえば、プロトコルを「TCP」に設定し、ポート番号を使用したいものに設定できます。

ステップ 3 – ディセクターを Wireshark に追加する

現時点では、あなたの解剖器は電気のない電球のようなものです。それは存在しますが、それに何らかの電力を供給できるまでは役に立ちません。つまり、ディセクターはまだ Wireshark に追加されていないため、次の手順に従って手動で追加して実行する必要があります。

フォルダオプションウィンドウズ10にアクセスする方法
  1. 「ヘルプ」をクリックし、「Wireshark について」メニューに進みます。
  2. 「フォルダー」タブを選択して、Lua ファイルのパスのリストを見つけます。
  3. 「個人用 Lua プラグイン」を選択します。必要に応じてディレクトリを作成します。
  4. 作成した Lua ファイルをコピーし、「Personal Lua Plugins」ディレクトリに貼り付けます。 Wireshark をリロードしてディセクターをオンにします。

キャプチャしたパケットの一部を開いて、新しいディセクターでテストを実行することをお勧めします。 Wireshark は、メッセージ タイプ (質問または回答) およびチェックの結果に関する情報とともに、ディセクタに選択した長い名前を示すメッセージを配信する必要があります。

サンプルコード

これまでにディセクターを作成したことがない場合 (または Lua を初めて使用する場合)、 ワイヤーシャーク 試してみる便利なサンプル ディセクターが提供されています。

local p_multi = Proto("multi", "MultiProto");
local vs_protos = {
    [2] = "mtp2",
    [3] = "mtp3",
    [4] = "alcap",
    [5] = "h248",
    [6] = "ranap",
    [7] = "rnsap",
    [8] = "nbap"
}
local f_proto = ProtoField.uint8("multi.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("multi.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("multi.text", "Text")
p_multi.fields = { f_proto, f_dir, f_text }
local data_dis = Dissector.get("data")
local protos = {
    [2] = Dissector.get("mtp2"),
    [3] = Dissector.get("mtp3"),
    [4] = Dissector.get("alcap"),
    [5] = Dissector.get("h248"),
    [6] = Dissector.get("ranap"),
    [7] = Dissector.get("rnsap"),
    [8] = Dissector.get("nbap"),
    [9] = Dissector.get("rrc"),
    [10] = DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
    [11] = DissectorTable.get("ip.proto"):get_dissector(132), -- sctp
}
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
local wtap_encap_table = DissectorTable.get("wtap_encap")
local udp_encap_table = DissectorTable.get("udp.port")
wtap_encap_table:add(wtap.USER15, p_multi)
wtap_encap_table:add(wtap.USER12, p_multi)
udp_encap_table:add(7555, p_multi)

ポストディセクターと連鎖ディセクター

Lua でのディセクターの作成をマスターしたら、ディセクターの使用法をもう少し詳しく調べてみることをお勧めします。 Wireshark は、より多くの機能を提供する 2 つの追加タイプのディセクター (ポストディセクターとチェーン ディセクター) を提供します。

ポストディセクターは、パケットに対して実行したすべてのディセクターの最終チェックによく似ています。これを登録すると、Wireshark が使用する他のすべてのディセクターを呼び出したときに通知を受け取ることができ、これを使用して「プロトコル」列と「情報」列をフィルタリングできます。この機能は、データセット間に長いギャップがあり、それぞれを個別に呼び出すことができないセッションで複数のパケットをフィルタリングして除外する場合に特に便利です。

ディセクターをチェーンすると、単一のディセクターのデータにアクセスできるようになり、(少なくとも以前に使用したディセクターによるフィルター処理という点では) 同様の機能が提供されます。ここでの主な利点は、チェーンされたディセクターがすべてのパケットを再度実行する必要がなく、元のディセクターが再度実行されるのを待たなくても結果が得られることです。

Lua での分析

Wireshark がすでに C (自然言語) でディセクターを作成する機能を提供していることを考えると、Lua でディセクターを作成する必要性は感じられないかもしれません。それでも、C に慣れていない人や、すでに Lua をマスターしている人は、Lua の軽量スクリプトによりディセクタの作成が簡単になることに気づくかもしれません。確かに、C ベースのディセクターと比較してプロセスを実行するときの読み込み時間は長くなりますが、それとは関係なくオプションがあると便利です。

それでは、皆様のご意見を伺いたいと思います。 Wireshark でディセクターをどのくらいの頻度で使用しますか?以前に C でディセクタを作成してみたことがありますか? Lua でディセクタを作成することでどのようなメリットがあると思いますか?以下のコメントセクションでお知らせください。

興味深い記事

エディターズチョイス

Googleスプレッドシートで減算する方法
Googleスプレッドシートで減算する方法
Excelのバックグラウンドを持つ経験豊富なGoogleスプレッドシートのユーザーは、無料のGスイートプログラムを使用して複雑な数学演算を効率的に実行できます。これは、ExcelとGoogleスプレッドシートの両方で計算が実行される方法に大きな類似性があるためです。
お使いのカメラには高速SDカードが必要ですか?
お使いのカメラには高速SDカードが必要ですか?
デジタルカメラ用のフラッシュメモリカードは、今ではとてつもなく安いです。 64GBのSDカードはオンラインで約£30で購入できます。これは、一般的なデジタル一眼レフで作成された5,000個のRAWファイル(または30個以上)を保存するのに十分なスペースです。
AIMP3のEuphoriaVerticalTabsスキン
AIMP3のEuphoriaVerticalTabsスキン
ここでは、AIMP3スキンタイプのEuphoria Vertical Tabsスキンをダウンロードできます。このスキンは、AIMP3拡張子にのみ適用できます。.acs3サイズ:793711バイトAIMP3は公式サイトからダウンロードできます。注:Winaeroはこのスキンの作成者ではありません。すべてのクレジットは、元のスキンの作成者に帰属します(スキンを参照してください)。
メッセンジャーで誰かのブロックを解除する方法
メッセンジャーで誰かのブロックを解除する方法
メッセンジャー サービスで誰かのブロックを解除するのは、ブロックするのと同じくらい簡単です。ここで何をすべきかです。
Kikをブロック、ブロック解除、禁止する方法
Kikをブロック、ブロック解除、禁止する方法
Kikは、テキストや写真などを送受信するために主に若いスマートフォンユーザーが使用する人気のモバイルメッセージングアプリです。 Kikはユーザー名でユーザーを識別するため、電話番号、名前、または個人情報を共有することはありません。
WPSファイルを開く方法
WPSファイルを開く方法
場合によっては、開いて作業する必要がある古いファイルの種類に遭遇することがあります。MicrosoftWorksに精通している場合は、.wpsファイルとその操作方法を思い出してください。
GoogleカレンダーをOutlookと同期する方法
GoogleカレンダーをOutlookと同期する方法
アプリケーションを組み合わせたり、GSuiteやMicrosoftOfficeを使用する場所で作業したりする場合は、GoogleカレンダーをOutlookと同期するか、またはその逆を行うことをお勧めします。このチュートリアルでは、その方法を説明します