はじめに
今回はAssetStudio
というツールを利用して、AssetBundle
を抽出&解析してみるという記事になります。
あんまり深く掘っていくとグレーな予感がしてきますが、逆に開発者にとってもこういった危険性があるのだと認識していただければ幸いです。
またAsset Studio
の利用は全て自己責任でお願いします。悪用はしないようにしてください。
概要
AssetStudio
は以下のように説明されています。
None of the repo, the tool, nor the repo owner is affiliated with, or sponsored or authorized by, Unity Technologies or its affiliates.
AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles.
AssetStudio
はAsset
やAssetBundles
を探索・抽出・エクスポートするためのツールです。
またUnity Technologies
と一切関係ないよと強調されていましたね。
対応しているUnityのバージョンは3.4 ~ 2021.2
らしいです。
Support version:
3.4 - 2021.2
加えて対応しているアセットの種類は以下の通りで、結構幅広いですね。
Support asset types:
Texture2D : convert to png, tga, jpeg, bmp
Sprite : crop Texture2D to png, tga, jpeg, bmp
AudioClip : mp3, ogg, wav, m4a, fsb. support convert FSB file to WAV(PCM)
Font : ttf, otf
Mesh : obj
TextAsset
Shader
MovieTexture
VideoClip
MonoBehaviour : json
Animator : export to FBX file with bound AnimationClip
環境
Windows10
Unity 2020.3.32f1
AssetStudio.net472.v0.16.40
インストール
以下のRelease
ページから一番新しいzip
ファイル(私の場合はAssetStudio.net472.v0.16.40.zip
)をダウンロードして、解凍します。
github.com
下準備
解析するためのAssetBundle
を生成します。
まずは実験対象として以下のファイルを用意しました。
- Animation Clip
- Audio Clip (mp3)
- Text Asset (json, txt)
- Video Clip (mp4)
- Shader
- Texture2D, Sprite (png)
後はビルドを行います。
public class CreateAssetBundles { [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { string assetBundleDirectory = "Assets/AssetBundles"; if(!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory(assetBundleDirectory); } BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } }
ビルドされたファイル群
AssetBundles |--- AssetBundles |--- AssetBundles.manifest |--- sample |--- sample.manifest
最後にWindows StandAlone
でビルドを行いました。
使い方
AssetStudioGUI.exe
を起動します。
左上のFile/Load file
(Load folder
なら中のファイルを全部走査してくれる)を選択し、対象のAsset Bundle
を選択します。
ちなみにローカルからAssetBundle
を読み込む実装をしている場合には、たいていStreamingAssets
の中にAssetBundle
が含まれています。
// Windows StandAloneの場合 . |--- ○○_Data |--- StreamingAssets |--- AssetBundles |--- AssetBundles.manifest |--- sample |--- sample.manifest
このsample
をLoad
してみると・・・。
ちゃんと中身が見れていますね。画像のプレビューとかは分かりますが、なんならAudioClip
の再生機能までありました。
また上記の方法でAssetBundle
を生成するとLZMA
形式の圧縮がされていたはずですが、普通に見れるようです。
対象ファイルをエクスポート
対象のファイルを選択し、Export/All asset
を押すことでエクスポートすることができます。
ひとこと
今回はローカルにあるAssetBundle
を対象としていましたが、サーバーからダウンロードするタイプでもいくらでも中身を見る手法はあります。
あんまり書くと怒られそうですが、リモートからダウンロードしたAssetBundle
は結局ローカルに保存されることが多いですし、なんならダウンロード先のURLを調べることができればAssetBundle
を取ってこれます。
またURLから予想して、まだ正式に公開されていないAssetBundle
を・・・なんてことも不可能ではありません。
逆に開発者側の視点に立つならば、URLを予想できないようにしたり、AssetBundle
の中身を暗号化 or AssetBundle
自体を暗号化するなどの対策が考えられます。