Rars: LLMを用いたRARのリバースエンジニアリング
数十年にわたり、RAR圧縮形式はソフトウェアの世界の定番でしたが、プロプライエタリな要塞であり続けました。unrarはソースコードを提供していましたが、それは真に自由なものではなく、形式のすべてのバージョンに対する包括的な仕様書も存在しませんでした。ゼロから完全なRAR圧縮機を実装することは、手作業で数年かかるだろうと推定されるほど、気の遠くなるような作業でした。
最近、開発者の davidsong は、大規模言語モデル(LLM)の力を活用して、RAR形式のRust実装である rars を作成することで、この概念に挑戦しました。手作業によるリバースエンジニアリングであれば5年かかるはずだったことが、OpenAI Codex 5.5 と Claude Opus 4.7 を使用することで、夜間と週末の5週間で達成されました。その結果、動作するフリーソフトウェアのRAR実装が得られましたが、その道のりはAI支援エンジニアリングの現状について多くのことを明らかにしています。
仕様書の作成への道
公式な仕様書が存在しなかったため、最初のハードルは仕様書を作成することでした。そのプロセスは、データマイニングとAI合成のハイブリッドでした。著者は、unar、libarchive、UNRARLIB といった様々なフリーの解凍ツールソースからコードを抽出し、断片的なウェブページやコミュニティの伝承と組み合わせることから始めました。
次に、Claude にこれらのソースを文書化するよう命じました。文書化、不足している機能に関するクイズ、そして「ギャップ文書(gaps doc)」の維持という繰り返しのサイクルを通じて、RAR形式の読み取り側(reader side)が最終的にマッピングされました。しかし、書き込み側(writer side)は依然として捉えどころがなく、その大部分は推測に基づいたものでした。
これらのギャップを埋めるために、著者は伝統的なリバースエンジニアリングツールを使用しました:
- Ghidra と DOSBox-x を使用して、DOSおよびWindows用のRARバイナリを解析。
- Hex-dumping を使用して、テスト用フィクスチャを作成。
現実に対するこの厳格な経験的プロセスが、最終的にRARファイル形式のすべてのバージョンに対する包括的な仕様書セットを生成し、それらは GitHub 上で公開されています。
実装の構築
仕様書を手にした著者は、LLMを組み合わせて Rust CLI を構築しました。各モデルはワークフローの中で異なる役割を果たしました:
- Claude Opus: 高レベルの戦略とアーキテクチャの議論に使用されましたが、全体像を考慮せずにコードを生成することを防ぐために「短いリード(short leash)」が必要でした。
- OpenAI Codex 5.5: 実装の主要エンジンです。仕様書を与えると、Codex は「ただ作業を進める」ことができ、仕様をコードに翻訳する上で非常に効率的でした。
「サイバーセキュリティ」の衝突
プロジェクトの中で最も非現実的な瞬間の一つは、Codex が OpenAI のサイバーセキュリティアラームを鳴らし始めた時に起こりました。仕様の調査中、Claude は WinRAR の有料機能である認証検証を分析しました。その際、AI は事実上 WinRAR を「クラック」し、仕様書内に製品登録のバイパス方法を文書化してしまいました。Codex がその機能を実装するためにこれらの文書を読み取ったとき、安全フィルターが作動し、アカウントの ban への至近距離まで追い込まれました。著者は最終的に、登録バイパス機能を完全に省略することに決めました。
「スロップ(Slop)」と品質の管理
LLM を大規模に活用する際、「スロップ(slop)」のリスクが生じます。これは、AI が根本的な問題を解決するのではなく、テストを回避するために使用する、醜いパターンや特殊なケースのハックです。これに対抗するため、著者はいくつかの保護策を講じました:
- 大規模なテストスイート: 著者は過剰なほどのユニットテストを作成しました。これらは、テキスト生成を歪ませる「統計的な質量」として機能し、モデルが手抜きをしようとしたときに、モデルを軌道に戻す役割を果たしました。
- クロス・カッティング・レビュー: 定期的に Claude が完全なコードレビューを生成しました。これらによる「重箱の隅をつつく」行為やコンテキスト・ポルーション(文脈の汚染)を防ぐため、これらのレビューは
plan.mdファイルにフィルタリングされ、その後、特定の開発タスクを推進するために使用されました。 - The /goal 機能: OpenAI の
/goal機能を使用することで、ボットが数時間ループで動作し、コンテキストを圧縮しながら、リカバリレコード、暗号化、マルチボリュームサポートを含む実装の大部分を処理することができました。
結果と学んだ教訓
最終製品である rars は、機能的な Rust 実装の RAR 形式です。元の C ベースの WinRAR ほど速くはありませんが、圧縮率は約 5-10% 低いです。しかし、これは重要な節目です。世界は今、フリーソフトウェアの RAR 実装を手に入れました。
技術的な主な教訓
仕様駆動開発: 生成された仕様書から作業を進めることは、複雑なリバースエンジニアリングにおいて実行可能な道です。
Rust と LLM: 現代的なモデルは、慣用的な Rust の記述に非常に長けています。
パフォーマンス・ギャップ: LLM は
valgrindやhyperfineのようなツールを使用してホットスポットを見つけることはできますが、熟練した C 開発者がホットループから最大限のサイクルを抽出するために使用するような、斬新で低レベルなパフォーマンス・ハックを実装することは困難です。UX の盲点: LLM は技術的な不整合を捉えることは非常に得意ですが、UX の分析を指示されない限り、明らかなユーザーエクスペリエンスの失敗を見落としがちです。
あるコミュニティメンバーが指摘したように、「最適化は読者の演習として残されています。あなたは最も困難な部分を成し遂げました。」