リソース解析について学ぶ – Unity AssetBundleを例に

コラム概要

■こんな方におすすめ:

  • リソース解析への対策について知りたい
  • アプリの開発/技術担当の方
  • リソース解析への対策について知りたい
  • アプリの開発/技術担当の方

■難易度:★★☆

■ポイント:

  • リソース情報(Unity AssetBundleなど)は攻撃者により解析/抽出される恐れがある。
  • 暗号化などの手法によりある程度解析を防ぐことができる。
  • より高度な解析については更なる対策が必要。

1. はじめに

ゲームアプリには画像や音楽などのリソースが不可欠です。これらのリソースは可能な限り、ゲーム上でのみ閲覧できるものにしたいとお考えだと思います。
しかし、世の中には様々な手段を用いてリソースを解析し、画像や音楽を抽出する者も存在します。
今回のコラムでは、リソース解析による影響とリソース解析への対処法をUnity AssetBundleを例に説明します。

なお、本コラムでのリソース解析とはアプリ内に存在するリソースを抽出し解析することを指すものとします。

2. 基礎 – Unity AseetBundleについて

様々なゲームエンジンでリソースを使用することはできますが、今回は筆者の個人的な判断でUnity AssetBundleをリソース管理に使用します。まず、簡単にUnity AssetBundleについて説明します。

AssetBundleとはUnityにおいてリソースを読み込む際に使用できる手法の1つです。
アプリとリソースを分割できるため、リソースをWebサーバー上に配置して必要な時に差し替えることが可能な他、
アプリ自体のサイズを削減することが可能です。そのため、ソーシャルゲームなど大量のリソースを必要とするアプリに便利な機能です。

このAssetBundleはあくまでリソース管理方法の1つであり、リソースのダウンロード手法などは各開発者に委ねられていましたが、Unity 2018.2よりAddressable Asset Systemという機能が追加され、現在ではAssetBundleのダウンロードや依存関係の解決などを簡単に行うことができるようになりました。

AssetBundleの便利な部分として、アプリ自体に画像を組み込む必要がなく、またAssetBundleという独自の形式に変換されている点が挙げられます。これにより、アプリを解凍すれば簡単に画像が抜き出されるというような事態を避けられます。

3. 実演 – リソースの解析とは

ですが、有名なエンジンであるが故に解析対象となりやすいことも事実です。
まず、表示した画像のAssetBundleはキャッシュに残るためAndroid端末から抜き出すことが可能です。

 (図1:Android端末内キャッシュに存在するAssetBundleデータ)

そして抜き出したAssetBundleを解析すると……

(図2:図1のAssetBundleデータを解析ソフトに入力した結果)

ゲーム画面で表示していたものと同じ画像を閲覧・出力することが可能です。
勿論誰でも解析できるわけではありません。
しかし、知識を持つ悪意ある人物により、本来ゲーム上でしか閲覧させたくないリソースが公開されるリスクが存在します。

4. 対策 – リソース解析への対策とは

さて、ここまでの内容で「やはり悪意のある解析は防ぎたい」とお思いの方もおられるかと思います。
そのような方向けに、対策方法について検討していきましょう。

4-1. リソース解析への対策とは – 概論

そもそも、解析をされないためにはどのような手段が考えられるでしょうか。まず考えられるのは、「そもそもリソースファイルを抽出されないようにする」だと思います。
例えば全てのリソースをWEBサーバーに配置し、リソースが必要になった時だけダウンロードして不要になったら即時に削除するという手法を取れば、リソース解析への対策という面では効果的かもしれません。

しかし、この方法では画面が遷移する度に大量のリソースをダウンロードする必要があるため、リソースを保存するサーバーに多大な負荷がかかりますし、ゲームユーザーとしても通信量が多すぎるゲームは敬遠したくなるでしょう。

リソース解析対策は単にやればよいというものではなく、対策方法がゲームのパフォーマンスに影響を与えないか
という点まで考える必要があります。

それではパフォーマンスへの影響が小さく、かつ解析をされない方法とはなんでしょうか。
答えは「リソースファイルを抽出されてもファイルが何かわからないようにする(暗号化)」だと私は考えます。

例えばあるリソースファイルのビットを全て反転させるだけでも一目には何のファイルだったかはわからなくなると思います。そしてそのリソースファイルを読み込むときにビットをもう一度反転させてしまえば、ゲーム上では元々のリソースと差異はありません。
さらに暗号化が効果的な点は、複数の暗号を組み合わせることができるという点です。元々エンジンに付属の暗号化に独自の暗号化を重ね掛けすることで、より解析は困難になるでしょう。

4-2. リソース解析への対策とは – Unity AssetBundleの場合

さて、それではUnity AssetBundleにおける暗号化を検討してみましょう。

1.AssetBundle自体を暗号化し、AssetBundleをロード前に復号する。

 (図3:AssetBundle自体を暗号化するイメージ)

AssetBundleそのものを暗号化する方法です。
端末上のキャッシュでは暗号化されたままのファイルなのでリソースを抜き出されるリスクを低減することができますが、AssetBundleの形式ではなくなるためダウンロードを自作する必要があります。
結果として、Addressable Asset Systemを使用できなくなるため、どうしてもリソースを暗号化したいという場合に使う方法だと思われます。

2.AssetBundleの中身だけを暗号化し、AssetBundleをロード時に復号する。

 (図4:AssetBundleの中身を暗号化するイメージ)

AssetBundleの中身だけを暗号化する方法です。
AssetBundleの形式はそのままなのでAddressable Asset Systemを使用してAssetBundleをダウンロードすることができます。メモリ上に展開されてから実際に画像を表示するまでの間に復号してしまうことで、ゲーム上でのみ復号後の画像を見ることができます。
ただし、暗号化の関係からGameObjectとしてではなくTextAssetとして読み込むなどの手段が必要になります。
これらの対策により、リソースファイルは容易に解析されなくなるでしょう。

ですが、暗号化されたファイルをどうにかして復号しようと試みる者が出現する場合もあります。
そうして暗号化が解かれてしまった場合は、また新しい暗号化を検討し、場合によってはより複雑な暗号化を導入することになります。
暗号化とは常に暗号化を突破しようとする者たちとのいたちごっこだと言えます。また、何重にも複雑な暗号化を施した場合、今度は復号に時間がかかりすぎてゲームパフォーマンスに影響が出てしまいます。
解析対策はもちろん重要ですが、やはりゲームのパフォーマンスを一番に考え、どの程度なら影響が出ないか、どの程度なら解析として効果があるのか、というバランスを常に考える必要があります。

5. まとめ

今回はUnity AssetBundleを例にリソース解析を取り上げましたが、どのようなリソース管理においても基本は同じです。

  • セキュリティを求める場合、ゲームエンジン固有のリソース管理方法に加え独自の暗号化を混ぜることでより強固にリソースを保護できる。
  • とはいえ暗号化を突破しようとする者が現れればいたちごっことなる。
  • セキュリティだけでなくゲームパフォーマンスとのバランスを考える。

上記ポイントを踏まえ、どのようにリソースを管理していくべきか考える必要があるでしょう。

6. 参考

①Addressables を使用してコンテンツ管理を簡略化する
https://forpro.unity3d.jp/unity_pro_tips/2020/06/09/1252/

②【Unite 2018 Tokyo】
 そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
https://www.slideshare.net/UnityTechnologiesJapan/unite-2018-tokyo-96499382/UnityTechnologiesJapan/unite-2018-tokyo-96499382