ソリューション概要
セキュリティと実行効率向上のため、現在市場のUnityゲームの多くはC#ベースのmonoを廃止し、NativeコードベースのIl2cppへ移行しています。Nativeコードはクラックのハードルを上げますが、チート開発者はIl2cppDumperツールを使用し、ゲーム内のglobal-metadata.datファイルを利用してlibil2cpp.soの全シンボル情報と文字列情報を復元することが可能です。「il2cpp」「クラック」などのキーワードで検索すれば大量のチュートリアルが見つかります。
Il2cppDumperというクラックツールに対抗するため、シェルバージョン2.6でglobal-metadata.datハードニング機能をリリースしました。追加操作なしで自動的にil2cppゲームのハードニングを行い、クラックのハードルを著しく向上させます。現在バージョン2.6では10種以上の人気モバイルゲームが導入済みで、データ異常はありません。
さらにglobal-metadata.datハードニング効果を高めるため、本プラットフォームではglobal-metadata.datランタイム復号機能を提供しています。既存のglobal-metadata.datハードニング機能に基づき、一部の重要データに対して二重暗号化を行い、ゲーム実行中もglobal-metadata.datが暗号状態を維持することを保証します。ユーザーはlibil2cpp.soとペアで生成されるsymbolファイルを提供するだけでこの機能を有効にできます。
注意事項
- ランタイム復号機能を使用するにはlibil2cpp.soのシンボルテーブルが必要です。ハードニングにはil2cppエンジン関数のアドレスのみが必要であり、ゲーム本体ロジックに関連するあらゆる関数は関与しません。
- ランタイム復号機能が対応しているUnityバージョンは以下の通りです。ハードニング時にUnityバージョンを自動認識して処理します。バージョンが合致しない場合は本機能を使用できません。
| Unityバージョン | 対応状況 | Unityバージョン | 対応状況 |
|---|---|---|---|
| 5.3.x | × | 2017.4.x | ○ |
| 5.4.x | × | 2018.1.x | ○ |
| 5.5.x | ○ | 2018.2.x | ○ |
| 5.6.x | ○ | 2018.3.x | ○ |
| 2017.1.x | ○ | 2018.4.x | ○ |
| 2017.2.x | ○ | 2019.1.x | ○ |
| 2019.2.x | ○ | 2020.2.0-2020.2.19 | ○ |
| 2019.3.x | ○ | 2020.2.20- | ○ |
| 2019.4.x | ○ | 2021.x | × |
| 2020.1.x | ○ |
- ハードニング完了後、通常のゲームプレイの中で十分にゲーム機能テストを実施し、各機能が正常に動作することを確認してください。
使用方法
有効化方法
ランタイム復号機能を使用するには以下の2つのステップが必要です:
tpshell-config.xmlで最低バージョンを設定します:3.3.0.17246.oversea。同時にenable_globalmetadata_enc、enc_entire_globalmetadataを有効にします。
xml<TPVersion>3.3.0.17246.oversea</TPVersion> <!--Encryption configuration for globalmetadata--> <EncSo>libil2cpp.so</EncSo> <extparams>{ "enable_globalmetadata_enc":true, "enc_entire_globalmetadata":true} </extparams>コマンドラインツール実行時に-sパラメータを追加し、APK/AAB用のsymbols.zipファイルを指定します。symbols.zipファイルについてはsymbols.zipファイルフォーマットおよび生成方法をご参照ください。
bash# APKコマンドラインツールハードニング呼び出し方法 ClientConsole.exe -d <gameId> <apkpath> <outDir> <certPath> -c <configPath> -s <symbolpath> # AABコマンドラインツールハードニング呼び出し方法 ClientConsole.exe -a <gameId> <aabPath> <outDir> <certPath> -c <configPath> -s <symbolpath>
コマンドラインハードニングツールはglobal-metadata.datランタイム復号機能をサポートしています。詳細な使用方法についてはコマンドラインハードニングツールガイドをご参照ください。
無効化方法
コマンドラインツール実行時に-sパラメータを削除すると、デフォルトでglobal-metadata.datランタイム復号機能が無効になり、global-metadata.datファイル暗号化のみが実行されます。
検証方法
16進エディタでハードニング後のglobal-metadata.datファイルを開き、最初の4バイトが95 43 72 11または94 43 72 11でかつゲームが正常に動作していれば、ランタイム復号機能が有効になっていることを示します。下図をご参照ください。

symbols.zipファイルフォーマットおよび生成方法
symbols.zipファイルフォーマット
symbols.zipファイルフォーマットは下図の通りです。ルートディレクトリ配下にapkの各アーキテクチャディレクトリがあり、各アーキテクチャディレクトリ内には対応するアーキテクチャのlibil2cpp.symファイルが含まれています(異なるバージョンで生成されるsymファイル名は異なるため、使用時にはファイル名を統一してlibil2cpp.symとしてください)。

