シリーズ振り返り

PART内容主なポイント
01 はじめに・前提知識 ライセンス確認必須・.class はバイトコード・JAR/WAR は ZIP
02 ツール選定ガイド CFR(CLI高精度)・Fernflower(IntelliJ内蔵)・Procyon(ラムダ)・jadx(GUI)
03 .class 単体の逆コンパイル CFR の基本コマンド・デバッグ情報の有無・javap との組み合わせ
04 JAR から一括抽出 CFR に JAR を直接渡す・jadx GUI・内部クラスはディレクトリ指定で解決
05 WAR から抽出 WEB-INF/classes が自前コード・WEB-INF/lib が依存ライブラリ
06 難読化コードへの対処 ProGuard で名前が変わる・mapping.txt があれば復元可・型と構造から推測
07 IDE で活用する IntelliJ は Fernflower 内蔵・VS Code は Java Extension Pack・ソース JAR を紐付け
08(本記事) まとめ 早見表・チェックリスト・参考資料

ツール選定フロー早見表

ツール選定フロー
何を逆コンパイルしたいか?
│
├─ .class ファイル単体
│     └─ → CFR(最も簡単)または IntelliJ で開く
│
├─ JAR ファイル
│     ├─ 探索的に見たい → jadx-gui
│     └─ バッチ・スクリプト化したい → CFR
│
├─ WAR ファイル
│     ├─ 自前コードのみ → WEB-INF/classes を CFR へ
│     └─ 全体を一括 → jadx(WAR を直接渡せる)
│
└─ IDE でそのまま読みたい
      ├─ IntelliJ IDEA → ファイルを開くだけ(Fernflower 自動)
      └─ VS Code → Java Extension Pack が自動処理

ラムダ式が多く可読性が低い → Procyon を試す
難読化されている → ProGuard mapping.txt を探す / 型・構造から推測
どれか迷ったら → まず CFR で試す

作業チェックリスト

事前確認

  • 対象バイナリのライセンス(EULA / OSS ライセンス)を確認した
  • 逆コンパイルの目的が合法的な範囲内であることを確認した
  • OSS ライブラリであれば公式ソース JAR の入手を先に試みた

環境準備

  • JDK がインストールされている(java -version で確認)
  • CFR / jadx などのツールをダウンロードした
  • 出力先ディレクトリを作成した

逆コンパイル実行

  • JAR/WAR のバージョンを確認した(MANIFEST.MF・ファイル名)
  • jar tf で内部構造を把握した
  • 逆コンパイルを実行し、.java ファイルが出力された
  • エラーコメント(/* MISSING */ 等)がないか確認した

解析

  • 難読化の有無を判定した
  • 難読化されている場合は mapping.txt の存在を確認した
  • IDE にソースを取り込んで定義ジャンプが動作することを確認した

「読める」と「分かる」は別物

逆コンパイルでソースコードを取り出すことは技術的に可能だが、 「コードが読める」と「コードが理解できる」は全く別の話だ。

変数名がないコード・ビジネスドメインの知識なしには読めないロジック・ 他システムとの連携前提の処理など、ソースがあっても意図が分からないケースは珍しくない。

逆コンパイルはあくまで「調査の入口」であり、 それ以上の理解には実行トレース・ログ解析・ステークホルダーへのヒアリングを組み合わせることが現実的だ。

⚠️ 逆コンパイルに期待しすぎない

「ソースを取り出せばすぐ移行できる」という期待は禁物。 難読化・最適化・コメントなし・ドメイン知識の欠如など、 逆コンパイル後のコードは読解に相当のコストがかかることを事前に理解しておくこと。

参考リンク・ツールリスト

逆コンパイルツール

  • CFR — Class File Reader Lee Benfield 氏製。単一 JAR で動作する高精度 CLI ツール。最も活発にメンテナンスされている。
  • jadx GUI 付き逆コンパイラ。JAR・WAR・APK に対応。探索的解析に最適。
  • Procyon ラムダ式・invokedynamic の復元精度が高い。Java 8 コードに強い。
  • Fernflower(IntelliJ Community) IntelliJ IDEA 内蔵の分析的逆コンパイラ。CLI 単体でも使用可能。

難読化ツール

  • ProGuard Java / Android の難読化・デッドコード除去ツール。OSS 版あり。
  • R8 Android ビルドツールチェーンに統合された ProGuard 後継。DEX への最適化も行う。

JVM ツール

シリーズ完走おつかれさまでした

全 8 回にわたって Java バイトコードの逆コンパイルを網羅的に解説した。 このシリーズが、ソースのないバイナリを前にした誰かの助けになれば幸いだ。

← シリーズ一覧に戻る