Javaのリバースエンジニアリングの開発期間・スケジュール・納期について

Javaのリバースエンジニアリングにかかる期間は、標準的な規模で3〜6ヶ月、難読化や複数のWAR/EARにまたがる大規模な基幹システムでは6ヶ月〜1年が目安です。

期間を左右するのは、JavaEEやStrutsの構成と、ProGuardなどによる難読化の有無です。なかでも、バイトコードの逆コンパイルと難読化解除への理解が、期間見積もりの精度を左右する最大の鍵になります。

  • 対象:改修対象と業務条件
  • 工程:対象選定から仕様書化まで
  • 確認:品質と運用条件

JavaEE・Strutsで構築された基幹システムの現状分析や仕様書復元に着手を検討している方はもちろん、モダナイゼーション計画の一部として調査工程を進めている方にとっても役立つ内容です。現実的なスケジュールを描くための判断軸が身に付きます。全体の流れを先に押さえたい方は、下の記事もご覧ください。

▼全体ガイドの記事
・Javaのリバースエンジニアリングの完全ガイド

Javaリバースエンジニアリングの開発期間が読みにくい理由(JavaEE/Strutsという構成の特殊性)

Javaのリバースエンジニアリングとは、コンパイル済みのクラスファイル(バイトコード)やJAR・WAR・EAR形式のアーカイブを解析し、失われた設計情報や業務仕様を逆方向にたどって復元する技術です。刷新や移行に着手する前の「分析・調査」工程として位置づけられます。

C#と同じく、JavaはJVM上で動くバイトコードという中間言語にコンパイルされる言語です。COBOLやC言語のようなネイティブコンパイル言語と違い、クラス構造・メソッドシグネチャ・型情報の多くがバイトコードに残っているため、逆コンパイルでソースコードに近い形まで比較的短期間で復元できます。

この特性だけを見れば期間見積もりは容易に思えます。しかし、現場で相談が多いのは、JavaEEやStruts(Struts1・Struts2)で構築された基幹システムです。

この場合は、Javaコードの読解に加えて、XML設定ファイル群、複数のWAR/EARの依存関係、アプリケーションサーバ固有の設定まで調べる必要があります。そのため、期間見積もりの前提が大きく変わります。

バイトコードの「読みやすさ」と「読みにくさ」の二面性

JVMバイトコードは、難読化されていなければクラス名・メソッド名・フィールド名がそのまま残っています。そのため、JD-GUIやCFR、Procyonといった逆コンパイラを使うと、ある程度読めるJavaソースに復元できます。IntelliJ IDEA内蔵のFernflowerも、同じ用途で使えます。

この点はCOBOLやC言語のバイナリ解析に比べて明らかに有利です。ただし、Java言語特有の要素が逆コンパイル結果を歪めることも少なくありません。とりわけJava8以降のラムダ式は、invokedynamicという特殊なバイトコード命令に変換されます。

そのため、多くの逆コンパイラはラムダ式の元のコードを正確に復元できず、不自然な匿名クラスとして出力してしまいます。さらに、ジェネリクスも型消去(Type Erasure)で型情報の多くが失われ、本来の型制約を完全に読み取るのは難しくなります。こうした点から、「バイトコードだから早く終わる」という考えは、見積もりを誤らせる典型的な落とし穴です。

JavaEE/Struts構成が解析工数を押し上げる理由

JavaEEやStruts(Struts1・Struts2)で構築された基幹システムは、複数のWARファイルと、それらを束ねるEARファイルで組まれています。さらに、WebLogicやWebSphere、JBoss/WildFly、Interstageといったアプリケーションサーバ固有の設定情報が絡み合っています。

web.xmlやstruts-config.xml(Struts1)、struts.xml(Struts2)、ejb-jar.xmlは、XML形式のデプロイメント記述子です。これらは画面遷移やアクションマッピング、EJBの呼び出し関係を定めています。そのため、XML群を解析してはじめて、システム全体の業務フローがつかめます。

