Ghidrathonは、ユーザー インターフェイスと緊密に統合される Python 3 スクリプト機能を追加する Ghidra 拡張機能です。現在、Ghidra には、Jython に基づく Python 2 拡張システムが付属しています。ただし、Python 3 を実行する簡単な方法はありません。Ghidrathon を使用すると、バージョン 3.10 のような最新の Python を既存の拡張システムで使用できます。この投稿では、Ghidrathon が提供するもの、そのしくみ、および Ghidra で Python 3 スクリプトを今すぐ使い始める必要がある理由について説明します。
問題
Ghidra は、National Security Agency Research Directorate によって開発および維持されている、人気のあるオープンソース ソフトウェア リバース エンジニアリング フレームワークです。 Ghidra は強力なスクリプト API をサポートしており、Java または Python 2.7 (Jython 経由) で記述された Ghidra スクリプトを使用して、ユーザーがプログラムでプログラムを分析するのに役立ちます。
残念ながら、Python 2.7 は 2020 年にサポートが終了し、セキュリティ コミュニティによって開発された多くのツールは現在 Python 3 で記述されています。これにより、これらのサードパーティ ツールを Ghidra と統合することが困難になり、場合によっては不可能になります。さらに、IDA Pro や Binary Ninja などのリバース エンジニアリング ツールは Python 3 スクリプトをネイティブにサポートしており、既存の分析スクリプトを Ghidra に移植したい研究者にさらなる問題をもたらします。理想的には、ソリューションはフレームワークのユーザー インターフェイスと緊密に統合され、維持されているすべての Python 3 バージョンをサポートし、Ghidra 拡張機能としてインストールしてシームレスなユーザー エクスペリエンスを実現する必要があります。
ギドラソンの紹介
Ghidrathon はローカルの Python 3 インタープリターを Ghidra に埋め込み、データベースとフレームワークのスクリプト API にアクセスできるようにします。その後、インストールしたサードパーティ製パッケージを含む最新の Python を使用して、Ghidra データベースにプログラムでアクセスできます。 Ghidrathon は Python 仮想環境もサポートしており、Ghidra で使用するためにのみインストールする必要があるパッケージを分離して管理するのに役立ちます。 Ghidrathon を他の拡張機能と同じようにインストールして、Ghidra を変更せずに実行できます。
使用法
Ghidrathon は、Jython を介して実装された既存の Python 2 拡張機能を置き換えます。これには、対話型インタープリター ウィンドウ、Ghidra Script Manager との統合、および Ghidra ヘッドレス モードでのスクリプト実行が含まれます。 READMEに記載されている手順を使用して Ghidrathon をビルドおよびインストールし、以下で説明する機能の使用を開始できます。
インタラクティブ通訳
図 1に示す Ghidrathon インタープリター ウィンドウは、ローカルの Python 3 インタープリターへの対話型アクセスを提供します。 Ghidra スクリプト API と一緒に、ローカルの Python パッケージをインポートして使用できます。 [ウィンドウ] をクリックし、[ギドラソン] を選択して、ギドラソン インタープリター ウィンドウを開きます。

Ghidra スクリプト マネージャーの統合
Ghidrathon は Ghidra Script Manager と統合されているため、Ghidra 内で Python 3 スクリプトを作成、編集、および実行できます (図 2 参照)。[Create New Script] をクリックし、[Python 3] を選択して、新しい Python 3 スクリプトを作成します。 [Run Script] または [Run Editor’s Script] をクリックして Python 3 スクリプトを実行し、Ghidra コンソール ウィンドウでスクリプトの出力を確認します。

ギドラヘッドレスモード
Ghidra ヘッドレス モードは、Ghidra のユーザー インターフェイスのオーバーヘッドなしで、多くのファイルにわたる分析を自動化するのに役立ちます。分析が終了する前および/または後に実行する Ghidra スクリプトを指定することもできます。 Ghidrathon を使用すると、図 3 に示すように、Python 3 スクリプトをヘッドレス モードで実行できます。Python 3 スクリプトを指定して、Ghidra インストール フォルダーにある「anlayzeHeadless」スクリプトを実行し、ターミナル ウィンドウでスクリプト出力を確認します。

サードパーティの Python パッケージ
Ghidrathon の背後にある最大の動機の 1 つは、サードパーティの Python 3 パッケージを Ghidra スクリプト API と一緒に使用できるようにすることでした。オープンソース コミュニティは優れた分析ツールをリリースしており、その多くは Python 3 で記述されており、Ghidra でこれらのツールを利用できるようにしたいと考えています。たとえば、Ghidra を離れることなく、人気のあるオープンソース エミュレーター フレームワーク Unicorn を使用してコードをエミュレートできます。スタック文字列を構築する図 4 に示す ARM コードをエミュレートするとします。

Ghidrathon のビルドに使用したのと同じローカル Python インストールに Unicorn モジュールをインストールすることで、Ghidra で Unicorn の使用を開始できます。インストールしたら、Unicorn モジュールをインポートして、標準の Python セットアップと同じように使用できます。この例では、Ghidra データベースからスタック文字列コードを読み取り、Unicorn を使用してエミュレートし、結果のスタック文字列を Ghidrathon インタープリター ウィンドウに出力します。
Unicorn をインポートし、図 5に示すコードを使用して ARM エミュレーターを構成します。

