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のプラグインを作るという記事が少なく、書くのに手こずったのでメモ代わりと誰かのためになればと思い今回記事にしてみました。
ちなみにキーコードに対応させるテーブルを書くのが面倒でまだ一部しか書いてないです。