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

Flutterアプリのリバースエンジニアリングは、対象と目的を決めるところから始めて、成果物をまとめるまで、工程を順に進めるのが基本です。

各工程にはDart特有の注意点があり、汎用的な手順をそのまま当てはめても、十分な成果は得られません。

  • Flutter・Dartバイナリの基礎と解析の前提
  • 対象選定から成果物化までの6工程
  • 静的解析・動的解析・証明書ピンニングへの対応
  • 法的リスク、クリーンルーム、外注と内製の判断

Flutterのリバースエンジニアリングの全体像

Flutterのリバースエンジニアリングとはとどんのような全体像か

Flutterのリバースエンジニアリングとは、Dart言語とFlutterフレームワークで作られたアプリのバイナリを解析し、内部のロジックやAPI仕様、データ構造などを復元する技術的な行為です。iOSやAndroidのネイティブアプリとは解析のアプローチが大きく異なるため、Dart特有の知識と専用ツールが求められます。

Dart言語と他言語との違い・特性

FlutterはDart言語を使い、AOTコンパイルによって各プラットフォーム向けのネイティブバイナリを生成します。AndroidではELF形式(libapp.so)、iOSではMach-O形式のバイナリとして出力されますが、その内部にはDart独自の「スナップショット形式」が埋め込まれています。

このスナップショット形式は、標準的なELFやMach-O解析ツールでは解読が困難で、IDA ProやGhidraのような汎用逆アセンブラだけでは、実用的な情報を引き出しにくい特性があります。さらに、SwiftやKotlinに比べると、Dart AOTバイナリはシンボル情報が少なく、関数名やクラス名の多くがストリップされているため、解析の難易度は高い水準にあります。

一方で、FlutterはiOS版とAndroid版を単一のDartコードベースから生成します。そのため、一方のプラットフォームのバイナリを解析すれば、もう一方のビジネスロジックも実質的に把握できるという独自の特性があります。この点は、Swift(iOS専用)やKotlin(Android専用)と比べた大きな違いです。

主な用途(セキュリティ診断・仕様書復元・互換性確保)

Flutterアプリのリバースエンジニアリングが活用される主な場面は、脆弱性診断・セキュリティ監査、仕様書が失われたシステムの業務ロジック復元、競合製品の技術調査(著作権法30条の4に基づく非享受目的)です。特にセキュリティ診断の文脈では、Flutter製アプリが扱う個人情報や決済データが不正に傍受されないかを検証するために実施されるケースが急増しています。

また、仕様書復元の文脈では、開発会社との契約終了後にソースコードの引き渡しが不完全だったFlutterアプリについて、バイナリから業務フローを再構築したいというニーズが多く見られます。ただし、Dartバイナリから直接ソースコードに近い形まで復元することは難しく、API通信パターンや画面遷移ロジック、データ構造は解析によって把握できます。

ポイント

解析の目的が脆弱性診断か、仕様書の復元か、競合製品の調査かによって、必要な解析の深さと手法が変わります。最初に目的を決めておくと、以降の工程で必要な手法とツールを絞り込めます。

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

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

工程は、対象選定から成果物化まで6つを、この順番どおりに進めます。最初に対象選定と目的があいまいなままだと、後続の工程全体の品質に響くためです。各工程にはFlutter・Dart特有の考慮事項があり、汎用的なリバースエンジニアリングの手順をそのまま当てはめても、十分な成果は得られません。そこで、工程ごとに、特有の考慮事項を見ていきます。

1. 対象選定・目的明確化

最初の工程では、解析対象のFlutterアプリと目的をはっきり定めます。目的によって解析の深さとアプローチが大きく変わるため、この段階で曖昧さが残ると、後続工程全体の品質に響きます。

たとえば、「API通信の仕様を把握したい」「認証ロジックを理解したい」「脆弱性を発見したい」では、必要な解析手法と使うツールがそれぞれ異なります。

対象のFlutterバージョンを確認することも、重要なステップです。バイナリ構造やDartスナップショットの形式はバージョンごとに異なるため、解析ツールの対応バージョンと照合する必要があります。APKやIPAファイルのメタデータ、またはpubspec.lockファイルがあれば、そこからFlutter・Dartのバージョンを特定できます。

