Androidのリバースエンジニアリングの進め方/やり方/流れや方法/手法/工程/手順

Androidアプリのリバースエンジニアリングは、セキュリティ診断や既存アプリの仕様復元、競合調査などさまざまな場面で求められる技術です。しかしAPK(Androidアプリケーションパッケージ)の解析にはAndroid固有の知識が必要であり、ProGuardによる難読化や法的リスクへの対応など、適切な手順で進めなければ途中で行き詰まることも少なくありません。

この記事では、Androidのリバースエンジニアリングの基本的な仕組みから、実際の6工程、注意すべきポイント、法的リスクへの対処法、外注と内製の判断基準まで体系的に解説します。社内エンジニアが自社アプリのセキュリティ診断を行う場合から、業務システムのリバース解析を外注する場合まで、幅広い読者の疑問に答える内容となっています。

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

AndroidのリバースエンジニアリングとはAndroid固有の特性

Androidのリバースエンジニアリングとは

Androidのリバースエンジニアリングとは、APK形式で配布されたAndroidアプリを逆方向に解析し、その内部構造・ロジック・仕様を明らかにする行為を指します。iOSや他のプラットフォームとは異なるAndroid固有の技術特性を理解することが、成功への第一歩です。

APKとDalvik/ART:Androidアーキテクチャの基礎

AndroidアプリはAPK(Android Package)という圧縮ファイル形式で配布されます。APKの中には、JavaコードがコンパイルされたDEX(Dalvik Executable)ファイルが格納されており、このDEXはDalvikまたはART(Android Runtime)という仮想マシン上で動作します。iOSのネイティブバイナリ(ARM機械語)と違い、DalvikバイトコードはSmaliという中間アセンブリ言語に変換可能であり、さらにAPKToolやjadx、Procyonといった逆コンパイラを用いれば、ほぼ元のJavaコードに近い形で復元できるのが大きな特徴です。

APKを解析する際の基本的な流れとしては、まずAPKToolを使ってAPKファイルを展開し、Smali形式の中間コードとリソースファイルを取得します。次にjadxやProcyonを用いてSmaliをJavaコードに逆コンパイルすることで、開発者が当初書いたロジックに非常に近い状態のコードを閲覧できるようになります。この点においてAndroidはiOSに比べて解析ハードルが低く、オープンソースの開発者向けツールが豊富に揃っているため、社内エンジニアが独力で対応できる場面も少なくありません。

主な用途:セキュリティ診断・仕様復元・ROM解析

AndroidリバースエンジニアリングはISO 27001等のセキュリティ基準への適合を求められる企業において、自社アプリの脆弱性診断として活用される場面が最も多くなっています。具体的には、平文での通信内容の確認、隠蔽されたAPIキーの検出、セッション管理の不備の発見などを目的として実施されます。次に多い用途が仕様書の復元で、開発担当者が退職しドキュメントが失われた社内Androidアプリについて、APK解析によってロジックを読み解き設計書を再構築するというケースです。

さらに、AOSPと呼ばれるAndroidのオープンソースプロジェクトを利用したカスタムROM解析も特殊なニーズとして存在します。組み込みAndroid機器(産業用端末、医療機器、POS端末など)のファームウェアをリバース解析し、機器の動作仕様を理解したり、セキュリティ上の問題点を洗い出したりする用途です。また、Binwalkを使ってSPIフラッシュから抽出したバイナリを解凍し、PEM DSA秘密鍵やOpenSSH公開鍵を直接発見した事例のように、Android/Linux系組み込み機器の解析においても類似した手法が有効に機能します。

Androidのリバースエンジニアリング6工程

Androidリバースエンジニアリングの工程

Androidのリバースエンジニアリングを成功させるには、目的に合わせた計画的な工程管理が不可欠です。以下に示す6工程は、解析の開始から成果物の完成まで、実務で繰り返し確認されてきた標準的な進め方です。

工程1:対象選定・目的の明確化

最初のステップは「何のためにリバースエンジニアリングを行うか」を明確にすることです。自社アプリのセキュリティ診断なのか、仕様書が失われた社内アプリの設計復元なのか、カスタムROM機器の動作確認なのかによって、必要なツールも解析の深度も大きく異なります。目的が曖昧なまま着手すると、解析範囲が際限なく広がり工数が膨張するリスクがあります。

また、対象APKが自社の著作物であるかどうか、解析の目的が著作権法第30条の4に定める「非享受目的」(マルウェア解析・セキュリティ調査・仕様書復元など)に該当するかを事前に確認しておくことも必須です。平成30年の著作権法改正によってこれらの目的でのリバースエンジニアリングは原則合法化されましたが、EULAの禁止条項や不正競争防止法への抵触リスクは残ります。解析目的と法的根拠を文書化した上で作業を開始することが、後々のトラブル回避につながります。

