
GoogleのGemma 4 E4BローカルAIモデルを使用してGhidraでWindowsのクラックミーをリバースエンジニアリングするためのステップバイステップのチュートリアル。ローカル推論のセットアップと自動的な関数/変数のリネーミングを含む。
Googleがリリースした新しいGemma E4Bオープンウェイトローカルモデルを試していたところ、ローカルオフラインでのリバースエンジニアリングシナリオで非常に成果が上がっていることに驚きました。このチュートリアルでは、ローカルAIが多くの基本的なリバースエンジニアリングタスクに十分対応できるようになったこと、そしてこれから急速に改善が進むであろうことを広めるために書いています。
新しいバイナリをリバースする上で最も退屈な部分の1つは、最初の段階で、重要な関数や変数について何の手がかりもないことです。リバーサーは、文字列参照を見る、バイナリ差分、類似関数のマッチングなど、着手するための多くのテクニックを持っています。
AIはここで非常に役立ち、私はOpenAI APIを使ってバイナリに注釈を付けたり、デコンパイラの出力を整理したりすることに個人的に大きな成功を収めてきました。しかし、これらのAPIを使用するにはいくつかの欠点があります。
コスト - デコンパイルと逆アセンブルは大量のトークンを生成します。APIはトークンごとに課金されるため、大きなバイナリを分析するにはかなりの金額がかかる可能性があります。毎週更新される多数のバイナリを含む大規模なターゲットを扱う場合、これらのコストはすぐに膨らみ、趣味でリバースエンジニアリングをする人には手が出せません。
プライバシー - リモートAPIを使用する場合、AIのホストはあなたが何をしているかを把握できます。これはプロフェッショナルなシナリオでは受け入れられない場合があります。
制御 - リモートAPIに依存している場合、どのモデルが提供されているかやモデルの品質を制御できません。ミッションクリティカルな作業でそれらに依存している場合、遅くなったりダウンしたり必要なときに使えなくなったり、出力品質が低下して役に立たなくなったりする可能性があります。
独自のローカルAIモデルを実行することで、これらの問題点のいくつかに対処できます。
コスト - ホスト型サービスに依存するよりも、ローカルモデルを実行する方がはるかに安価な場合があります。ローカルモデルはおそらく優良プロバイダーのものより小さく低速ですが、十分に優れており、妥当な時間で動作するなら、特に大量のデータを簡単なタスクで処理する場合には、独自モデルを実行してお金を節約することは理にかなっています。
プライバシー - モデルをローカルで実行する場合、ネットワークコールは発生せず、プライバシーを完全に制御できます。自分のマシンで何にモデルを使っているかを誰も見ることはできません。
制御 - オープンウェイトモデルの素晴らしさは、誰もそれを奪うことができないことです。OpenAIやAnthropicは、いつか価格引き上げやAPIの明示的な削除によって、SotAモデルを利用できなくするかもしれません。しかし、オープンウェイトモデルを使えば、良くも悪くも、自分の運命を自分でコントロールできます。
ローカルAIモデルには欠点もあります。
サイズ - モデルが大きいほど、インテリジェントになります。しかし、ほとんどの大規模モデルはコンシューマーハードウェアに収まりません。そのため、ローカルモデルを実行している場合、おそらくSotA(最先端)モデルの10分の1から100分の1の大きさのモデルを実行していることになります。このサイズの減少はモデルの知能の低下に直結し、ChatGPT/CodexやClaudeのようなSotAモデルで当然と思われている多くのタスクには不向きになります。
速度 - ローカルモデルはおそらく、AI APIを使用する場合よりもマシン上で低速に動作します。これもコンシューマーハードウェアの制限と、APIプロバイダーが行うことができるトリックの一部が一般的には利用できないことによるものです。
設定 - ローカルモデルの実行は、中古のノートパソコンでLinuxを動かそうとするのと、Apple Storeで新品のMacBook Airを買うのとの違いに似ています。CodexやClaude Codeの体験はAIにおけるApple Storeの体験です。ローカルAIモデルの体験は、ガレージでフェドーラ帽をかぶった男がガタガタのコンピューターを叩いて動かそうとしているようなものです。最低限、以下のことを気にしなければなりません。
これは簡単な道のりではなく、多くの人が諦めて、ローカルAIモデルはそのタスクに適していないと思い込んでしまいます。なぜなら、適切なハードウェア/モデル/設定/プロンプト/ハーネスの組み合わせを見つけられなかったからです。多くの場合、彼らの言う通りですが、このチュートリアルがローカルモデルがどこまで進歩したか、リバースエンジニアリングにどのように役立つかを示し、人々にローカルAIに挑戦するきっかけを与えることを願っています。
(アーカイブパスワードは crackmes.one です)。元のリンクが切れた場合に備えて、リポジトリ内に代替リンクをホストしています。
Ghidra 12.04 を逆アセンブルとデコンパイルに使用します。これを使用するには OpenJDK 21 をインストールする必要があります: https://github.com/nationalsecurityagency/ghidra
このチュートリアルを作成している間、私はClaude Codeでヴァイブコーディングして、AIで関数や変数の名前を変更するGhidraプラグインを作成しました。プラグインはこちらからダウンロードできます: https://github.com/markoglasgow/Ghidra_FastAIRenamer_Plugin
インストールするには、ghidra_12.0.4_PUBLIC_20260427_FastAIRenamerPlugin.zip ファイルを ${GHIDRA_HOME}\Extensions\Ghidra に移動し、${GHIDRA_HOME}\ghidraRun.bat を実行してGhidraを起動します。プラグインを有効にするには、初期画面のトップメニューで File -> Install Extensions を選択し、プラグインブラウザで FastAIRenamerPlugin の横にあるチェックボックスをオンにして、Ok をクリックします。Ghidraは再起動を促すので、すぐに実行してください。
プラグインを設定するには、次回Ghidraが起動したら、トップメニューで Tools -> Run Tool -> CodeBrowser に移動します。Ghidraが「新しい拡張機能が検出されました。設定しますか?」と表示するので、「はい」をクリックし、再度 FastAIRenamerPlugin の横のチェックボックスをオンにして、Okをクリックします。CodeBrowserが開いたら、トップメニューで Window -> Fast AI Renamer をクリックし、次に Config ボタンをクリックします。ここでAIモデルを設定できます。完了したら、プラグインウィンドウと空のCodeBrowserウィンドウを閉じます。
注: プラグインの読み込みに問題がある場合は、Ghidraでデベロッパーモードを有効にする必要があるかもしれません(File -> Configure -> Developerの横のチェックボックス)。
注: プラグインが読み込まれているかどうかは、CodeBrowserで File -> Configure -> Ghidra Core -> 青い設定ボタンをクリック -> "FastAIRenamer" でフィルター -> 名前の横のチェックボックスがオンになっていることを確認 で確認できます。
注: プラグインをアンインストールするには、最初にCodeBrowserを開き、File -> Configure -> Ghidra Core -> 青い設定ボタンをクリック -> "FastAIRenamer" でフィルター -> チェックを外す -> ok。CodeBrowserを閉じ、初期のGhidraウィンドウで File -> Install Extensions -> "FastAIRenamer" のチェックを外す。最後にGhidraを閉じ、${GHIDRA_HOME}\Extensions\Ghidra から ghidra_12.0.4_PUBLIC_20260427_FastAIRenamerPlugin.zip を削除します。拡張機能が削除されたことを確認するには、次回Ghidraを実行したときに、初期画面で Help -> Runtime Information -> Extension Points -> "FastAIRenamer" でフィルター し、何も表示されないことを確認します。ふぅ。
最後に、Visual Studioまたは他のC++開発環境がセットアップされていることを確認し、適宜クラックミーの解決策をヴァイブコーディングできるようにしてください。
ローカルAIのセットアップは、ハードウェアと利用可能な資金によって大きく異なります。私の場合:
私は Nvidia GTX 3080 を使用しており、Cuda 13.2 がインストールされています。Windowsターミナルで nvcc --version を実行するとCudaのバージョンを確認できます。
私は bartowski の https://huggingface.co/bartowski/google_gemma-4-E4B-it-GGUF/blob/main/google_gemma-4-E4B-it-Q8_0.gguf 量子化モデルを使用しています。迷信かもしれませんが、分析タスクでは可能な限り量子化を少なくし、できれば完全に避けるようにしています。
推論サーバーとして llama.cpp の特定のバージョン llama-b8893-bin-win-cuda-13.1-x64 を使用しています。
llama.cpp を以下のCLI設定で実行しています:```
..\llama-b8893-bin-win-cuda-13.1-x64\llama-server.exe ^
--port 8090 ^
--threads 12 ^
--n-gpu-layers 256 ^
--no-mmap ^
--model "google_gemma-4-E4B-it-Q8_0.gguf" ^
--ctx-size 32768 ^
--temp 1.0 ^
--top-k 64 ^
--top-p 0.95 ^
--offline
これにより `75 tokens/sec` が得られます。これはローカルAIとしてはかなり高速です。
## ハードウェアがなくても大丈夫
利用可能なハードウェアがない、または設定に問題があるが、それでもこのチュートリアルに沿って進めたい場合は、OpenRouterにログインして無料のAPIのいずれかを使用できます。
https://openrouter.ai/models/?q=free
Googleは現在、`Gemma 4 31B` と `Gemma 4 26B-A4B` を(期間限定で)無料で提供しています。
https://openrouter.ai/google/gemma-4-31b-it:free
https://openrouter.ai/google/gemma-4-26b-a4b-it:free
...これらの無料APIは遅く、信頼性が低く、送信したすべてのデータはおそらく内部分析に記録され、次のトレーニング実行に使用されることに留意してください。それでも、このチュートリアルの目的には、これらのAPIで十分に追従できるはずです。
GhidraプラグインがOpenRouterログインを使用するように設定するには、プラグイン設定を開き、次のように入力します。```
Base URL: https://openrouter.ai/api/
API Key: <your OpenRouter API Key>
Model Name: qwen/qwen3-235b-a22b-2507
この例では、qwen3 モデルに対してプラグインを実行します こちら
crackmepls.exe を解凍して実行すると、標準的なログイン画面が表示されます。任意のパスワードを入力すると、「Access Denied」というメッセージが表示されます。```
User: marko
Pass: 123
Access denied
Ghidraを開くには、`ghidraRun.bat`を実行してください。ツールバーで`File -> New Project`を選択し、`Non-Shared Project`が選択されたまま`Next >>`をクリックし、空のプロジェクトディレクトリを選択してプロジェクト名を入力します。その後`Finish`をクリックします。
次に、`File -> Import File`をクリックし、`crackmepls.exe`を選択してプロジェクトに追加します。Ghidraがファイルの詳細をポップアップ表示し、それが`x86:LE:64:default:windows`向けの`Portable Executable (PE)`ファイルであることを通知します。何も変更せずに`OK`をクリックして受け入れます。しばらく待つと、さらにファイルの詳細がポップアップ表示されるので、再度`OK`をクリックして受け入れます。最後に、プロジェクト内の`crackmepls.exe`をダブルクリックしてコードブラウザを開き、逆アセンブルを開始します。