2. 解析環境・ツール準備(Flutter特化ツール)

Flutter解析で最も重要なツールは「blutter」で、Dart AOTバイナリを解析するオープンソースツールとして、2023年以降に急速に注目を集めています。解析環境では、次のツールと設定を準備します。

  • blutter:GhidraやIDA Proの汎用逆アセンブル機能を補いながら、Dartのクラス構造、メソッド名、文字列定数を復元します。
  • Ghidra:blutterのプラグインとして動作するため、本体のインストールも必要です。
  • MITMProxy:Man-in-the-Middle Proxyとして、API通信を中継する仕組みです。
  • frida:動的計装フレームワークです。

API通信の解析では、MITMProxyの設定も欠かせません。Flutter製アプリの多くはhttpパッケージやDioで通信しますが、証明書ピンニング(Certificate Pinning)があると、MITMProxyを導入しただけでは傍受できません。そのため、fridaを使った証明書ピンニング回避も、解析環境の一部として準備する必要があります。

3. 静的解析(逆コンパイル/逆アセンブル)

静的解析では、まずAPKファイルを解凍して、libapp.so(AndroidのDartバイナリ)を取り出します。apktoolやapk-mitm等のツールを使ってAPKのZIPアーカイブを展開すると、lib/arm64-v8a/ディレクトリ内にlibapp.soとlibflutter.soが確認できます。このうち、アプリのビジネスロジックを含むDart AOTバイナリはlibapp.soです。

blutterでlibapp.soを解析すると、Dartのクラス定義、メソッドシグネチャ、文字列リテラルが抽出されます。これにより、APIエンドポイントのURLパターン、データモデルのフィールド名、処理フローの概要を把握できます。ただし、Dart AOTバイナリはシンボル情報が限定的なため、変数名や詳細な実装ロジックを完全に復元することは困難です。

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

動的解析では、実際にアプリを実行しながら挙動を観察します。なかでも最も効果的なのは、fridaを使ったDynamic Instrumentationです。これにより、関数呼び出しのフック、引数の確認、返り値の取得を、実行時に行えます。

Flutter/Dartアプリでは、fridaのDartブリッジを活用すると、Dartの関数レベルでのフックが可能です。そのため、APIリクエストを生成する直前のデータを平文で取得できます。Dioを使うアプリでは、通信処理がHttpClientではなくDioのインターセプターレベルで行われるため、fridaでDioのinterceptorsを直接フックする手法が有効です。

MITMProxyと証明書ピンニング回避の組み合わせも、動的解析の代表的な手法です。そのうえで、通信内容から、APIのエンドポイント一覧、リクエストスキーマ、レスポンス形式を体系的に記録します。

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

この工程では、解析で得た低レベルの情報(アセンブリコード、通信ログ、関数シグネチャ)を、段階的に抽象化して設計や仕様のレベルへ引き上げます。たとえば、blutterが出力するDartクラス構造をもとに、画面遷移図、状態管理フロー(Riverpod/Bloc/Providerなどの利用状況)、API定義書を作成します。

業務ロジックのWhy(なぜその仕様になっているか)は、バイナリ解析では復元が難しく、業務部門の担当者へのヒアリングで補う必要があります。Flutterアプリの画面UIは実行時に確認できるため、UIを観察して業務フローの意図を推測し、ヒアリングと組み合わせるのが実務上の正攻法です。

コードから分かるHow(どう動くか)と、業務知識から補うWhyを統合して初めて、完全な仕様書が完成します。

6. 成果物化(仕様書/新システム設計)

最終工程では、解析結果を目的に応じた成果物にまとめます。成果物の粒度は大きく3段階に分かれ、最もシンプルなのがフローチャートです。フローチャートは処理の流れを図示したもので、仕様書復元プロジェクトの第一歩として使われます。

業務仕様書は、画面遷移、データ入出力、業務ルールを文章にまとめたもので、新システム開発の要件定義に活用できます。詳細設計書は、DB設計、API仕様書、シーケンス図まで含む、最も精度の高い成果物です。