加えて、Maven(pom.xml)やAnt(build.xml)のビルド定義から依存ライブラリのバージョンを特定する作業も欠かせません。こうした周辺解析の工数は、コード本体の解析工数に対して20〜30%程度の上乗せになることが多いものです。見積もり段階でこの上乗せ分を織り込んでいるかどうかが、後のスケジュール精度を左右します。

ポイント

見積もりの段階で、XML設定や複数のWAR/EARの依存関係の解析を含めているかを見ておくと、後から期間が延びるのを減らせます。

規模・工程別に見る開発期間の目安

対象選定から仕様書化まで、Javaリバースエンジニアリングの4工程と各期間を時系列で示した図
工程ごとの幅を見比べると、後半の調査と文書化にも時間が必要です。

Javaのリバースエンジニアリングは、対象選定から始まり、逆コンパイルと静的解析を経て、動的解析と仕様書化へ進むのが一般的です。そのため、全体のスケジュールを描くには、工程ごとの期間を個別に把握しておく必要があります。

対象選定〜逆コンパイル・静的解析までの期間

対象選定では、開発会社が対象のパッケージとクラスを洗い出し、調査の目的を発注側とそろえます。標準的な規模(クラスファイル数百〜1,000程度)であれば、この工程は1〜3週間が目安です。続く逆コンパイル・静的解析では、逆コンパイラでクラスファイルをJavaソースに近い形へ戻し、パッケージ構成、クラスの継承関係、呼び出し関係を一覧にします。

この工程は、同じ規模で難読化がなければ3〜6週間程度です。ただし、ProGuardなどで難読化されていると、難読化の解除作業が加わり、6週間〜3ヶ月程度に延びることも珍しくありません。また、静的解析の段階でパッケージ依存関係図を作っておけば、次の動的解析との突き合わせがスムーズになり、後工程の手戻りを防げます。

動的解析〜仕様書化までの期間

動的解析では、テスト環境でデバッガを接続し、Strutsのアクションマッピングに沿った画面遷移と、JDBC・Hibernate(JPA)・MyBatis経由のデータベースアクセスを業務シナリオごとに追跡します。たとえば、月次バッチ処理や、特定の権限を持つユーザーだけが通る例外処理の再現には、業務部門へのヒアリングと並行して1〜2ヶ月程度を見込むのが標準的です。

その後の仕様書化(抽象化)では、実装レベルの制御フローを業務機能単位の設計ドキュメントへ、さらに業務仕様書へと引き上げていきます。どこまで細かく文書にまとめるかによって、1〜2ヶ月程度の幅があります。

これらを合算すると、標準的な規模のJavaリバースエンジニアリングは全体で3〜6ヶ月程度、難読化や複数WAR/EARにまたがる大規模な基幹システムでは6ヶ月〜1年に及ぶこともあります。

ポイント

全体の期間は工程ごとの目安を足し合わせて考えるのが基本です。難読化の有無で工程の期間が大きく変わるため、まず難読化されているかを確かめると判断しやすくなります。

開発期間が長期化する主な要因

難読化、EOLフレームワーク、古いJARファイルというJava解析の長期化要因を3枚のパネルで示した図
着手前に把握しにくい技術的な制約が、調査の停滞につながります。

工程別の期間の目安を押さえたうえで、納期が計画どおりに進まなくなる典型的な要因を知っておくことは、現実的なスケジュールを組むうえで欠かせません。

ProGuardなどによる難読化が復元を阻む構造

Androidアプリだけでなく、パッケージ製品として配布されるJavaアプリケーションでも、ソースコード保護のために難読化ツールが使われるケースがあります。ProGuardやyGuardのほか、AllatoriやZelix KlassMasterが使われることもあります。

これらのツールは、クラス名・メソッド名・変数名をa、b、cといった意味のない短い識別子に置き換えます。これをリネーム難読化と呼び、制御フローの複雑化や文字列リテラルの暗号化まで行うこともあります。