工程2:解析環境・ツール準備

Android解析に特化したツールセットを整備します。主要なツールとしては、APK展開と再パッケージに対応するAPKTool、SmaliコードをJavaコードに変換するjadxまたはProcyon、Java用逆コンパイラのCFR、動的解析に必要なFrida(動的計装フレームワーク)とBurp Suite(通信傍受プロキシ)が挙げられます。ネットワーク通信を解析する場合はAndroidエミュレータ上でMITMプロキシを設定する環境構築も必要です。

解析環境は必ず隔離されたサンドボックス環境(専用の仮想マシンやエミュレータ)上に構築してください。本番端末での解析作業は避けるべきです。また、解析過程をスクリーンショットやログファイルとして記録しておくことで、後々「非享受目的であった」ことを証明する際の根拠資料になります。この記録習慣は、Pythonスクリプトで4,096バイトずつ分割してファームウェアを200万バイトプレーンテキスト化した事例でも実証されているように、大規模解析において特に重要な実務慣行です。

工程3:静的解析(逆コンパイル・コード読解)

APKToolでAPKを展開した後、DEXファイルをjadxで逆コンパイルしてJavaコードを取得します。最新のjadxは精度が高く、ほぼ元のJavaコードに近い形で復元できます。ただしProGuardによる難読化が施されているアプリでは、クラス名がa、b、cのような意味不明の単文字に、メソッド名もa1、b2のようなランダムな名称に置き換えられているため、復元コードの可読性が著しく低下します。ProGuardはAndroidアプリ開発で標準的に利用される難読化ツールであることを念頭に置き、静的解析だけで完全なロジック理解を得ようとせず、次の動的解析と組み合わせる前提で進めることが重要です。

静的解析では、AndroidManifest.xmlから宣言されているパーミッション・コンポーネント構成・エクスポートされたActivity/Service/BroadcastReceiverを確認し、攻撃対象領域(アタックサーフェス)を把握することから始めます。続いてStringsファイルやres/rawディレクトリにハードコードされた認証情報・APIキー・エンドポイントURLが存在しないかを確認します。これらの発見だけでセキュリティ診断の主要な知見を得られることも多く、費用対効果の高いアプローチです。

工程4:動的解析(デバッガ・実行トレース)

動的解析とは、アプリを実際に実行しながらその挙動をリアルタイムで観察する手法です。Fridaを用いることで、実行中のAndroidアプリ内のメソッドにフックを仕掛け、引数や戻り値を動的に取得したり、ロジックを書き換えたりすることが可能です。ProGuardで難読化されたコードであっても、実行時には実際のクラス名とメソッドが復元されているため、Fridaによるフックと静的解析で得たSmaliコードを組み合わせることで、難読化を「迂回」した解析が実現できます。

ネットワーク通信の解析にはBurp Suiteが標準的に利用されます。AndroidエミュレータにBurp SuiteのCA証明書をインストールし、HTTPS通信を復号・傍受することで、APIの通信仕様・認証フロー・データ構造を把握できます。ただしAndroid 7.0以降はネットワークセキュリティ設定によってユーザー証明書の信頼が制限されているため、エミュレータのroot化またはAPKの再パッケージが必要になる場合があります。動的解析は静的解析で理解しきれなかった処理フローを補完する強力な手法ですが、実際の通信を伴う解析は必ず適切な許可のもとで実施してください。

工程5:抽象化(Design Recovery:実装→設計→仕様)

静的解析と動的解析で得られた情報を統合し、実装レベルの知識を設計レベル・仕様レベルへと段階的に抽象化する工程がDesign Recoveryです。具体的には、逆コンパイルされたJavaコードのクラス間の依存関係を整理してクラス図を作成し、メソッドの呼び出し関係からシーケンス図を起こし、状態遷移を整理してActivity遷移図やステートマシン図を作成します。難読化によって変数名・クラス名が意味不明になっている場合でも、実際の動作挙動と照合することでビジネスロジックの意味を推定できます。

ただし、「コードがどう動くか(How)」はリバースエンジニアリングで復元できますが、「なぜその仕様なのか(Why)」は元の開発者や業務部門の担当者でなければ分からないケースが多くあります。この点がリバースエンジニアリングの本質的な限界であり、業務システムの仕様復元プロジェクトでは元の担当者や業務ユーザーへのヒアリングをDesign Recoveryと並行して実施することが成功の鍵となります。

工程6:成果物化(仕様書・新システム設計)

解析で得た知見を成果物として文書化します。成果物の粒度は目的によって大きく異なります。セキュリティ診断であれば脆弱性レポートと対策提案書、仕様書復元であれば画面遷移図・DB設計・API仕様書・業務フローチャートといった詳細設計書レベルの文書群が求められます。単なるフローチャートの提供に留まるのか、新システム開発に直接使える詳細設計書まで作成するのかによって費用と工数が大きく変わるため、発注前に成果物の粒度を明確に合意しておくことが重要です。