成果物の品質基準として、「若手エンジニアが読んで保守・改修できる水準か」を明示しておくことが大切です。具体的には、変数名の復元可否、コメントの有無、業務ロジックの背景説明の有無を納品前チェックリストに含めると、引き渡し後のトラブルを大幅に減らせます。

ポイント

Dart特化ツールと動的解析を、工程の計画に最初から組み込んでおくことが目安です。汎用ツールだけで済ませると、Dartのクラスや文字列との対応が取れず、実用的な情報が得にくくなります。

Flutter固有の注意点と難しさ

Flutter固有の注意点と難しさ

Flutterアプリのリバースエンジニアリングには、ほかのモバイルプラットフォームには見られないDart特有の困難があります。対処法を知らないまま解析に着手すると、多大な工数をかけたわりに成果が得られないおそれがあります。

典型的な失敗パターン

最もよくある失敗は、「IDA ProやGhidraだけで解析しようとする」ケースです。汎用逆アセンブラはELFやMach-Oの構造を解析できますが、その内部のDart AOTスナップショットを解釈する機能は持っていません。

その結果、アセンブリコードの羅列は得られても、Dartのクラスやメソッド、文字列との対応が取れず、実用的な情報を引き出せません。そこで、blutterなどのDart特化ツールを組み合わせることが不可欠です。

もう一つの典型的な失敗は、業務ルールを完全に復元できると過信することです。Flutterアプリのコードは業務ロジックを実装しますが、「なぜその条件分岐になっているか」は記録されていません。解析で分かるのはHow(どう動くか)で、Why(なぜそのルールか)は業務部門へのヒアリングなしには補えないため、仕様書復元では協力体制の事前確保が前提条件です。

難読化・証明書ピンニングへの対処

「–obfuscate」フラグと「–split-debug-info」を組み合わせてビルドしたアプリでは、Dart独自の難読化によりシンボル名がランダムな文字列に置換されます。この場合、blutterでも意味のある関数名やクラス名の復元は困難です。ただし、APIのURL文字列や定数値は難読化されないケースが多く、通信解析と組み合わせれば一定の情報収集は可能です。

証明書ピンニングへの対処は、fridaを用いたランタイムフックが最も一般的なアプローチです。flutter_certificate_pinningパッケージを使うアプリでは、Dartレベルのフック(frida-dart-bridge)が有効です。

一方で、ネイティブ側(libflutter.so内)でピンニングが実装されている場合は、Dartレベルのフックでは回避できず、ネイティブ関数のフックが必要になります。そのため、解析の前に、どのレイヤーでピンニングが実装されているかを確認することが重要です。

ポイント

業務上の理由(Why)はバイナリから復元しきれないと見込み、業務部門の協力体制を解析前に確保しておくのが目安です。難読化やピンニングの実装箇所は、着手前に確かめておくとよいでしょう。

法的リスクの回避と適法な実施条件

Flutterアプリのリバースエンジニアリングは、目的や手続きを誤ると、著作権法や不正競争防止法に違反するリスクがあります。そのため、適法に実施するための知識を事前に身につけておくことが欠かせません。

クリーンルーム手法の実務

クリーンルーム手法は、解析チーム(Dirty Room)と開発チーム(Clean Room)を完全に分離することで、著作権侵害(依拠性)を回避する手法です。解析チームは対象アプリを分析して「機能仕様書」を作成します。この段階でソースコードの表現(著作権保護対象)が混入しないよう、法務担当者が仲介役となって内容を精査します。

開発チームは、この精査済みの仕様書だけを参照してシステムを構築し、元のソースコードには一切アクセスしません。1980年代のフェニックス・テクノロジーズvsIBM BIOS事件で確立されたこの手法は、現在も著作権侵害リスクを最小化する最も確実な方法として広く採用されています。

Flutterアプリの仕様復元を外注する場合は、外注先ベンダーがクリーンルーム手法を自社プロセスとして運用できる体制を持っているかを、発注前に確認することが重要です。

非享受目的での記録・立証方法

平成30年著作権法改正(第30条の4)により、著作物の表現を「享受」することを目的としない情報解析や調査目的のリバースエンジニアリングは、原則として適法です。この規定を活用するには、解析が非享受目的であったことを事後的に立証できるよう、記録を残しておく必要があります。

