
Native Pcode emulator
この実験的な Ghidra プラグインを使うと、ネイティブ pcode エミュレーションを簡単に扱えます。スクリプトはもう必要ありません。Ghidra から直接使用するだけです。一般的なエミュレータが対応していないさまざまなエキゾチックなプロセッサを扱う場合に特に役立ちます。
プロセッサ/VM が Ghidra によるリバースエンジニアリングでサポートされていれば、エミュレーションできます。たとえば、eBPF 命令のエミュレーションを以下に示します:

本質的に、このプラグインは ghidra.app.emulator パッケージ内のクラスを拡張したラッパーです。実装されている機能は次のとおりです:
PCode エミュレーションは理想的には統一を意味しますが、ほとんどのプロセッサにはそれぞれ独自のアプローチが必要です。遭遇した問題は遠慮なく報告してください。すべてのプロセッサをテストしたいところですが、それはほぼ不可能です。

スタックビュー、レジスタ、ブレークポイントビュー、メインウィンドウのすべてのプラグインウィンドウが含まれます。

エミュレーションの開始位置と終了位置の設定、ブレークポイント、変更されたバイトのエミュレータ状態への適用を行うホットキーが含まれています。
レジスタを自由に変更できます。リンクレジスタ(緑色の矢印)を設定すると、エミュレータがどのレジスタに戻りアドレスが格納されているかを認識できます。プラグインは、スタック、lr レジスタ、AARCH64、MIPS レジスタによる仕組みを理解しています。エキゾチックなプロセッサを使用している場合は、リンクレジスタを選択してボタンを押してください。
CodeBrowser でプログラムを開くと、GhidraEmu がスタック領域を自動的にマッピングします。スタックポインタはスタック範囲の中央に設定されます。これにより、スタックフレームの先頭または末尾に値を設定できます。更新やリセット時にフリーズする場合は、スクロールしてください。エミュレーション中にプログラムがスタックにもっと多くの領域を必要とする場合、プラグインが自動的に割り当てます。
エミュレーション中にバイトが変更された場合、そのバイトは従来の ByteViewer に表示されます。「Reset」 ボタンを押せば元の値に戻るので心配いりません。
変更を加えた場合は、変更したバイトをエミュレータに通知してください(スタックは自動的に更新されるため、その必要はありません)。変更後、対象を選択し(緑色になります)、このオプションを押すか、ホットキー「M」を使用してください。

プラグインはここに出力情報を表示します。たとえば、次のようなエミュレーションエラーメッセージです:

「Jump Over」機能を使うと、何らかの理由で現在の命令をエミュレートしたくない場合に、1命令先へジャンプできます。未初期化メモリの読み取りが検出されるとエミュレーションプロセスが中止されるため、この機能を使えばそれを回避できます。例を見てみましょう。多くの x86_64 プログラムの最初の方にある命令の1つ、canary スタック保存です:
MOV RAX, qword ptr FS:[0x28]
ここでは少しずるをして、PC 値を増やしてこの命令を飛ばしてみます。これを行うには、エミュレートしたくない命令で停止し、J ホットキーを押します。そうしないと、さらにステップ実行したときに未初期化メモリの読み取りエラーが発生します。

サブルーチン(内部コール)に進む命令で停止し、次の命令まで全部エミュレートしたい場合(いわゆる「ステップオーバー」)、F6 ホットキーを押せば確実に実行されます:

考慮すべきいくつかの重要なポイント:
gradle を使用して拡張機能をビルドします: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle 次に Ghidra を使用してインストールします: File → Install Extensions...
CodeBrowser で File → Configure → Miscellaneous に移動し、GhidraEmu プラグインのチェックボックスを選択します。
プラグインの使用中にバグに遭遇した場合や、改善のアイデアはありますか? 遠慮なく新しい issue を開いてください。対応します。
EmulatorHelper の制限により、あるプログラム空間を別のプログラム空間で使用することはできません。そのため、たとえば外部の共有ライブラリはプログラムのメモリ空間を知ることができず、その逆も同様です。つまり、1つのメモリ空間を持つ1つのプロセスとしてエミュレートすることはできません。ここで何か見落としている点があれば教えてください。