成果物化の際には「変換後コードの保守性」も評価基準に含めるべきです。逆コンパイルで復元されたコードは、ProGuardによる難読化解除後も変数名が意味不明のままであることが多く、そのままでは若手エンジニアが保守できる品質にはなりません。ベンダーに外注する際は、変数名の再命名・コメント付与・業務ロジックの背景説明(Why)のドキュメント化を成果物要件に明示的に含めることを強く推奨します。

Android固有の注意点と典型的な失敗パターン

Androidリバースエンジニアリングの注意点

Androidのリバースエンジニアリングには、プラットフォーム固有のハードルが存在します。事前にリスクを把握しておくことで、プロジェクトの失敗を未然に防ぐことができます。

典型的な失敗パターン3選

最も多い失敗パターンは「ProGuardの難読化を過小評価したケース」です。ProGuardはAndroid Studio標準搭載の難読化ツールであり、リリース版APKには高い確率で難読化が施されています。難読化解除には相応の工数がかかるため、見積もり段階で難読化の有無と深度を確認せずに固定価格で契約すると、後から工数が大幅に膨らむトラブルになります。

二番目の失敗パターンは「静的解析だけで完結しようとするケース」です。特に実行時に動的に生成されるコードやReflection APIを多用するアプリでは、静的解析だけでは全体像を把握できません。Fridaを用いた動的解析と組み合わせることで初めて正確な理解が得られますが、動的解析環境の構築に慣れていないチームが静的解析のみで報告書を作成してしまうケースがあります。三番目は「Play StoreポリシーへのリスクとGoogle規約の確認不足」です。Play Storeは「他のアプリの解析・改変」を明示的に制限しており、他社アプリの解析を商業目的で行う場合はこれらのポリシーとの整合性を法務担当者と事前確認することが必須です。

難読化・暗号化への対処法

ProGuardによる基本的な難読化はjadxの最新版でほぼ解除できますが、より強力な商用難読化ツール(DexGuard、Guardsquare等)が使われている場合は解除難度が跳ね上がります。こうした強固な難読化に対しては、静的解析での完全な復元を諦め、動的解析で実際の挙動を観察するアプローチに切り替えることが現実的です。

ネイティブコード(NDK経由のC/C++ライブラリ)が組み込まれているアプリでは、DEX逆コンパイルだけでは不十分です。.soファイルとして格納されたネイティブライブラリの解析にはGhidraやIDA Proといったバイナリ解析ツールが必要になります。Ghidraは米国NSAが開発したオープンソースの逆アセンブラで無償利用できるため、コスト重視であればまずGhidraから試みることをお勧めします。一方、チーム複数名で協調して解析プロジェクトを進める場合はGhidraのプロジェクト共有機能が特に有効です。

リバースエンジニアリングの法的リスク回避

AndroidリバースエンジニアリングにはiOS以上に法的グレーゾーンが生じやすい側面があります。オープンな開発環境ゆえにツールが揃っている一方、不適切な使い方をすると著作権法・不正競争防止法・Play Storeポリシーの複数の法令に同時に抵触するリスクがあります。

クリーンルーム手法の実務的運用

クリーンルーム手法とは、解析を担当するチーム(Dirty Room)と新たな実装を担当するチーム(Clean Room)を完全に分離し、両チームの間に法務・仲介担当者を配置することで著作権侵害の「依拠性」を回避するアプローチです。1980年代のフェニックス・テクノロジーズ対IBM BIOS訴訟の判例でその有効性が確立され、現在も大規模なリバースエンジニアリングプロジェクトでは標準的な法的防衛手法として採用されています。

Androidプロジェクトでの実務的な運用では、解析チームが作成した仕様書を法務担当者がレビューし、著作権保護対象の「表現」(具体的なコードの記述)が混入していないかを確認した上で、開発チームに渡します。開発チームは元のAPKを一切見ずに、法務チェック済みの仕様書だけを基に新たな実装を行います。この手順を踏むことで、競合他社のAndroidアプリと機能互換を持つ製品を著作権侵害なく開発することが法的に認められています。

非享受目的での記録方法と立証準備

著作権法第30条の4は「著作物を享受することを目的としない利用」を原則合法としており、セキュリティ診断・マルウェア解析・仕様書復元・機械学習のデータ収集などがその典型例とされています。しかし、将来的な法的紛争に備えるには、解析目的を事前に文書化し、専用の解析環境を用意し、解析過程をレポートや作業ログとして記録することが重要です。「この解析はセキュリティ診断目的であり、アプリのコンテンツを享受・利用するためではない」という事実を、客観的に立証できる形で残しておくことが肝心です。