具体的には、解析専用のPCを用意して解析作業を行います。そのうえで、解析過程と目的、使用ツール、得られた情報を、レポートとして記録することが推奨されます。

また、EULAにリバースエンジニアリング禁止条項がある場合でも、互換性確保のために不可欠な解析は、独占禁止法上の観点から無効化されうるケースがあります。ただし、個々の案件が適法かどうかは専門家(弁護士)への確認が必須で、自己判断だけで進めるのはリスクが高いです。

ポイント

適法かどうかは個別の案件で判断が必要なため、着手前に専門家(弁護士)へ確認し、非享受目的の記録とクリーンルーム体制を用意しておくことが目安です。

外注 vs 内製の判断軸

外注 vs 内製の判断軸

Flutterのリバースエンジニアリングを外注するか内製するかは、組織の技術力、プロジェクトの緊急度、予算、法的リスクへの対応力によって判断します。どちらが優れているという絶対的な答えはなく、状況に応じて選ぶことが重要です。

外注が適しているケース

社内にDart・Flutter解析の経験者がいない場合や、blutter・fridaの使用経験がない場合は、外注が現実的な選択です。特に証明書ピンニング回避やDart AOTバイナリの深掘り解析は、習熟に相当の時間を要するスキルです。そのため、一度限りのプロジェクトのために内製体制を構築するコストは、見合わないことが多いです。

また、クリーンルーム手法の法的要件を満たした運用体制が必要な場合も、外注が有利です。専門ベンダーは既にプロセスとして確立しており、法務担当者の関与も標準化されています。

セキュリティ診断(ペネトレーションテスト)を目的とする場合は、セキュリティ専門のベンダーを選ぶ必要があります。というのも、業務システムSIerとセキュリティ専門企業では、解析ツールの習熟度や脆弱性の知識、レポートの質が大きく異なるからです。Flutterアプリのセキュリティ診断では、モバイルアプリ診断の実績があるベンダーを優先して選んでください。

内製が適しているケース

自社製品のFlutterアプリを継続的にセキュリティ評価する体制を構築したい場合は、内製化の投資が長期的に見合います。ただし、blutterやfridaなどのツール習得コスト(エンジニア1名あたり3〜6ヶ月の学習期間が目安)を踏まえ、年間の診断回数と外注単価から費用対効果を試算して判断するとよいでしょう。

社内に機密情報を扱うFlutterアプリが多数ある企業では、外部ベンダーへの情報開示リスクを避けるため、内製を選ぶケースもあります。

なお、内製する場合でも、最初の案件だけは外注し、ベンダーの作業プロセスや成果物品質を観察して社内スキルアップに活用する「ハイブリッドアプローチ」も、実務的に有効です。特にblutterの使い方やfridaのスクリプト記述は、実案件を通じて学ぶことで習熟が加速します。

ポイント

社内にDart・Flutter解析の経験者がいなければ外注が現実的で、継続的な評価の体制を築く場合は、年間の診断回数と外注単価から費用対効果を試算して内製を検討するとよいでしょう。

まとめ

まとめ

Flutterのリバースエンジニアリングでは、Dart AOTバイナリという独自の構造への対応が最大の技術的課題です。汎用ツールだけでは対応できないため、blutterのようなDart特化ツールと、fridaを用いた動的解析を組み合わせることが、実務上の基本アプローチとなります。

iOS版とAndroid版が単一コードベースから生成されるFlutterの特性により、片方の解析で両OSのロジックを把握できる点は、他のモバイル開発言語にはない大きな特徴です。6つの工程(対象選定から成果物化まで)を体系的に進め、法的リスク管理(非享受目的の記録とクリーンルーム手法)を並行して行うことで、適法かつ高品質なリバースエンジニアリングが実現します。

外注と内製の選択は組織の状況に応じて判断し、Dart解析の専門スキルが社内にない場合は、外注を優先して検討することをお勧めします。Flutterアプリのリバースエンジニアリングを検討している方は、まず目的と対象を明確にし、適切なパートナー選定から着手してください。

Flutterの全体像を確認したい方は、Flutterのリバースエンジニアリングの完全ガイドをご覧ください。

会社紹介

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

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

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

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

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

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