難読化されたコードは、逆コンパイルできても、a.b(c, d)のような意味の読み取れない呼び出しが並びます。業務ロジックを読み取るには、膨大な手作業で識別子を一つずつ復元する必要があります。難読化の有無を事前に確認せずに見積もると、着手後に想定の1.5〜2倍の工数が判明するケースがあり、長期化要因になります。

EOLフレームワーク特有のブラックボックス化

Struts1は2013年に公式サポートが終了しています。Struts2も度重なる脆弱性(CVE-2017-5638等)が指摘されながら、十分な対応がされないまま稼働し続けているシステムが少なくありません。

こうしたEOL(サポート終了)フレームワークで構築されたシステムは、当時のライブラリが今では入手困難だったり、ビルド環境の再構築が難しかったりすることが多くあります。逆コンパイルしたソースをビルドし直して動作を検証しようとすると、依存ライブラリのJARファイルが散らばり、Mavenリポジトリからも取得できない古いバージョンが使われていることが分かります。

その結果、解析が停滞し、長期化の要因になります。

ポイント

難読化とEOLフレームワークは、どちらも着手後に判明すると工数が膨らむため、見積もりの前に状況を把握しておくのが安全です。

納期を守るための進め方

JD-GUI、CFR、Procyonの使い分けとXML先行解析を4枚のカードで整理した図
ツールの得意分野を分け、XMLの構造情報を先に活用します。

納期を守るには、長期化の要因に先回りして手を打つことが欠かせません。

逆コンパイラの使い分けによる期間短縮

JD-GUIは軽量で、クラスファイルの中身を素早く確認できるため、初期の全体像をつかむのに使えます。また、CFRは複雑な制御フローやジェネリクスの復元精度に優れ、ラムダ式を含むJava8以降のコードにも比較的強い逆コンパイラです。

Procyonはアノテーションの復元に定評があり、Fernflower(IntelliJ IDEA内蔵)はIDE上で逆コンパイル結果を確認しながら解析を進められる利点があります。そのため、対象コードの特性に応じて、複数の逆コンパイラの結果を突き合わせるのが効果的です。単独のツールでは復元しきれない部分を補い合えるため、解析の精度と速度の両方を高められます。

XML設定ファイルを起点にした構造把握の先行実施

Javaのリバースエンジニアリングが他の言語と比べて有利な理由の一つは、XML形式のデプロイメント記述子を、ソースコードの解析より先に、あるいは解析と切り離して読み解けることです。web.xmlやstruts-config.xml、ejb-jar.xmlなどがそれにあたり、Spring利用時にはapplicationContext.xmlも対象になります。

これらのXMLファイルには、URL・アクションクラス・EJBの対応関係が明示的に記述されています。そのため、逆コンパイル済みのJavaコードを読む前に、まずXML群から機能一覧と画面遷移マップを作っておくと、以降のコード解析の優先順位を決める手がかりになります。

この「XML先行解析」は、ソースコードしか手がかりのないC言語やCOBOLのリバースエンジニアリングにはない、Java・JavaEE特有の期間短縮手法です。

ポイント

進め方を決めるときは、逆コンパイラの使い分けとXML設定の先行解析を初期の計画に入れておくと、納期の見通しを立てやすくなります。

依頼先選定と着手時期が期間に与える影響

同じ規模や技術構成のJavaシステムでも、どのパートナー企業に依頼するか、そしていつ着手するかによって、開発期間は大きく変わります。

JavaEE/Struts解析実績とツール活用力の確認基準

依頼先を選ぶ際は、「Java対応可能」かどうかだけでなく、JavaEEやStruts、EJBといった古いエンタープライズ仕様への対応実績を見ることが大切です。加えて、JD-GUIやCFR、Procyonといった逆コンパイラや、ProGuard難読化解除の実務経験があるかも確かめます。

