WiresharkのPluginを作ってみた

はじめに

某CTFの問題で、USBのインタラプト転送のパケットをキーコード表とにらめっこしながら解くのが苦痛だったので読み込んだらフィールドに表示してくれるPlaginを作ってみました。
使用言語ですが、ささっと作りたかったのでluaでの実装です。

GitHub - somebodyN/Wireshark_Plugins

ソースコード

KEYCODE = {
    [0x00] = 0、
     ︙
    [0xE7] = "RIGHT GUI"
}


-- Create Protocol
proto = Proto("In_USB", "Interrupt-in_USB protocol")

-- Create Fields
local fields = proto.fields

fields.InputData = ProtoField.uint8("proto.data", "IN", base.HEX, KEYCODE)

function proto.dissector(buffer, pinfo, tree)
    pinfo.cols.protocol = proto.name

    local subtree = tree:add(proto, buffer(), "DATA")

    for i = 0, buffer:len()-1 do
        subtree:add(fields.InputData, buffer(i, 1))
    end
end

usb_table = DissectorTable.get("usb.interrupt")
usb_table:add(0xff, proto)
usb_table:add(0xffff, proto)

解説

内容ですが、最初に取得したデータをキーコードに変換するためのテーブルを定義しています。
そのテーブルを使い、以下の部分でHEXで取得したデータをキーコードに変換しています。

fields.InputData = ProtoField.uint8("proto.data", "IN", base.HEX, KEYCODE)

Dissectorではdata部分をすべて受け取り、1バイトづつサブツリーに追加しています。
最後にUSBのプロトコルで使用したいので

usb_table = DissectorTable.get("usb.interrupt")

でUSBのdissectorテーブルを取得して

usb_table:add(0xff, proto)
usb_table:add(0xffff, proto)

の2行で関連付けを行っています。

感想

表示が冗長なのをキレイにしたりマウス操作のインタラプト転送も勝手に変換されるのをメニューにon/offを追加して制御したりしていきたいですね。
あと意外とWiresharkプラグインを作るという記事が少なく、書くのに手こずったのでメモ代わりと誰かのためになればと思い今回記事にしてみました。

ちなみにキーコードに対応させるテーブルを書くのが面倒でまだ一部しか書いてないです。