お使いの Android アプリケーションまたは Android ライブラリに対して PreEmptive Protection™ DashO™ プロジェクトを作成するための最も簡単な方法は、New Project Wizard を使用することです。 弊社では、既存の Gradle プロジェクトに DashO を統合することをお勧めします。 ただし、APK ファイルしかない場合は、DashO によって直接処理されます。
Gradle プロジェクトへの統合(推奨)
プロジェクトへの統合を行うには、ウィザード(New Project Wizard)を使用することをお勧めします。 このウィザードによって変更される項目を参照したいか、手動で統合したい場合は、下記を参照してください。
必要条件
- Android Gradle プラグイン v3.2.0 以降
ウィザードによる DashO の統合
当ウィザードでは、ビルド処理に新しい DashO Gradle プラグイン(Android 用) を統合するため、お使いのビルド環境を調べます。 ソース ファイルは上書きされません。 当ウィザードを起動するには、[File]>[Project Wizard]メニューを選択します。 "Android (Most projects)" を選択します。 当ウィザードにより、Android プロジェクトの場所を尋ねられます。
プロジェクト(または該当するモジュール)が含まれるディレクトリを選択し、[Next
]をクリックします。 次いで、[Finish
]をクリックすることで、Gradle の構成が変更され、project.dox
が作成されます。
project.dox
が存在する場合は、それを置き換えるかどうかを尋ねられます。 既存のプロジェクトを上書き保存すると、新しい設定が保存され、古いファイルのバックアップが作成されます。
次いで、DashO GUI により、プロジェクトが読み込まれて、たとえば gradlew assembleRelease
をビルドするかどうかの確認を求められます。 ビルドが完了したら、[Project]>[Reload Class List]を選択することでプロジェクトのクラスを再読み込みすることができます。
メモ: R8 の有効化も行わなければならない場合があります。
おめでとうございます!アプリケーションが DashO によって保護されるようになりました!
ビルド中になんらかの問題が発生した場合は、DashO トラブルシューティングおよび DashO Gradle プラグイン(Android 用)トラブルシューティングを参照してください。
保護は、後述のように強化することができます。
DashO を手動で統合する
次のように、当ウィザードはお使いの Gradle ビルド構成にいくつかの変更を行いますが、これらの変更は手動でも行うことができます。
- ルートの
build.gradle
において、buildscript の repositories に PreEmptive Solutions の Maven リポジトリを追加します。buildscript { repositories { maven { url 'https://maven.preemptive.com' } //追加した行 } }
- buildscript の dependencies にプラグインのアーティファクトを追加します。
buildscript { dependencies { classpath 'com.preemptive.dasho:dasho-android:1.5.4' //追加した行 } }
-
Android Gradle プラグインを適用した後で、以下のプラグインを適用します。
apply plugin: 'com.android.application' // 'com.android.library' の可能性もあり apply plugin: 'com.preemptive.dasho.android' //追加した行
または
plugins { id 'com.android.application' // 'com.android.library' の可能性もあり id 'com.preemptive.dasho.android' //追加した行 }
-
名前変更機能と除去機能を有効にするために、
release
ビルドに対してminifyEnabled
をtrue
に設定しておきます。android { buildTypes { release { minifyEnabled true } } }
メモ: R8 の有効化も行わなければならない場合があります。
-
DashO ホームを設定します。 これは、DashO を標準的な場所にインストールしている場合は不要です。 DashO ホームを構成する方法は複数個ある点に注意してください。
-
Android ライブラリ(AAR)プロジェクトの場合は、Android ライブラリのパブリック API を保持する規則を R8 構成に追加する必要があります。
-
プロジェクト ディレクトリに、次の内容を含んでいる
library-rules.pro
という名前のファイルを作成します。-keep public class !dasho.**,!**.dasho.**,* { public protected *; } -keepparameternames -renamesourcefileattribute SourceFile -keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-
build.gradle
においてproguardFiles
行を追加または更新することで、これらの規則を使用するように R8 を構成します。android { buildTypes { release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'library-rules.pro' } } }
-
-
アプリケーションまたはライブラリの
build.gradle
ファイルが含まれているディレクトリに、既定の Android モード構成ファイルproject.dox
を生成します。 次のように、GENERATE_DASHO_CONFIG
プロパティを定義したプロジェクトをアセンブルします。gradlew clean assembleRelease -DGENERATE_DASHO_CONFIG
- ソース管理システムで
.dasho
ディレクトリを無視します(つまり、.gitignore
ファイルに.dasho/
を追加します)。
メモ: プロジェクトのビルド中にエラーが発生した場合は、
build.gradle
ファイルにcompilerSdkVersion
、namespace
、およびplugin
パラメーターが存在することを確認してください。
おめでとうございます!アプリケーションが DashO によって保護されるようになりました!
ビルド中になんらかの問題が発生した場合は、DashO トラブルシューティングおよび DashO Gradle プラグイン(Android 用)トラブルシューティングを参照してください。
保護は、後述のように強化することができます。
Android Gradle プラグインは、プロジェクトの構成に基づいて、R8 が必要なクラスとメンバーを名前変更したり除去したりしないようにする保持規則を自動的に生成します。 問題が発生した場合は、追加の保持規則を指定する必要があります。 規則ファイルの構成方法については、後述の R8 を参照してください。
R8 を有効化する
Android Gradle プラグインのバージョン 3.2.x または 3.3.x を実行する場合は、gradle.properties
ファイルに以下の行を追加します。
#Only for Android Gradle Plugin v3.2.x or v3.3.x
android.enableR8=true
保護を強化する
追加の構成を行わなくても、アプリケーションがかなり強力に保護されるようにするには、DashO の Android モードでの既定の保護設定を選択します。 この保護設定をさらに強化するには、DashO の構成を調整し、R8 のいくつかの規則を有効化します。
DashO
保護を強化するには、DashO GUI を使ってプロジェクト ファイルを変更します。
特に、プロジェクトにチェックを追加する必要があります。 チェックにより、デバッグ、フック、改ざんの企てを阻止できる新しい保護レイヤーが、アプリケーションまたはライブラリに追加されます。 また、チェックにより、ルート化されたデバイスや Android エミュレーターなどの安全でない環境で、ソフトウェアが実行されないようにすることができます。
さらに、文字列の暗号化レベルを高くしたり、Try/Catch による制御フローの難読化に差し込む try/catch ブロックの数を増やしたりすることもできます。
また、リソースの暗号化を有効にすることで、アプリケーションでアセットや生のリソースを暗号化することもできます。
異なるビルド バリアントに異なる保護設定が必要な場合は、最初のプロジェクト ファイルをバリアント固有の名前を付けてコピーします。
R8
R8 は、アプリケーションまたはライブラリの build.gradle
内の規則ファイルを参照することで構成されます。 規則ファイルがまだ 1 つもない場合は、空の規則ファイルを作成する必要があります。 次の例では、ローカル設定に使用できる、Android の既定の規則セット、構成、追加ファイル(migrated-rules.pro
)を有効にします。
android {
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'migrated-rules.pro'
}
}
}
この規則ファイル(例では migrated-rules.pro
)は通常、build.gradle
と同じディレクトリに置かれます。
メモ: 最適化された規則で、R8 により、無視されたオプションに関する警告が出力されますが、それらの警告を無視しても問題ありません。
既定では、R8 により、パッケージ名の各構成要素が名前変更されます。たとえば、com.preemptive.dasho
が m.e.r
となるなどです。 元の名前を除去しても、元のパッケージ階層は保持されます。 つまり、クラス間の関係が保持されるため、理論上は情報が漏れる危険性があるということです。
そのような危険性をなくすには、それらのパッケージが 1 つにマージされる(つまり、すべてのクラスが同じパッケージを使用できる)ように、各クラスの名前を変更します。 'migrated-rules.pro' に以下の行を追加します(ただし、com.yourcompany
はクラスの移動先となるパッケージです)。
-repackageclasses com.yourcompany
-allowaccessmodification
-repackageclasses
規則はクラスを単独パッケージに移動させます。 -allowaccessmodification
規則により、R8 がクラスとクラス メンバーの有効なアクセス権を変更できるようになるので、同じパッケージに移動できるクラスの数が増えます。 この規則は、DashO の標準モードの機能、Make Public に似ています。
メモ:
-allowaccessmodification
は、前述のようにproguard-android-optimize.txt
内の規則に含まれているため、明示的に指定する必要はありません。
エントリ ポイントとして設定されているクラス(活動はマニフェストなどに記載)と、保持規則によって除外されたクラスは、移動されません。
他の規則も構成できます。 R8 の規則の構文はこちらに記載されています。
APK を後処理する
このセクションでは、PreEmptive Protection DashO を使用するために、既存の Android アプリケーション(APK)プロジェクトを構成する手順をひととおり示します。 このアプローチは、DashO Gradle プラグイン(Android 用)を使って Gradle ビルドに DashO を統合するプロジェクトとは大いに違って、すべての名前変更と除去が、難読化を行う構成要素を Android の R8 サイズ縮小ツールにデリゲートすることによって処理されるのでなく、DashO によって処理されます。
APK を扱う場合、DashO はサード パーティ製の dex2jar および Apktool ユーティリティを使用して、クラスを抽出します。 その後、DashO はクラスを難読化し、それらのツールを使って新しい APK を出力します。
必要条件
DashO ホストには以下が必要です。
- Android SDK Tools Revision 10 以降
- Java 8 以降がシステム パス上になければなりません
メモ:
このアプローチは以下に対しては機能しません。
- Multidex APK ファイル
- Android ライブラリ(
.aar
ファイル)その場合は、Gradle 統合を使用してください。
DashO は埋め込み APK ファイル(Wear OS で使用される)は処理しません。
Wear OS アプリケーションを含むアプリケーションがあり、その Wear 部分の難読化を行いたい場合は、DashO Gradle プラグイン(Android 用)を使用してください。
ウィザードを使って DashO プロジェクトを作成する
ウィザードは、アプリケーションを調べて、それを保護するための適切な設定を決定します。 当ウィザードを起動するには、[File]>[Project Wizard]メニューを選択します。 [Android (APK post-processing)]を選択します。 当ウィザードにより、APK の場所と元のビルド環境を尋ねられます。
ウィザードは、有効な APK ファイルを選択するように要求します。
ウィザードは、お使いの環境に基づいて Android SDK Home を決定します。 APK を作成したときに使用した SDK バージョンを選択します。
ウィザードは、AndroidManifest.xml
、リソース、および APK 内のコンパイルされたクラスを分析して、アプリケーションのエントリ ポイントを決定します。 既定では選択されていないエントリ ポイントがいくつか表示される場合があります。 これらのエントリ ポイントは、Android 以外のアプリケーションで通常使用されるものです。 誤ったエントリ ポイントが表示されているとわかっていない限り、それらのエントリ ポイントは変更しないでそのままにしておいてください。
メモ: APK を正しくデコードできない場合は、[Select Entry Points]ページにエラーが表示されます。 [Cancel]をクリックしてください。詳細については、コンソールに書き込まれる出力を参照してください。
また、ウィザードはコード内でクラス、メソッド、およびフィールドの修飾に使用されるアノテーションを探し、有効にできる可能性のあるアノテーション ベースのエントリ ポイント規則を提示します。 アノテーションについてよく理解しており、これらのアノテーションで修飾されたコード要素を保持する必要があると確信している場合は、アノテーションのエントリ ポイントを有効にします。
メモ: 既定の
CLASS
RetentionPolicy
を使ったアノテーションは、Android ビルド プロセスが APK を生成するときに削除され、DashO が APK を処理するときには存在しません。RUNTIME
保持ポリシーが割り当てられているアノテーションのみが、APK の処理時にウィザードや DashO に表示されます。
さらに、ウィザードには、Hibernate に使用されるアノテーションに基づいてエントリ ポイント規則を自動生成する機能を有効にするチェック ボックスが表示されます。 チェック ボックスをオンにすると、次の規則が設定されます。
-
javax.persistence.Entity
を使ってアノテーションが付けられたクラスが名前変更されたり除去されたりしないようにする。 -
javax.persistence.Entity
またはjavax.persistence.Embedded
を使ってアノテーションが付けられたクラスの以下のメンバーが除去されないようにする。- フィールド
- getter(パラメーターが 0 個で、名前が
get
またはis
で始まるメソッド) - setter(パラメーターが 1 個で、名前が
set
で始まるメソッド)
ウィザードは project.dox
ファイルを作成します。 このファイルは、DashO プロジェクトの構成ファイルであり、プロジェクト固有の設定をすべて含んでいます。
この APK にプロジェクト ファイルが既に作成されている場合は、そのプロジェクトを上書きするかどうかの確認を求められます。 既存のプロジェクトを上書き保存すると、新しい設定が保存され、古いファイルのバックアップが作成されます。
追加の構成
自動設定できないため手動で構成する必要のあるプロジェクト詳細もあります。 手動での構成は、DashO のユーザー インターフェイスで行うことができます。
以下を行う必要があります。
-
[Output – Signing]画面で署名を構成します。 署名を構成しない場合は、難読化した APK に手動で署名してから、難読化した APK をデバイスまたはエミュレーターにインストールする必要があります。 APK の署名の詳細については、http://developer.android.com/tools/publishing/app-signing.html を参照してください。
-
[Output – APK]画面で Android Build Tools のディレクトリを構成するか、このディレクトリの構成を確認します。
-
[Output – APK]で、ビルド ツールを使用する
Zipalign
を有効化することで、アプリのメモリ フットプリントに上限を設定します。
また、[Options - User Properties]ページで以下のプロパティを設定すると役に立ちます。
-
ANDROID_BUILD_TOOLS_HOME
– 使用する Android ビルド ツールの場所。 ここで指定されるディレクトリには、zipalign
の実行可能ファイルが入っている必要があります(たとえば、c:\android-sdk\build-tools\27.0.3
)。 19.1.0 より前のバージョンのビルド ツールを使用している場合、この実行可能ファイルはbuild-tools
ディレクトリの下ではなく、tools
ディレクトリの下にあるはずです。 この構成に役立つよう、ウィザードは Android SDK のbuild-tools
ディレクトリの検出を試みます。 -
APKTOOL_FRAMEWORK_DIR
– Apktool で使用するフレームワーク ファイルを格納するディレクトリ。 これは、既定のフレームワーク ファイルが動作しないようなまれな場合(たとえば、カスタム デバイスであったり、Android がベータ版であったりする場合)にのみ必要となります。 必要なフレームワークを抽出する方法については、https://apktool.org/docs/the-basics/frameworks/ を参照してください。
-
APKTOOL_JRE
– Apktool で使用する Java のホーム。 これは、Java 8 以上を指す必要があります(たとえば、C:\Program Files\Java\jre1.8.0
)。 既に Java 8 以上で DashO を実行しており、ホームがシステム パス上にある場合は、この設定は省略可能です。 -
SKIP_APK_MANIFEST
– この省略可能な設定により、APK 内部のAndroidManifest.xml
ファイルの処理を省くことができます。 マニフェストに記載されているクラスのどれも名前を変更しない場合は、これを "true" に設定できます。
メモ: あるマシンから別のマシンへコピーされた
project.dox
ファイルは、DashO と Android SDK が利用可能である場合には正常に動作します。 必要に応じて、Android SDK の新しい場所を指すようにANDROID_BUILD_TOOLS_HOME
を更新します。
DashO をビルドに統合する
スタンドアロン APK の難読化を自動化したい場合は、Gradle または Ant ビルド システムとの統合を行っている下記の例を参照してください。 これらの例ではそれぞれ、DashO Gradle プラグイン(Java 用) と DashO Ant プラグインを使用しています。
Gradle 環境
DashO Gradle プラグイン(Java 用)内の com.preemptive.dashoCustom
プラグインを使って、Gradle ビルドから DashO を呼び出すことができます。
メモ: この統合で使用する DashO Gradle プラグイン(Java 用) は、DashO Gradle プラグイン(Android 用) とは異なります。
ビルド スクリプトに以下を追加します。
buildscript {
repositories {
flatDir dirs: "{DashO Home}/gradle"
}
dependencies {
classpath "com.preemptive:dasho:X.Y.+"
}
}
apply plugin: 'com.preemptive.dashoCustom'
dashOConfig {
dashOHome = '{DashO Home}'
doxFilename = 'project.dox'
}
task obfuscate (type:DashOFileTask) {
from("application.apk") //application.apk は実際のファイル名とパスに置き換えられます。
to("application-ob.apk")
addUserProperty("apkInput", '${gradleInput}')
addUserProperty("apkOutput", '${gradleOutput}')
}
DashO ホームはプラットフォームによって異なります。 詳細については、インストールのページを参照してください。
実行するには、gradlew obfuscate
を呼び出します。
メモ:
${gradleInput}
と${gradleOutput}
を囲んでいる一重引用符に注目してください。これらのリテラル文字列は、プロパティ値として渡される必要があります。
Ant 環境
Ant から DashO を呼び出すには、ビルド スクリプトに以下のコードを追加します。
<typedef onerror="failall" resource="preemptive/dasho/anttask/antlib.xml"/>
<target name="obfuscate" description="Obfuscate the application.">
<obfuscate project="project.dox">
<sysproperty key="apkInput" value="application.apk" />
<!-- Where application.apk is replaced by the actual filename and path -->
<sysproperty key="apkOutput" value="application-ob.apk" />
</obfuscate>
</target>
これにより、DashO の Ant プラグインが組み込まれます。 実行するには、ant obfuscate
を呼び出します。
DashO の Ant タスクがインストールされていることを前提とします。 Ant タスクのインストールに関する情報は、DashO の Ant タスク ドキュメント(英語)で入手できます。
難読化した APK をインストールする
難読化した APK は、署名すれば、標準の Android ツールを使用してインストールできます。
adb install {filename}.apk
これにより、実行中のエミュレーターまたは接続されたデバイスに APK がインストールされます。 その後、アプリケーション一覧へ移動して、アプリケーションにアクセスすることができます。 インストールしたアプリケーションは、デバイスにインストールされている他の Android アプリケーションと同様に表示されます。