WebLogicやWebSphere、JBoss/WildFlyといった商用アプリケーションサーバ特有の設定を解析した経験があるかどうかも、着手後の停滞を防ぐうえで見逃せない確認点です。この部分の実績が乏しい依頼先に頼むと、静的解析の途中でJavaEE固有の仕様に当たり、体制を立て直すことになります。その結果、期間全体が想定以上に伸びるリスクが高まります。

着手を先送りするほど期間が伸びる構造

Struts1やEJB2.xといった古いJavaEE仕様に詳しい技術者は、Java全体で見ればまだ多いものの、当時の設計思想やアプリケーションサーバ特有の癖を熟知したベテランは徐々に減りつつあります。加えて、担当者の退職や異動で、「なぜこの画面遷移がこう設計されているのか」という業務ロジックのWhyを語れる人材が失われると、解析後半のヒアリングが滞り、期間が延びます。

「システム担当者が退職予定のため、急いで知識を残したい」というきっかけで動き出すプロジェクトも多くあります。ただし、退職の2〜3ヶ月前では、十分な期間を確保できないまま計画を進めざるを得ません。有識者が在籍しているうちに、対象選定と現状の洗い出しだけでも早めに着手しておくことが、期間を現実的に管理する最も有効な備えです。

ポイント

依頼先は、古いJavaEE仕様とアプリケーションサーバの解析実績で選び、着手は有識者が在籍しているうちに早めに始めるのが安全です。

まとめ

Javaのバイトコードは中間言語のため、逆コンパイルによる復元はCOBOLやC言語のネイティブバイナリより進みやすいものです。ただし、JavaEEやStrutsという構成や、ProGuardなどによる難読化が絡むと、期間は長くなります。標準的な規模で3〜6ヶ月、難読化や複数のWAR/EARにまたがる大規模な基幹システムでは6ヶ月〜1年以上を見込む必要があります。

納期の遅れを防ぐうえで特に大切なのは、逆コンパイラを使い分けて解析の精度を高めることと、XML設定ファイル群を先に解析して全体の構造を早く把握することです。JavaEE/Struts解析の実績がある信頼できる依頼先に、有識者が在籍しているうちに早めに相談することをお勧めします。

▼全体ガイドの記事
・Javaのリバースエンジニアリングの完全ガイド

会社紹介

株式会社riplaでは、お客様の事業・ユーザー・業務に最適化したオーダーメイド型システムを、構想策定・要件定義から開発・改善まで一気通貫で支援。事業会社でIT・DXを経験したプロフェッショナルによる高い要件定義力・システム設計力を活かし、事業成果の最大化に伴走します。

また、当社独自の開発テンプレート「Boxシリーズ」による標準機能の高速開発と、AI駆動開発の独自フレームワーク「GoDD」による独自機能のAI実装を組み合わせることで、低コスト・短期間で開発を実現いたします。

もし、システム開発やプロダクト開発に関するご要望がございましたら、お気軽にお問い合わせください。

・サービス概要資料のURLはこちら >>>
・お問合せページのURLはこちら >>>
・お役立ち資料のURLはこちら >>>

執筆者プロフィール
張田谷凌央
張田谷凌央

株式会社ripla 代表取締役CEOとして、システムパッケージ活用、システム開発、データ分析、生成AI活用、SaaS開発、アプリ開発、EC構築など、幅広い領域で企業のDX推進と事業成長を支援している。事業会社でIT・DXを経験したプロフェッショナルが集う株式会社riplaにおいて、お客様の事業・ユーザー・業務に最適化したオーダーメイド型システムを構想策定・要件定義から開発・改善まで一気通貫で支援し、単なるシステム納品にとどまらず、クライアントと同じ目線で事業成果の最大化に向けた伴走支援を行う。早稲田大学卒業後、ラクスル株式会社、LINEヤフー株式会社にて事業開発やDX推進などに従事した後、株式会社riplaを創業。