Unity ゲームの保護
メモ:以下の手順は、Dotfuscator Professional と Dotfuscator Community の両方を対象としています。
これらの手順では、Dotfuscator を使用して、Unity で作成されたアプリを保護する方法を段階的に説明していきます。 アプリがサポートする各プラットフォームにこれらの手順を適用して、アプリを実行するデバイスに関係なく、実績のある階層化された保護戦略を備えたアプリを作成できます。
これらの手順を進めるには、Unity 提供の Space Shooter サンプル プロジェクトを必要とします。あるいは、独自のプロジェクトを使用して、このガイドを参考にしながら保護を追加することができます。
また、Dotfuscator をまだインストールしていない場合はそれをインストールする必要があります。 インストールを行うには、Dotfuscator エディションを参照して自身のプロジェクトに最適のエディションを知ったうえで、Dotfuscator のダウンロード ページを参照して、選択したエディションの最新バージョンの Dotfuscator を入手してください。
既に Dotfuscator がインストールされている場合は、そのバージョンで Unity がサポートされていることを確認してください。
必要な最小バージョン
Dotfuscator エディション | Unity に必要な最小バージョン |
---|---|
Professional | 4.31 |
Community | 5.31 |
メモ:これらのバージョンは、.NET Scripting Backend を使用して作成されたアプリに必要となります。 Mono Scripting Backend を使用する場合は、これらより前のバージョンの Dotfuscator を使用できます。
サポートされるプラットフォーム
Dotfuscator は、以下のプラットフォームを対象とする Unity プロジェクトをサポートしています。
- PC, Mac & Linux Standalone
- iOS
- Android
- Windows ストア
サンプル プロジェクト
Dotfuscator をインストールし終わったら、サンプル プロジェクトをセットアップする必要があります。 本ガイドでは、Unity の Web サイトから入手できる Space Shooter tutorial を使用します。
セットアップ
アセットのダウンロード
Asset Store ページで以下の手順を実行します。
- [Add to My Assets]ボタンをクリックします。
- [Open in Unity]ボタンをクリックします。
- これにより、プロジェクトを開くための Unity ウィンドウが開きます。
プロジェクトの作成
- [New project]ボタンをクリックして、新しいプロジェクトを作成します。
- プロジェクトに名前と保存先の場所を指定します。
この例では、名前を
SpaceShooter
、場所をC:\Unity\
にします。 - アセット パッケージ "Space Shooter tutorial" を追加します。
- プロジェクトを作成します。
プロジェクトへのシーンの追加
プロジェクトの Assets ディレクトリで _Complete-Game ディレクトリを見つけます。
_Complete-Game
シーンをクリックして[Scene]タブに表示し、プレイ ボタンをクリックします。
時間を取ってゲームをプレビューで再生しておくと、後に保護されたバージョンで何か動作していないものがあれば、それを知ることができます。
[File]メニューの[Build Settings]をクリックして、Build Settings ウィンドウを開きます。
[Add Open Scenes]ボタンをクリックして、_Complete-Game
シーンを[Scenes In Build]に追加します。
保護を追加するための全般的な手順
Unity アプリケーションを Dotfuscator で保護するための全般的な手順は、プラットフォーム固有のステップがいくつかあるのを除けば、サポートされているすべてのプラットフォーム間で共通です。 プラットフォーム固有のステップが必要な場合は、この全般的な手順内からジャンプできるリンクがあります。
ステップ 1 ~ 7 では、アプリケーションに基本的な保護を与えます。 ステップ 8 では、アプリケーションをさらに強化する保護を追加します。
1. アプリのビルド
Dotfuscator で保護されるアプリケーションをビルドするには、まずビルドするプラットフォームを選択し、特定のプラットフォームに必要なプレイヤー設定を行って、最後に、Unity で作成されたアプリをビルド、保存します。
プラットフォームの選択
Unity でビルド プラットフォームを変更するには、[File]>[Build Settings]メニューを選択して Build Settings ウィンドウを開きます。 左側にプラットフォームの選択肢の一覧があります。 目的のプラットフォームを選択し、[Switch Platform]ボタンをクリックします。
プレイヤー設定の構成
スクリプト バックエンドの選択
Unity では、対象プラットフォームに応じて、Mono、.NET、IL2CPP の 3 つの異なるスクリプト バックエンドから選択することができます。
最初の 2 つのスクリプト バックエンド、Mono と .NET で生成されるマネージ コードは、容易にリバース エンジニアリングされてしまいます (詳細については、リバース エンジニアリングのページを参照してください)。
Mono および .NET スクリプト バックエンドは、プロジェクト用に記述されたすべての C# スクリプトを、Assembly-CSharp.dll という名前の 1 つのダイナミック リンク ライブラリにまとめます。 Assembly-CSharp.dll は Dotfuscator の保護対象となります。
IL2CPP スクリプト バックエンドは、Dotfuscator への入力として使用できる出力を生成しません。
スクリプト バックエンドを設定するには、Build Settings ウィンドウの[Player Settings]ボタンをクリックします。 [Configurations]セクションに、このスクリプト バックエンドを選択するためのドロップダウン メニューがあります。 プロジェクトに適したスクリプト バックエンドを選択します。
スクリプト バックエンドの詳細については、Unity Manual を参照してください。
プラットフォーム固有のプレイヤー設定
iOS プラットフォームと Android プラットフォームには追加の構成を行う必要があります。詳細については、以下のセクションを参照してください。
ビルドと出力の保存
Unity でビルドの全項目を構成したら、Build Settings ウィンドウの[Build]ボタンを押します。 プラットフォーム固有の詳細については、Windows ストア入力のビルドに関するセクションを参照してください。
別のプラットフォーム用のビルドをまだ行っていない場合は、C:\Unity\SpaceShooter
に "Builds" という新しいディレクトリを作成します。このサンプルでビルドする、全プラットフォームのビルド出力をこのディレクトリに格納します。
C:\Unity\SpaceShooter\Builds
の下位に、プラットフォームと同じ名前のディレクトリを作成し、このディレクトリをビルド出力の保存先として選択します。
当該のプラットフォームでビルドする必要のあるものが SpaceShooter ならば、ファイル名を SpaceShooter に設定します。
たとえば、スタンドアロン プラットフォームのビルドの出力は C:\Unity\SpaceShooter\Builds\Standalone
に格納され、実行可能ファイルは SpaceShooter.exe
と命名されます。
次に、[保存]を押して、指定したプラットフォームのプロジェクトをビルドします。
2. Dotfuscator への入力の追加
Dotfuscator の構成エディターを開いて、Dotfuscator Professional または Dotfuscator Community のための以下の手順に従って、入力を追加します。 対象プラットフォームによって、正しい入力は異なります。 詳細については、以下のセクションを参照してください。
- スタンドアロンから Dotfuscator への入力
- iOS から Dotfuscator への入力
- Android から Dotfuscator への入力
- Windows ストア から Dotfuscator への入力
この手順を独自のアプリで進めている場合、入力は同様の場所にあります。
3. Dotfuscator の構成
Dotfuscator Professional を使用している場合は、[設定]タブを表示し、[高度]セクションにある[Mono 互換の変換のみを使用する]を "いいえ" から "はい" に変更します。
Dotfuscator 構成ファイルを C:\Unity\SpaceShooter\Builds\<プラットフォーム名>
に、任意の名前を付けて保存します。
Windows ストアのユニバーサル 10 アプリ用の追加設定については、Windows ストアの Dotfuscator 構成に関するセクションを参照してください。
4. ビルド
既に、Dotfuscator 構成エディターの[ビルド]ボタンを押す準備は整っています。 Dotfuscator 構成エディターの下部にある出力を調べて、ビルドが成功したことを確認します。
5. アセンブリの置き換え
[ビルド]ボタンの横に、矢印付きのボタンがあります。 このボタンを押すと、Dotfuscator の出力の場所が表示されます。
Dotfuscator の出力が見つかったら、それをコピーし、入力 Assembly-CSharp.dll
の元の場所に戻ります。
保護されていない Assembly-CSharp.dll
を、Dotfuscator の出力からコピーした保護されているバージョンに置き換えます。
このステップは、Windows ストア プラットフォームではスキップされます。
6. アプリの保護されているバージョンのビルド
Assembly-CSharp.dll
の保護されているバージョンをビルドしたので、次に、それを使用するアプリ全体をビルドする必要があります。
方法については、以下に示すプラットフォーム固有のセクションを参照してください。
- iOS 固有のセクションに掲載されている XCode プロジェクトのビルド
- Android 固有のセクションに掲載されている APK のビルドと署名
- Windows 固有のセクションに掲載されている Appx のビルド
このステップは、スタンドアロン プラットフォームではスキップされます。
7. アプリの動作確認
保護を追加したアプリの動作を確認するため、お使いのコンピューター、デバイス、またはエミュレーターでそのアプリを試用します。 問題が発生する場合は、おそらく、ライブラリ モードで行われる以上の名前変更の対象除外を追加する必要があるということです。 名前変更の対象除外を特定するワークフローの詳細については、保護の対象除外のページを参照してください。
8. 保護の強化
現在、アプリは基本的な保護機能を備えており、以下の手順に従うことにより、保護の強度を高めることができます。
ライブラリ モードの無効化
まず、Dotfuscator で、Assembly-CSharp.dll
のライブラリ モードを無効にする必要があります。
このステップにより、アセンブリの難読化がより強力になります。
Dotfuscator Professional では、アセンブリの横のプラス(+)記号をクリックすると、オプションが展開されます。 次に、[ライブラリ モードで実行する]のチェックをオフにして、ライブラリ モードを無効にします。 Dotfuscator Community を使用している場合は、アセンブリをクリックし、右側の[プロパティ]セクションにある[ライブラリ モード]のチェックをオフにします。
名前変更の対象除外の追加
ライブラリ モードを無効にすることで保護を強化できますが、それにより、除外しなければならない対象が除外されなくなります。そのような対象を除外するために、特定の除外規則を追加する必要があります。
Dotfuscator Professional での名前変更の詳細については、以下を参照してください。
Dotfuscator Community での名前変更の詳細については、以下を参照してください。
全プラットフォームにおける対象除外
以下の対象は除外する必要があります。
- すべてのパブリック型
- すべての Start() メソッド
- Update() や FixedUpdate() など、更新に関係するすべてのメソッド
- OnEnable()、OnTriggerEnter()、OnTriggerExit() など、イベント時に実行されるすべてのメソッド
この対象除外を行った後で、明示的に除外されなかったすべてのパブリック メソッドの名前が変更されます。これは、ライブラリ モードを有効にしたときより保護が強化されることになります。 対象除外を追加するには、下記の手順を実行します。 手順を実行し終わると、[名前の変更]タブ ページは次のようになります。
必要な名前変更の対象除外を追加するには
- [型の追加]ボタンを押して型の規則を追加し、その名前を
*
に設定します。 - その型に対し、[属性指定子]で
+public
属性を選択します。 これにより、アセンブリからすべてのパブリック型が除外されます。 - [型の追加]ボタンを押してもう 1 つ型の規則を追加し、その名前を
*
に設定します。 - この型の[型を除外する]チェック ボックスをオフにします。
- 追加した型を右クリックし、[メソッドの追加]を選択します。 このステップをもう 2 回繰り返します。これにより、型に 3 つのメソッドがリストされます。
- メソッドをクリックし、それぞれの名前を
Start
、On.*
、.*Update
に設定します。 名前は正規表現として解釈されるので、上に挙げたすべてのメソッドが対象となります。 具体的には、.*Update
は Update() メソッドと FixedUpdate() メソッドの両方に当てはまります。
これを確認するには、メソッドを選択して[プレビュー]を押します。 左側の入力のツリー ビューで、上記の型が両方とも強調表示されます。
これらの対象除外規則は Space Shooter アプリに重要なだけでなく、独自のアプリを Unity でビルドするときに、名前の変更対象からの除外が可能であると同時に必要でもあります。 独自のアプリに必要な追加の名前変更対象除外を特定、構成する手順については、名前変更の対象除外を特定する全体のワークフローを参照してください。
プロジェクトのスクリプトを書くとき、すべてのメソッドが名前を変更できるわけではないということに留意する必要があります。 重要なコードは、除外する必要のあるメソッドから遠ざけて、簡単に見つけられないようにしてください。
Windows ストアを対象プラットフォームとしている場合は、Windows ストア固有の対象除外を参照してください。
スタンドアロン プラットフォームの詳細
Dotfuscator の入力
スタンドアロン プラットフォームの場合は、Dotfuscator の入力として Assembly-CSharp.dll を追加する必要があります。
Space Shooter の例の場合は、この DLL は C:\Unity\SpaceShooter\Builds\Standalone\SpaceShooter_Data\Managed
ディレクトリにあります。
iOS プラットフォームの詳細
以下の手順ではユーザーが Windows 版 Unity を使用していることを想定していますが、Mac 版 Unity を使用している場合でも、すべてのステップはほぼ同じです。
Unity の構成設定
プラットフォームとスクリプト バックエンドを設定した後、アプリをテストするデバイス用にビルドを構成することも必要です。 Player Settings ウィンドウで、スクリプト バックエンドが設定された[Configuration]セクションの下方にある[Target SDK]を、アプリケーションのテスト対象に応じて "Simulator SDK" または "Device SDK" のいずれかに変更します。
Dotfuscator の入力
iOS プラットフォームの場合は、Dotfuscator の入力として Assembly-CSharp.dll を追加する必要があります。
Space Shooter の例の場合は、この DLL は C:\Unity\SpaceShooter\Builds\iOS\Data\Managed
にあります。
XCode プロジェクトのビルド
Unity により生成される XCode プロジェクトを使用して、実際の iOS アプリをビルドできます。
XCode プロジェクトをビルドする前に、保護されているバージョンの Assembly-CSharp.dll に対して事前コンパイラ(Ahead-of-Time Compilation)つまり AOT を使用することで、C:\Unity\SpaceShooter\Builds\iOS\Libraries
にある Assembly-CSharp.dll.s
を更新する必要があります。
Assembly-CSharp.dll.s の互換バージョンを作成するには
- Unity に付属する mono-xcompiler ツールを探します。
- Windows で Unity を使用している場合には、このツールは通常、
C:\Program Files\Unity\Editor\Data\PlaybackEngines\iOSSupport\Tools\Win\mono-xcomiler.exe
となります。 後続の手順では、Windows に Unity がインストールされているものとします。 - Mac で Unity を使用している場合には、"mono-xcompiler" は通常、
/Applications/Unity/PlaybackEngines/iOSSupport/Tools/OSX/mono-xcompiler
となり、下記とほぼ同じ手順を実行できます。 ただし、手順 3 では、SETX
の代わりにexport
を使用する必要があることに注意してください。
- Windows で Unity を使用している場合には、このツールは通常、
- Unity プロジェクトのディレクトリ(
C:\Unity\SpaceShooter\Builds\iOS
)で新しいコマンド プロンプトを開きます。 - mono-xcompiler を次のように実行します。
SETX MONO_PATH "Data\Managed" SETX GAC_PATH "Data\Managed" "C:\Program Files\Unity\Editor\Data\PlaybackEngines\iOSSupport\Tools\Win\mono-xcompiler.exe" --aot=full,static,nodebug,asmonly,outfile="Libraries/Assembly-CSharp.dll.s" "Data/Managed/Assembly-CSharp.dll"
- 新しい
Assembly-CSharp.dll.s
がC:\Unity\SpaceShooter\Builds\iOS\Libraries
にあることを確認します。
XCode プロジェクトをビルドできるようにするには、新しいバージョンの Assembly-CSharp.dll
が存在する C:\Unity\SpaceShooter\Builds\iOS\
ディレクトリを Mac にコピーする必要があります。
C:\Unity\SpaceShooter\Builds\iOS\
にある Unity-iPhone.xcodeproj
という名前の XCode プロジェクトを開きます。
XCode により、"Update to recommended settings" と提案されても、更新しないでください。 この例の場合、更新するとアプリが動作しなくなる可能性があります。
XCode プロジェクトをビルドします。これにより、デバイスまたはエミュレーターでアプリをテストすることで、Space Shooter が予期したとおりに動作するかどうかを確認できます。
Android プラットフォームの詳細
Unity の構成設定
Build Settings ウィンドウの[Player Settings]ボタンをクリックして、Player Settings ウィンドウを開きます。
Player Settings ウィンドウは、通常の Unity ウィンドウの右側に表示されます。
Player Settings ウィンドウで、[Identification]セクション(スクリプト バックエンドを設定した[Configuration]セクションの上にあります)の[Bundle Identifier]を com.Company.SpaceShooter
に設定します。
次に、Player Settings の上部で、[Company Name]を "Company" に、[Product Name]を "SpaceShooter" にそれぞれ変更します。
Dotfuscator の入力
Assembly-CSharp.dll にアクセスするには、Unity で生成された APK を逆コンパイルする必要があります。
Apktool のインストール ページにある手順を使用して、Apktool をダウンロードし、セットアップします。
APK がセットアップされたディレクトリ C:\Unity\SpaceShooter\Builds\Android
でコマンド プロンプトを開いて、次のコマンドを実行します。
apktool d SpaceShooter.apk
これにより、Assembly-CSharp.dll が C:\Unity\SpaceShooter\Builds\Android\SpaceShooter\assets\bin\Data\Managed
に格納されます。
APK のビルドと署名
保護されていないアセンブリを保護されているアセンブリに置き換えた後で、後者のアセンブリを使用して APK をリビルドし、再署名する必要があります。
- 古い APK を名前変更または削除します。
コマンド プロンプト ウィンドウで、APK を逆コンパイルした場所から次のコマンドを実行して APK をリビルドします。
apktool b SpaceShooter -o SpaceShooter.apk
キーストアと jarsigner ツールを使用してアプリに署名します。 これを行う方法がわからない場合、このサンプルプロジェクトでは次のコマンドを入力すれば行えます。
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
設定したパスワードを思い出すと共に、プロジェクトに適切な値を入力します。
次のコマンドを実行して APK に署名します。
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore SpaceShooter.apk alias_name
このコマンドの完了後、Android デバイスまたはエミュレーターに APK をインストールし、Space Shooter アプリを試用して、その動作を確認することができます。
Windows ストア プラットフォームの詳細
Unity でのビルド
Windows ストア プラットフォームの場合は、[Build]ボタンを使用する代わりに[Build and Run]ボタンを使用します。 これを行うことで、Dotfuscator に使用される入力が作成されるため、Appx をビルドするのに Visual Studio を手動で開く必要がなくなります(Visual Studio でビルドしたい場合はそうすることもできます)。
Dotfuscator の入力
Unity でアプリケーションをビルド、実行すると、入力がディレクトリ C:\Unity\SpaceShooter\Builds\Windows\SpaceShooter\bin\x86\Master\AppX
に作成されます。
自分で Visual Studio を使ってビルドした場合、AppX
ディレクトリは、プロジェクトのビルドに使用した構成に基づいて、同様の場所に配置されます。
この入力を追加する手順については、Windows ストア入力のページを参照してください。
Assembly-CSharp.dll 以外のすべてのアセンブリについて、アセンブリを右クリックして[パッケージからアセンブリを除外する]を選択することで、パッケージから除外します。 除外したすべてのアセンブリが[パッケージの成果物]に表示されます。
Dotfuscator の構成
Windows ストア プラットフォームで Universal 10 SDK を使用する場合は、追加の構成設定が必要になります。
[設定]タブで、構成プロパティ ilreader.alias_system_runtime.never
を値 0
で追加します。
構成プロパティを追加する方法の詳細については、プロパティ セクションを参照してください。
Appx のビルド
以下のソリューションより永続的なソリューションについては、Dotfuscator を Appx ビルドに統合する方法に関するこちらの記事を参照してください。
開発中の Windows ストア アプリの保護をテストするには
Dotfuscator からの出力を基に Appx をビルドするには、まず MakeAppx ツールを見つけます。このツールは通常、C:\Program Files (x86)\Windows Kits\10\bin\x86\makeappx.exe
などの場所にあります。
続いて、コマンド プロンプトを開き、次のコマンドを実行します。
"C:\Program Files (x86)\Windows Kits\10\bin\x86\makeappx.exe" pack /d "C:\Unity\SpaceShooter\Builds\Windows\Dotfuscated" /p "C:\Unity\SpaceShooter\Builds\Windows\Space_Shooter.appx" /l
これにより、Appx が C:\Unity\SpaceShooter\Builds\Windows
ディレクトリに保存されます。
メモ:Appx に割り当てファイルを含めないでください。
Appx への署名
次のステップは、Appx に署名することで、Appx をインストールしてテストできるようにすることです。 このステップの詳細については、Microsoft のドキュメントを参照してください。
次に、SignTool を使用し、証明書を使ってアプリケーションに署名します。
Appx のインストール
テストする Appx をインストールするには、管理者 PowerShell コマンド プロンプトで次のコマンドを実行します。
add-appxpackage -path "C:\Unity\SpaceShooter\Builds\Windows\Space_Shooter.appx"
Windows ストア固有の対象除外
Windows ストア プラットフォーム アプリでは、他のプラットフォームでは必要のないいくつかの名前変更を対象から除外する必要があります。
以下の対象除外を追加する必要があります。
- すべての型
- 名前空間
UnityEngine.Internal
の Assembly-CSharp.dll - 名前空間
UnityEngine.Internal.Types
の Assembly-CSharp.dll
すべての型を除外するには
*
という名前で作成した型の規則を選択します。- [型を除外する]チェック ボックスをオンにします。
名前変更の対象除外に名前空間を追加するには
- 左側のツリー ビューで
C:\Unity\SpaceShooter\Builds\Windows\SpaceShooter\bin\x86\Master\AppX
ノードを展開し、次にその下位の Assembly-CSharp.dll を展開して、さらにその下位の Assembly-CSharp.dll を展開します。 - このノードの下部に、除外する必要のある 2 つの名前空間があります。これらの名前空間を除外するには、対応するチェック ボックスをオンにします。
参考文献
上記の Unity の手順で言及されている必要な設定が見つからなかった場合は、Unity Manual を参照してください。
上記の手順では名前変更の対象除外を中心に説明しましたが、Dotfuscator では名前変更以外の保護も提供しています。 アプリに使用可能なその他すべての保護については、Professional のドキュメントと Community のドキュメントで確認、探求してください。
Dotfuscator チームは常に、Dotfuscator による保護機能を向上させるための新機能の追加と、構成プロセスの簡易化を図っています。 Dotfuscator のダウンロード ページにアクセスして、Dotfuscator バージョンを最新の状態に保つようにしてください。 アナウンスやその他の情報については、弊社のブログをご覧いただくと共に Twitter アカウント、@PreEmptiveをフォローしてください。