symbols.zipファイル生成方式
Unityバージョンによってsymbols.zipファイルの生成方式が異なります。サポートされているUnityバージョンには3種類の生成方法があり、symbols.zipファイル生成方法対応表を参照してください。生成されたlibil2cpp.sym.so、libil2cpp.so.sym、libil2cpp.so.debugはすべて直接libil2cpp.symにリネームしても問題ありません(ハードニングに影響はありません)。以下の通りです:
| Unityバージョン | symbols.zipファイル生成方式 |
|---|---|
| 5.5.x (5.5.0 ~ 5.5.6) | 方法その3 |
| 5.6.x (5.6.0 ~ 5.6.4) | 方法その3 |
| 2017 (2017.1.0 ~ 2017.1.2) | 方法その3 |
| 2017 (2017.1.3 ~ 2017.4.40) | 方法その1 |
| 2018 (2018.1.0 ~ 2018.4.12) | 方法その1 |
| 2018 (2018.4.13 ~ 2018.4.32) | 方法その2 |
| 2019 (2019.1.0 ~ 2019.2.10) | 方法その1 |
| 2019 (2019.2.11 ~ 2019.4.21) | 方法その2 |
| 2020 (2020.1.0 ~ 2020.2.20) | 方法その2 |
- 方法その1:Build完了後にapkと一緒にsymbols.zipファイルが生成されます。

- 方法その2:先に「Create symbols.zip」オプションにチェックを入れる必要があります。Build完了後にapkと一緒にsymbols.zipファイルが生成されます。

- 方法その3:プロジェクトを開いたままの状態で、Temp\StagingArea\libsディレクトリ配下からlibil2cpp.so.debugを見つけ、フォーマット要件に従って手動でsymbols.zipを生成します。

ハードニング効果
ハードニング前に16進エディタでglobal-metadata.datファイルを開いた結果は下図の通りです。

ハードニング後に16進エディタでglobal-metadata.datファイルを開いた結果は下図の通りです。

メモリからダンプしたglobal-metadata.datファイルを16進エディタで開いた結果は下図の通りです。

上記のハードニング結果比較からわかるように、メモリからダンプしたglobal-metadata.datファイルはファイルヘッダーがすでに復号されていますが、一部のデータは依然として暗号状態にあります。Il2cppDumperで処理した場合、global-metadata.datファイルとlibil2cpp.soファイルで異常が発生します。下図をご参照ください。

Unityバージョン互換性テスト
| Unityバージョン | 対応可否 | Unityバージョン | 対応可否 |
|---|---|---|---|
| 5.5.0 | ○ | 2018.4.31 | ○ |
| 5.5.6 | ○ | 2019.1.0 | ○ |
| 5.6.0 | ○ | 2019.3.0 | ○ |
| 5.6.7 | ○ | 2019.3.6 | ○ |
| 2017.1.0 | ○ | 2019.3.7 | ○ |
| 2017.4.15 | ○ | 2019.4.10 | ○ |
| 2017.4.40 | ○ | 2019.4.11 | ○ |
| 2018.1.0 | ○ | 2019.4.14 | ○ |
| 2018.2.20 | ○ | 2019.4.15 | ○ |
| 2018.3.1 | ○ | 2019.4.20 | ○ |
| 2018.4.20 | ○ | 2020.1.0 | ○ |
| 2018.4.27 | ○ | 2020.1.17 | ○ |
互換性テスト
- 大規模モバイルゲーム2作品、Top 100端末テスト通過
- 異なるUnityバージョンのデモ、Top 300端末テスト通過
パフォーマンステスト
あるモバイルゲームのlibil2cpp.soサイズは103MB、global-metadata.datサイズは30.1MBです。Pixel 3XLとNexus 5デバイスでのメモリ使用量は以下の通りです。
| テスト端末 | システムバージョン | テストタイプ | 1回目 | 2回目 | 3回目 |
|---|---|---|---|---|---|
| Pixel 3 XL | Android 10.0 | so・datともにハードニング | 328MB | 327MB | 329MB |
| Pixel 3 XL | Android 10.0 | soハードニング・dat非ハードニング | 323MB | 323MB | 324MB |
| Pixel 3 XL | Android 10.0 | so・datともに非ハードニング | 285MB | 285MB | 285MB |
| Nexus 5 | Android 5.1 | so・datともにハードニング | 293MB | 291MB | 292MB |
| Nexus 5 | Android 5.1 | soハードニング・dat非ハードニング | 283MB | 284MB | 283MB |
| Nexus 5 | Android 5.1 | so・datともに非ハードニング | 248MB | 243MB | 245MB |