更新されたデモは近日公開予定です!
リバース エンジニアリング アシスタント (ReVA) は、リバース エンジニアリング タスク用の逆アセンブラーに依存しない AI アシスタントを構築するプロジェクトです。これには、オフラインとオンラインの両方の推論と、単純なアーキテクチャが含まれます。
ReVa は、ツール主導のアプローチを使用しているため、RE タスク用の AI アシスタントを構築する他の取り組みとは異なります。 ReVa は、RE 環境が一連の小さなツールを提供するのと同じように、LLM にさまざまな小さなツールを提供することを目的としています。 ReVa は、このアプローチと推論連鎖技術を組み合わせて、LLM が複雑なタスクを完了できるようにします。
LLM に与えられる各ツールは、LLM が使いやすく、さまざまな入力を許容し、LLM による幻覚を軽減できるように構築されています。これを行うには、LLM にスキーマを提供しますが、LLM をガイドする記述を含む他の入力を許容し、修正可能な間違いを LLM にリダイレクトし、LLM による次の決定をガイドする追加の出力を含めます。
たとえば、LLM が RE ツールからの逆コンパイルを要求する場合、16 進数の生アドレス、10 進数の生アドレス、名前空間を持つシンボル名、またはシンボルを受け入れます。 LLM が間違った入力を与えた場合、入力を修正するための指示とともに、これを LLM に報告します (おそらく関数リストの使用を奨励します)。人間と同じように探索を促すために、逆コンパイルとともに名前空間や相互参照などの追加のコンテキストを報告します。これは、LLM に人間と同じ方法でバイナリを探索させるための小さなナッジです。
このテクニックを使用すると、一般的な質問をして、関連する回答を得ることができます。モデルはツールからの情報を優先しますが、情報がない場合でも、トレーニングからの一般的な質問に応答できます。
次のような質問をすることができます。
__mod_init
セグメントの目的を説明します。mmap
何を返しますか?リバース エンジニアリングの重要な部分はプロセスです。他の多くのツールは LLM に 1 つの質問をするだけであり、これは、問題が発生した理由を判断するのが難しいことを意味します。 ReVa では、すべてのアクションを小さな部分に分割し、LLM の考えを出力に含めます。これにより、アナリストは LLM のアクションと推論を監視し、必要に応じてプロンプトを中止したり変更したりすることができます。
RevA は、多数のモデルをサポートする langchain に基づいています。
組み込みのサポートは以下に対して提供されます。
プロバイダーの設定の詳細については、「構成」を参照してください。
langchain でサポートされている場合、推論サーバーを追加するのは簡単です。
ReVa の設定は CodeBrowser ツールのオプションにあります。プログラムを開き、[編集] -> [ツール オプション] -> [ReVa] に移動します。
次のオプションがあります。
プロバイダー用のセクションがあります。
デフォルトでは、OpenAI キーは環境変数OPENAI_API_KEY
からロードされます。 Ghidra 内にキーを設定することもできます。キーをOPENAI_API_KEY
値に設定し直すと、Ghidra 設定からキーがクリアされ、環境からロードされます。
モデルを選択することもできます。デフォルトではgpt-4o
が選択されています。このモデルは、ReVa が提供するツールとプロンプトで最もよく機能します。
gpt-4
も正常に動作しますが、速度が遅いため、バイナリを探索するにはユーザーによるさらなるプロンプトが必要です。
Ollama はローカル推論サーバーです。デフォルトのサーバーは、デフォルトの Ollama ポートを使用して localhost に設定されます。リモート マシンで推論を実行する場合は、これをリモート サーバーに変更できます。これは、自己ホストする組織に役立ちます。
モデルを選択することもできます。モデルはサーバーにすでにロードされている必要があります。以下の場合に良好なパフォーマンスが見られます。
mixtral
llama3
phi
RevA には 2 ステップのワークフローがあります。
ReVa は、RE ツールの拡張機能を使用して分析を実行します。以下のギドラのサポートを参照してください。
質問したり推論を実行したりするために、コマンド ライン ツールが提供されています。 reva-chat
実行してチャット セッションを開始します。このコマンドは、開いている Ghidra を見つけて接続します。新しいチャットを開くには、別のターミナルでコマンドを再度実行します。
複数の Ghidra を開いている場合は、 reva-chat --project ${project-name}
を使用して正しいものを選択できます。設定さreva-chat
ていない場合は、どのプロジェクトに接続するかを尋ねられます。
reva-server
と拡張機能の間の通信には、gRPC が使用されます。詳細については (こちら)[./DEVELOPER.md] をご覧ください。これらのプロトコル定義からのソース ファイルのビルドは、Makefile によって行われます。プロトコル ソース コード ファイルをビルドするには、プロジェクトのルートで次のコマンドを実行します。
make protocol
まず Python コンポーネントをインストールします。私はpipx
使用するのが好きです。次のようなものでインストールします。
pip install pipx
reverse-engineering-assistant
フォルダーで、次を実行します。
pipx install .
Python プロジェクトをインストールした後、pipx は PATH 環境変数にフォルダーを追加する必要があることを警告する場合があります。フォルダー (現在reva-server
とreva-chat
が含まれています) が PATH 変数に含まれていることを確認してください。 pipx は次のコマンドを使用してそれを行うことができます。
pipx ensurepath
拡張機能はreva-server
起動する必要があり、 reva-chat
実行する必要があります。これらを PATH に追加したくない場合は、実行可能ファイルへのパスを設定する方法について「構成」セクションを参照してください。
拡張機能によってreva-server
開始されると、次のコマンドでチャットを開始できます。
reva-chat
Ghidra 拡張機能を機能させるには、Python パッケージをインストールする必要があります。
ghidra-assistant プラグインの指示に従います。
インストール後、CodeBrowser ツールでReVa Plugin
拡張機能を有効にします (ファイルを開いて、[ファイル] -> [構成] -> [その他] をクリックします)。
ReVa をデフォルトで有効にする場合は、「ファイル」→「ツールの保存」をクリックして構成を保存します。
すべてが正しく動作している場合は、メニュー バーに ReVa メニューが表示されます。
Edit -> Tool Options -> ReVa
でプラグイン構成を変更できます。
ReVa がアクションを実行するたびに、アクションごとに元に戻すポイントが作成されます。 ReVa が 5 つの変数の名前を変更した場合、これは 1 回の元に戻すことになります。
ReVa は、CodeBrowser ツールの [ウィンドウ] メニューにオプションを追加します。 [ウィンドウ] -> [ReVa アクション ログ] を選択して、[ReVa アクション ログ] ウィンドウを開きます。
このウィンドウには、ReVa が実行したアクションと実行する予定のアクションが表示されます。 ✅ またはアイコンをダブルクリックすると、変更を承認または拒否できます。アドレスをダブルクリックして、アクションが実行される場所に移動することもできます。
あなたがアクションを拒否した場合、ReVa はそのことを告げられ、次に進みます。
ReVa オプションで「自動許可」を有効にすることもできます。これにより、ReVa が実行したいすべてのアクションが自動的に受け入れられます。
ReVa は、Ghidra UI にいくつかの要素も追加します。チャット ウィンドウで ReVa に「 main
での変数の使用状況を詳しく調べて、変数の名前をよりわかりやすい名前に変更してください」と依頼するか、メニュー システムを使用することができます。
たとえば、逆コンパイルで変数を右クリックし、[Reva] -> [変数の名前を変更] を選択すると、ReVa がアクションを実行します。
私の仕事は好きですか?このプロジェクトや他のプロジェクトをサポートしてみませんか?このプロジェクトがどのように設計され、構築されたかに興味がありますか?このプロジェクトや他の多くのプロジェクトは、https://twitch.tv/cyberkaida の私のストリームでライブで構築されています。