DexGuardは、Guardsquareが提供するAndroidアプリケーションをリバースエンジニアリングから保護するためのソリューションです。このツールは、ビルド段階でDEXバイトコードの難読化、暗号化、プロアクティブな監視を実行します。Guardsquare、2025年によると、この製品は銀行や決済システムを含む10,000以上の商用プロジェクトで使用されています。DexGuardは、アプリケーションのソースコードを変更することなく、逆コンパイルやランタイム攻撃に対する保護を追加することで、ProGuardの機能を拡張します。
主要ポイント
DexGuardは、ProGuard(Eric Lafortune)を開発した同じチームによって開発された、Androidアプリケーションを難読化および保護するための商用ツールです。この製品は、標準的なProGuardの難読化では不十分なプロジェクト向けの拡張として2012年に登場しました。DexGuardはコンパイル後の段階で動作し、APKパッケージングの前にDEXバイトコードを保護された形式に変換します。
DexGuardのアーキテクチャは、多層防御モデルに基づいています。第1層は、overload inductionを使用したクラス、メソッド、フィールド名の難読化です。第2層は、文字列定数の暗号化と、ランタイムでのスタブメソッドを介したロードです。第3層は、署名のチェックサム検証によるAPK整合性制御です。Guardsquareの技術レポート(2025年)によると、これらの層を組み合わせることで、アプリケーションの分析時間が数分から数週間に増加します。
DexGuardは、アプリケーション、ライブラリ、SDK、Unityゲームプロジェクトなど、すべてのタイプのAndroidプロジェクトをサポートします。このツールは、com.guardsquare.dexguardプラグインを介して標準のGradleパイプラインに統合され、セットアップ後の手動介入は必要ありません。
DexGuardとオープンソースの代替品との主な違いは、アクティブなランタイム保護です。このツールはコードを難読化するだけでなく、アプリケーション実行中にチェックを実行するエージェントを追加します。これにより、Fridaインジェクション、Xposed、JDWPデバッグなどの攻撃を検出し、クラッシュ、偽データの生成、サーバー通知などの対応が可能です。
DexGuardの難読化プロセスは、各々が特定の攻撃ベクトルを対象とした、バイトコード変換の連続的な段階で構成されています。
標準的な難読化ツールは、名前を1文字のa、b、cに置き換えます。DexGuardはoverload inductionを使用します。異なるシグネチャを持つ異なるメソッドに同じ短い名前を割り当てます。逆コンパイラはオーバーロードを解決できず、誤ったコードを生成します。Guardsquareのテストによると、名前のオーバーロードにより逆コンパイルエラーが78%増加します。
文字列リテラル、URL、APIキー、トークンは、ビルド段階でAES-256を使用して暗号化されます。ランタイムでは、スタブメソッドが使用前に文字列を復号化し、使用後にメモリ領域をゼロにします。これにより、DEXファイル内の文字列の静的表示から保護されます。暗号化がない場合の結果例:攻撃者がstrings dexguard.apkを実行すると、すべてのAPIエンドポイントが平文で表示されます。
DexGuardは各DEXファイルのSHA-256ハッシュを計算し、ネイティブレイヤーに値を保存します。アプリケーション起動時に、エージェントは現在のハッシュを参照値と比較します。不一致(改変されたAPK)がある場合、アプリケーションは終了します。さらに、リソースとマニフェストの整合性チェックを設定することもできます。
// build.gradle(アプリレベル)
buildscript {
repositories {
maven { url "https://guard repositories.com/dexguard" }
}
dependencies {
classpath "com.guardsquare:dexguard-gradle-plugin:9.1.05"
}
}
apply plugin: "com.guardsquare.dexguard"
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
dexguard {
config "dexguard-project.txt"
}
}
}
}
両方のツールは同じ会社によって開発されていますが、異なるシナリオを対象としています。ProGuardは、Android SDKにデフォルトで含まれているオープンソースのオプティマイザ兼最小限の難読化ツールです。DexGuardは、無料版では利用できない保護レベルを追加する商用製品です。
| 特徴 | ProGuard | DexGuard |
|---|---|---|
| ライセンス | オープンソース(GPL) | 商用 |
| 名前難読化 | 単純な置換 | Overload induction |
| 文字列暗号化 | なし | AES-256 |
| RASP保護 | なし | あり |
| Frida検出 | なし | あり |
| デバッグ保護 | なし | あり |
| 整合性制御 | なし | SHA-256ハッシュ |
| Unityサポート | なし | あり |
ツールの選択は、保護される情報のクラスによって決まります。通常のモバイルアプリケーションには、ProGuardで十分です。コードの開示が財務上または規制上のリスクを伴う銀行、決済、医療アプリケーションには、DexGuardが推奨されるソリューションです。OWASP Mobile Top 10(2024年)によると、機密データを扱うアプリケーションでの難読化の欠如は、重大なリスクと見なされています。
DexGuardの統合は、ルートのbuild.gradleにGuardsquareリポジトリを追加することから始まります。バージョン9.xのプラグインは、AGP 7.4–8.5およびGradle 7.6–8.7と互換性があります。保護設定は、個別のdexguard-project.txtファイルで定義され、そこで特定の手法が有効化されます。
// ルートbuild.gradle
buildscript {
repositories {
maven { url "https://maven.guardsquare.com/dexguard" }
}
}
// dexguard-project.txt — 最小構成
# 文字列の暗号化
@stringEncryption
# Overload inductionによる難読化
@overloadInduction
# APK整合性制御
@integrityCheck
# デバッガとエミュレータからの保護
@antiDebug
@antiEmulator
@stringEncryptionおよび@overloadInductionディレクティブは、商用コードを保護するための鍵です。すべてのアノテーションが有効化されると、ビルド時間が30〜60秒増加しますが、これは保護レベルによって正当化されます。設定はVCSに保存され、リリースビルドにのみ適用されます。
リフレクションを使用するクラスの例外を設定することが重要です。DexGuardはProGuardと同様に、リフレクションを自動的に解析しません。dexguard-project.txtでは、Class.forNameや@JavascriptInterfaceを介してロードされるライブラリクラスに-keepルールを追加する必要があります。
// dexguard-project.txt — keepルール
# Gsonモデルクラスを保持
-keep class com.example.model.** { *; }
# WebViewインターフェースを保持
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# Firebaseクラッシュレポートを除外
-keep class com.google.firebase.** { *; }
DexGuardには20以上の保護手法が含まれており、静的(ビルド段階)と動的(ランタイム)に分けられます。特定の手法の選択は、アプリケーションの脅威モデルによって異なります。
リソース暗号化 — 画像、アセット、設定ファイルは、最初のアクセス時に暗号化および復号化されます。制御フローの難読化は、デッドコードを挿入し、命令シーケンスを変更して、jadxなどの逆コンパイラにとってバイトコードを読み取り不能にします。定数の隠蔽は、数値リテラルをランタイムで計算される算術式に置き換えます。
Runtime Application Self-Protection — アプリケーション内部でランタイム環境の動作を監視するエージェントです。DexGuard RASPは、/proc/self/mapsを介したFrida接続、Xposed Frameworkの存在、デバッガ(JDWP)下での実行、Androidエミュレータ(QEMU)を検出します。脅威が検出されると、クラッシュまたは誤ったデータの生成というポリシーがトリガーされます。OWASP Mobile Security(2025年)の調査によると、RASP保護は典型的な自動化攻撃の94%を阻止しました。
DexGuardは、重要なコードセクションにランダムな遅延を追加し、動的解析中のブルートフォース時間を増加させます。パラメータはミリ秒単位で設定され、ビルドごとにランダム化されます。これにより、ファジングツールや自動スキャナの使用が困難になります。
既存のプロジェクトにDexGuardを統合する際は、ライブラリや一般的なSDKとの後方互換性を考慮する必要があります。一部のライブラリは、リフレクション呼び出しのために極端な難読化と互換性がありません。
DexGuardは、正しいkeepルールを使用して、Firebase Crashlytics、Google Analytics、Google Play Services、Retrofit、OkHttp、Glide、Gsonと互換性があります。アノテーションとコード生成(Dagger、Hilt、Room、DataBinding)を使用するライブラリは、生成されたクラスの明示的な保存が必要です。Guardsquareチームは、一般的なSDK向けの公式設定サンプルを公開しています。
最小要件:Android Gradle Plugin 7.4、Gradle 7.6、JDK 11。DexGuard 9.1はtargetSdk 34とcompileSdk 34をサポートしています。Java 17およびAGP 8.2+には、DexGuardバージョン9.2以上が必要です。このツールは、完全最適化モードのR8と互換性がありません — DexGuardを使用する場合、R8は自動的に無効化されます。
DexGuardを設定した後は、リフレクションと動的クラスローディングの影響を受けるすべてのパスの回帰テストが必要です。リリース前に、保護を有効にしたビルドでUI自動テストを実行することをお勧めします。GuardsquareはDexGuard Tracerユーティリティを提供しており、アプリケーションをクラッシュさせることなくランタイムでClassNotFoundExceptionエラーをログに記録し、keepルールのデバッグを簡素化します。
よくある質問
ProGuardは、基本的な名前の置換とバイトコード最適化を備えた無料の難読化ツールです。DexGuardは、AES-256文字列暗号化、名前のoverload induction、ランタイムのRASPエージェント、APK整合性制御、Frida、Xposed、エミュレータ、デバッガの検出を追加します。ProGuardは通常のアプリケーションに十分ですが、DexGuardは銀行やエンタープライズアプリケーション向けです。
DexGuardは、年間支払いの商用ライセンスで配布されています。費用はプロジェクト数とサブスクリプションの種類によって異なります。2025年現在、1プロジェクトあたりの基本ライセンスは年間5,000 USDからです。スタートアップ向けには、最大40%割引のパートナーシッププログラムが利用可能です。
はい、DexGuardはKotlinとJetpack Composeと完全に互換性があり、コルーチンやComposeコンパイラも含まれます。Kotlinコンパイラによって生成されたクラスには、追加のkeepルールが必要です。Guardsquareは、公式ドキュメントのkotlin-project.txt設定テンプレートを使用することを推奨しています。
文字列の暗号化とRASPエージェントの追加により、保護するコードの量に応じてAPKサイズが5〜15%増加します。名前の難読化と制御フローの難読化はサイズを増加させません — 既存の名前を置き換えるだけです。平均して、完全なDexGuard保護を施したAPKは、元のものより8〜12%大きくなります。
はい、保護設定はリリースビルドタイプにのみ適用されます。デバッグビルドの場合、DexGuardは自動的に暗号化とRASPチェックを無効にします。開発者は、gradle.propertiesのguard.force.enable=trueパラメータを使用して、保護されたビルドをテストするためにデバッグモードでDexGuardを強制的に有効にできます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。