図 6に示すコードを使用して、Ghidra スクリプト変数currentSelection
とGhidraスクリプト関数getBytes
を使用して、Ghidra データベースからスタック文字列コードを読み取ります。

スタック文字列コードをエミュレータに書き込み、エミュレーションを開始し、図 7 に示すコードを使用してr0
レジスタからスタック文字列を読み取ります。

ギドラソンはどのように機能しますか?
このプロジェクトは、「Ghidra と一緒に Java 仮想マシン (JVM) 内で最新の Python 3 を実行できるか」という疑問から生まれました。ソリューションに関する最初の考慮事項は多岐にわたり、次のようにする必要があります。
- JVM によって実行される
- Ghidra スクリプト API を使用して Ghidra データベースとやり取りできる
- Ghidra UI と緊密に統合
Ghidra 拡張機能によって開始および制御できるように、主に JVM によってソリューションを実行する必要がありました。 Ghidra には優れた拡張システムがあるため、これによりユーザーは簡単にインストールできます。この要件により、Ghidra の広範な Java API をサポートして Ghidrathon を開発する必要がありました。 Python によって処理されるデータのフロントエンドを実装するために Java が使用される、将来の Ghidra 拡張機能を開発するための扉が開かれると信じています。最終的に、オープンソース プロジェクトJepを使用して拡張機能を動作させることができました。
Jep は、Java Native Interface (JNI) を使用して、ほとんどがサンドボックス化された複数の CPython インタープリターを JVM に埋め込むことができます。 Jep を使用すると、Ghidra と一緒に JVM で CPython インタープリターを作成し、Java と Python の間でデータをマーシャリングできます。どうやってこれを行うのですか? Jep は、各インタープリターの構成、開始、対話、および停止に使用する Java API を提供します。たとえば、Ghidrathon インタープリター ウィンドウを開くと、Jep の API を使用して新しい CPython インタープリターを作成し、それをサポートします。実行する Python コードを入力すると、Jep の API を使用してそのコードをインタープリターに渡して実行します。 CPython インタープリターが不要になったら、Jep の API を使用して閉じます。 Jep の仕組みの詳細については、こちらのドキュメントを参照してください。
Ghidrathon は、Ghidra と Jep を結び付ける接着剤であり、Jep の能力を Ghidra UI と緊密に統合します。 Ghidrathon は、Ghidra データベースと Ghidra スクリプト API にアクセスできるように各 CPython インタープリターを構成します。その後、Jep は、Python と Java の境界を越えてメンバー アクセスを自動的に変換できます。また、出力を Ghidra の適切なウィンドウにリダイレクトするようにインタープリターを構成します。たとえば、Ghidrathon インタープリター ウィンドウ用に CPython インタープリターを構成する場合、 stdoutとstderrを Ghidraに表示されるインタープリター ウィンドウにリダイレクトします。 Ghidrathon は、Ghidra と CPython インタープリターの間の状態も維持します。たとえば、currentAddress などのGhidraスクリプト変数がインタープリターでアクセス可能であり、正しいデータが含まれていることを確認します。
私たちの調査によると、Ghidra に Python 3 のネイティブ サポートを追加するには、JNI を使用する必要があります。Ghidra 開発者は、ここで説明する理由により、JNI を使用しないようにアドバイスしています。 Ghidra で最新の Python 3 を使用する利点は、JNI を使用することの欠点を上回り、選択は各 Ghidrathon ユーザーに委ねられていると考えています。
代替案
Ghidrathon は、 Ghidraal 、 Ghidra Bridge 、およびpyhidraを含む複数のソリューションの 1 つであり、Ghidraで Python 3 スクリプトを使用できるようにします。各ソリューションは、それぞれ異なる方法で実装され、利点と制限が伴います。すべてのソリューションを検討し、ニーズに最適なものを選択することをお勧めします。
結論
この投稿では、Ghidrathon を紹介しました。これは、Ghidra の UI と緊密に統合された Ghidra に Python 3 スクリプト機能を追加する Ghidra 拡張機能です。 Ghidrathon をコミュニティにリリースできることを嬉しく思います。これにより、最新の Python 3 を使用して Ghidra の拡張を開始することをお勧めします。お使いの環境での Ghidrathon のビルドとインストールに関する情報については、 READMEを確認してください。コメント、質問がある場合、または問題が発生した場合は、ツールの GitHub ページからお問い合わせください。
謝辞
Java Native Interface を使用して Python を JVM に埋め込むという最初のアイデアの策定を支援し、開発全体を通じて創造的なインプットを提供してくれた William Ballenthin に感謝します。 Moritz Raabe と Ana Maria Martinez Gomez のテストとフィードバックに感謝します。
参照: https://www.mandiant.com/resources/blog/ghidrathon-snaking-ghidra-python-3-scripting
Comments