Burp Suiteの拡張用APIが変更になりmontoya-api
というものに変わっていたのでAPI移行のついでに開発環境を整えるかぁ〜となりましたが、予想外に四苦八苦したのでメモを残します。
そして流石にIDE使った方が便利かぁ?と思いIntelliJ IDEAでBurp拡張を作ることにしました。
正直Java + IDEAよくわかってないので改善点あれば教えてください。
jetbrainsの公式ページからCommunity版をダウンロード
Community版のダウンロードリンクは下の方にあるので注意
Intellij IDEAで新規プロジェクトを作成する
Build system以外は基本デフォルトでOK
Build systemはGUI Designerを使うためIntelliJ IDEAを選択
2024/2月現在、montoya-apiでのBurp拡張開発はJDK17を使用しないと行けないっぽいのでJDKだけ注意
File -> Project Structure...
Modules -> + -> New module
親モジュールと同じ設定でOK
こんな感じのモジュール構成にしておく
モジュール -> srcフォルダ-> mainパッケージ -> javaパッケージ ->-> クラス
BurpのMontoyaApiを使うためのライブラリをインポートする
File -> Project Structure...
Libraries -> + From Maven...
montoya-apiの最新版を選択
子モジュールに追加する(今回はburpモジュール)
自動生成されているMainファイルを好きなファイル名・クラス名に変更し、そのクラスにBurpExtensionインターフェースを実装する
BurpExtensionインターフェースはMontoyaApi
クラスを引数に取るinitialize
メソッドがあればOK
この状態でビルドに通ればMontoyaApiのインポートはOK
前の手順でビルドしただけではBurpにロードするjarが生成されないので生成するように設定する
File -> Project Structure...
Artifact -> + -> JAR -> From modules with dependencies...
デフォルトでOK
Include in project build...をON
この状態でビルドするとjarが生成される
Burpが正常に拡張を読み込むことができるかテストするためにログコンソールに適当な文字列を出力させてみる
Burp拡張のGUI部分を自力で書いていたけど流石に辛すぎたのでIDEAの力を借りる
IDEAでSwingのGUIコンポーネントを作成するにはNew -> Swing UI Designer -> GUI Designer
命名以外はとりあえずデフォルトでOK
すると、ディレクトリとその直下にjavaクラスと.formファイルが生成される
.formファイルに関してはIDEAがいじるので基本的には触らない(が、細かいところの調整でたまに編集したりする)
.formをIDEAで開くとGUIでデザインができる
だが、このままだとGUIでデザインした結果がjavaクラスファイルの方に反映されないためBurp拡張のコードからSwingコンポーネントを触ることができない
そのため、GUIの設定をjavaクラスに吐き出させるようにIDEAを設定する
File -> Settings...
Editor -> GUI Designer -> Generate GUI intoをJava source codeに変更する
この状態でビルドするとJavaクラスにGUI Designerの結果が反映される
$$$setupUI$$$()や$$$getRootComponent$$$()などのメソッドが自動実装されていることがわかる
ただし、ビルドは成功しているがIDE上エラーが出ている状態になってしまっているので足りない依存関係を追加する
File -> Project Structure... -> Libraries -> + -> Java
IDEAのインストール先ディレクトリ以下のlib/forms_rt.jarをインポートする
子モジュールを選択
再ビルドすると依存関係が解決されエラーが解消される
自動生成されたクラスはコンストラクタに呼ばれる$$$setupUI$$$()によって自動で初期化される。
自動生成されたクラスは単純なものであれば以下のようにMontoyaApiに渡すことで使用できる
MontoyaApiのUI系のメソッドはjava.awt.Componentを要求する物が多いっぽい
GUI Designerによって自動生成されたクラスの$$$getRootComponent$$$()を呼ぶことでそのクラスの最上位のGUIコンポーネント(java.awt.Component)を取得することができる
montoyaApi.userInterface().registerSuiteTabでBurpに拡張用のタブを追加することができる
自動生成されたクラス内のコンポーネント(JPanelやJButtonなど)の初期化方法をカスタマイズしたい場合はGUI Designerからカスタマイズしたいコンポーネントを選択し、Custom createをONにする
すると、クラス内にcreateUIComponentメソッドが自動で定義されるためここに初期化処理を書いていく
この状態でビルドすると$$$setupUI$$$()の先頭にcreateUIComponentの呼び出しが追加される
注意点として、Custom createをONにしたコンポーネントをcreateUIComponent内で初期化することを忘れると実行時エラーになるので注意
下ではcreateUIComponent内で初期化していないpanel1のメソッドを呼び出そうとしているが特にエラーは出ない
Gsonなどのライブラリを使用しようとしてハマったのでメモ
(GsonはJsonシリアライズ・デシリアライズ用のライブラリ)
まず、普通に外部ライブラリをインポートしてビルドする手順
MontoyaApiをインポートしたときと同様の手順でインストールする
適当なクラスをJSON化してログコンソールに出力してみる
拡張をロードした時点でcom.google.gson.Gsonが見つからないというエラーが出る
恐らく実行時に当該ライブラリが見つからないと言っているようなのでライブラリをArtifactに含める
Artifact設定をしたときと同様にArtifact画面を開き、Available ElementsからGsonを右クリックし、Extract into Output Rootを選択すると
Output layoutにGsonが含まれるようになる
この状態で再ビルドし、Burpに読み込ませると正常にクラスをJSON化した文字列がログコンソールに表示される