EULAに「リバースエンジニアリング禁止」の条項が含まれている場合でも、互換性(インターオペラビリティ)の確保のためにリバースエンジニアリングが不可欠な場合は、当該条項が独占禁止法上の「不公正な取引方法(拘束条件付取引)」に該当し無効となる可能性があります。ただしこの判断には専門的な法的分析が必要なため、外部弁護士への事前相談を強く推奨します。

外注 vs 内製の判断軸:Androidならではの考え方

外注と内製の判断基準

Androidのリバースエンジニアリングは他のプラットフォームと比較して解析ツールが充実しており、社内エンジニアが内製で対応できる範囲が広い特徴があります。一方で、プロジェクトの目的・規模・難読化レベルによっては外注が合理的な選択となる場合もあります。

社内対応が適するケース

社内エンジニアが内製対応できるケースの典型は、自社開発Androidアプリの定期的なセキュリティ自己診断です。APKTool・jadx・Fridaはいずれも無償で利用でき、Androidアプリ開発経験のあるエンジニアであれば比較的短期間で習得できます。自動ツールによる診断(MobSF等のモバイルセキュリティフレームワーク)を活用すれば10〜30万円程度のコストで網羅的なチェックが可能です。自社アプリの難読化レベルを把握した上で、既知のリスクを定期確認する目的であれば内製対応が最も費用対効果の高い選択です。

AOSPを活用した自社カスタムROM機器の解析や、自社開発アプリのアーキテクチャ理解を目的とした仕様書整備なども内製対応が現実的です。これらのケースでは、対象の業務知識を持つ社内エンジニアが主体的に関わることで、「Why(なぜその仕様か)」の理解と「How(どう動くか)」の解析を一体で進められる利点があります。

外注が必要になるケースと選定基準

外注が推奨されるのは以下のような状況です。強力な商用難読化(DexGuard等)が施されており内製チームで解除困難な場合、ネイティブコード(NDK)を多用した高難度アプリの解析が必要な場合、第三者機関による客観的なセキュリティ診断レポートが必要な場合(監査・認証取得など)、そして大規模な業務システムAndroidアプリの詳細仕様書を復元してモダナイゼーションにつなげる場合です。手動診断(標準)では50〜150万円、モバイルアプリの高精度診断では50〜250万円程度が相場となっており、目的に応じた適切な規模感での発注が重要です。

外注先の選定では、Androidアプリの解析実績(特にProGuard難読化解除の経験)、クリーンルーム手法を自社プロセスとして運用できる体制、法務・仲介担当者の配置有無、成果物として「保守性の高い仕様書」を提供できるかの4点を重点的に確認してください。セキュリティ専門企業と業務システムSIerでは得意領域が異なるため、解析目的がセキュリティ診断であればセキュリティ専門企業、仕様書復元・モダナイゼーションであれば業務システムSIerを優先的に選定することをお勧めします。

まとめ

まとめ

AndroidのリバースエンジニアリングはAPK(DalvikバイトコードおよびARTバイトコード)という中間言語形式のおかげで、iOSや他のプラットフォームと比較して解析ツールが豊富であり、APKTool・jadx・Fridaを組み合わせることでほぼ元のJavaコードを復元できます。一方で、ProGuardによる難読化が標準的に施されているため、復元コードの変数名・クラス名が意味を持たないことが多く、静的解析と動的解析の両輪で補完し合うアプローチが不可欠です。

6工程(目的明確化→ツール準備→静的解析→動的解析→Design Recovery→成果物化)を計画的に実施し、法的リスクについてはクリーンルーム手法と非享受目的の記録管理で対応することで、適法かつ有益なリバースエンジニアリングプロジェクトを実現できます。内製か外注かの判断は、解析目的・難読化レベル・社内エンジニアの習熟度の3点を基に行い、外注の場合は成果物の保守性まで含めた仕様書を発注前に明確化することが成功の鍵です。

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

株式会社riplaでは、IT事業会社出身のプロフェッショナルが「Impact-Driven型支援」を通じて、プロダクトやシステムの納品・提供を目的とせず、お客様と同じ目線で、事業成果の達成をゴールとして、高品質なDX/開発支援をいたします。

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

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

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

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

株式会社ripla 代表取締役CEOとして、システムパッケージ活用、システム開発、データ分析、生成AI活用、SaaS開発、アプリ開発、EC構築など、幅広い領域で企業のDX推進と事業成長を支援している。IT事業会社出身のプロフェッショナルが集う株式会社riplaにおいて、「Impact-Driven型支援」を掲げ、単なるシステム納品にとどまらず、クライアントと同じ目線で事業成果の実現に向けた伴走支援を行う。早稲田大学卒業後、ラクスル株式会社、LINEヤフー株式会社にて事業開発やDX推進などに従事した後、株式会社riplaを創業。